# Phase 2 Journal Runbook

> Status: draft. এই নথি operational guidance; এটি merge approval বা accountant sign-off নয়।

## নিরাপদ demo প্রস্তুতি

`accounting-phase2-demo` slug-সহ আলাদা demo company এবং তার active maker আগে তৈরি করুন। তারপর কেবল demo/local database-এ চালান:

```bash
php artisan db:seed --class="Modules\\Accounting\\Database\\Seeders\\Phase2AccountantDemoSeeder"
```

Seeder শুধু একটি balanced **Draft** তৈরি করে (`DEMO-P2-NORMAL-001`)। এটি কোনো flag চালু করে না, voucher দেয় না, approval বা post করে না। একই command আবার চালালেও দ্বিতীয় journal হবে না।

## Accountant demo script

1. Draft খুলে line দুটো মিলান: Office Expense debit 10,000 BDT, Cash credit 10,000 BDT।
2. Submit করুন; approver-কে pending request দেখান।
3. Approver comment দিয়ে Reject করুন; maker amount বা narration ঠিক করে পুনরায় Submit করুন।
4. Approver Approve করলে authorized poster Post করবেন। সফল হলে voucher, `posted_at`, poster এবং status history দেখান।
5. Posted journal ভুল হলে reversal তৈরি করুন। পুরোনো journal edit নয়; reversal post হলে original `reversed` হয় এবং দুই journal link থাকে।

এই branch-এ submit/approve/post-এর public route ও dedicated posting/voucher service পাওয়া না গেলে ধাপ 2–5 চালাবেন না। Merge checklist-এ এটি blocker হিসেবে লিখুন; database row সরাসরি বদলে demo pass দেখানো নিষিদ্ধ।

## Post ব্যর্থ হলে

1. response-এর `correlation_id` লিখে রাখুন এবং সেই id দিয়ে application log খুঁজুন।
2. transaction rollback হয়েছে কি না যাচাই করুন: journal এখনও `approved`, `posted_at`/`voucher_no` null, status history-তে `post` row নেই।
3. ওই company/fiscal-year/series-এর `acc_voucher_counters.last_no` আগের মানে আছে কি না দেখুন। ব্যর্থ Post counter খরচ করতে পারবে না।
4. ব্যর্থতার ধাপ (period, account validation, counter, DB guard) ও correlation id incident record-এ লিখুন। DB-তে journal status বা counter হাতে ঠিক করবেন না।

## Voucher-এ গর্ত সন্দেহ হলে

একই company, fiscal year ও series ধরে `acc_voucher_counters.last_no`-র সঙ্গে posted journal-এর সর্বোচ্চ parsed voucher sequence মিলান। `acc_journals`-এর `uq_acc_journals_company_voucher` একই voucher পুনরায় হওয়া আটকায়; এটি gap-এর কারণ ব্যাখ্যা করে না। Format change বা fiscal-year boundary আলাদা করে যাচাই করুন। mismatch হলে posting বন্ধ রেখে correlation id সহ finance lead-কে জানান।

## আটকে থাকা approval

`monitor_approval_stuck_days` পেরোনো `acc_approval_requests.status = pending` request খুঁজুন। request, journal, current level, maker, expected approver, বয়স এবং correlation id নোট করুন। প্রথমে assigned approver ও Head of Finance-কে জানান।

- কোনো decision না হলে maker Withdraw করে Draft-এ নিতে পারে।
- Post-পূর্ব সমস্যা হলে authorized approver/poster Return করে Rejected-এ পাঠাতে পারে।
- জরুরি exception হলে শুধু authorized non-maker override করবে; reason বাধ্যতামূলক এবং পরে review বাধ্যতামূলক।

## Delegation ও override review

Delegation তৈরির আগে delegator, delegate, `valid_from`, `valid_to` নিশ্চিত করুন। মেয়াদ শেষ হলে এটি approval eligibility-তে ব্যবহার হবে না; প্রয়োজন শেষ হলে end action দিয়ে বন্ধ করুন।

Head of Finance নিয়মিত `acc_approval_override_reviews`-এ review-হীন override দেখবেন, evidence দেখে accepted/rejected outcome ও comment লিখবেন। Override নিজে review করা যাবে না।

## Database safety

- Production-এ accounting guard trigger-এর `down()` চালাবেন না।
- Posted/reversed journal এবং journal lines সরাসরি SQL দিয়ে edit/delete করবেন না।
- সব query company-scoped রাখুন; অন্য company-র data দিয়ে তদন্ত করবেন না।
