jaz-cli 2.7.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/assets/skills/api/SKILL.md +1 -1
  2. package/assets/skills/conversion/SKILL.md +1 -1
  3. package/assets/skills/jobs/SKILL.md +104 -0
  4. package/assets/skills/jobs/references/audit-prep.md +319 -0
  5. package/assets/skills/jobs/references/bank-recon.md +234 -0
  6. package/assets/skills/jobs/references/building-blocks.md +135 -0
  7. package/assets/skills/jobs/references/credit-control.md +273 -0
  8. package/assets/skills/jobs/references/fa-review.md +267 -0
  9. package/assets/skills/jobs/references/gst-vat-filing.md +250 -0
  10. package/assets/skills/jobs/references/month-end-close.md +308 -0
  11. package/assets/skills/jobs/references/payment-run.md +246 -0
  12. package/assets/skills/jobs/references/quarter-end-close.md +268 -0
  13. package/assets/skills/jobs/references/supplier-recon.md +330 -0
  14. package/assets/skills/jobs/references/year-end-close.md +341 -0
  15. package/assets/skills/transaction-recipes/SKILL.md +1 -1
  16. package/dist/__tests__/jobs-audit-prep.test.js +125 -0
  17. package/dist/__tests__/jobs-bank-recon.test.js +108 -0
  18. package/dist/__tests__/jobs-credit-control.test.js +98 -0
  19. package/dist/__tests__/jobs-fa-review.test.js +104 -0
  20. package/dist/__tests__/jobs-gst-vat.test.js +113 -0
  21. package/dist/__tests__/jobs-month-end.test.js +162 -0
  22. package/dist/__tests__/jobs-payment-run.test.js +106 -0
  23. package/dist/__tests__/jobs-quarter-end.test.js +155 -0
  24. package/dist/__tests__/jobs-supplier-recon.test.js +115 -0
  25. package/dist/__tests__/jobs-validate.test.js +181 -0
  26. package/dist/__tests__/jobs-year-end.test.js +149 -0
  27. package/dist/commands/jobs.js +184 -0
  28. package/dist/index.js +2 -0
  29. package/dist/jobs/audit-prep.js +211 -0
  30. package/dist/jobs/bank-recon.js +163 -0
  31. package/dist/jobs/credit-control.js +126 -0
  32. package/dist/jobs/fa-review.js +121 -0
  33. package/dist/jobs/format.js +102 -0
  34. package/dist/jobs/gst-vat.js +187 -0
  35. package/dist/jobs/month-end.js +232 -0
  36. package/dist/jobs/payment-run.js +199 -0
  37. package/dist/jobs/quarter-end.js +135 -0
  38. package/dist/jobs/supplier-recon.js +132 -0
  39. package/dist/jobs/types.js +36 -0
  40. package/dist/jobs/validate.js +115 -0
  41. package/dist/jobs/year-end.js +153 -0
  42. package/dist/types/index.js +2 -1
  43. package/package.json +1 -1
@@ -0,0 +1,246 @@
1
+ # Payment Run (Bulk Bill Payments)
2
+
3
+ Process outstanding supplier bills in a structured batch. A payment run typically happens weekly or fortnightly — you identify what's due, group by supplier, approve the batch, and record the payments. This keeps supplier relationships healthy and avoids late payment penalties.
4
+
5
+ **CLI:** `jaz jobs payment-run [--due-before 2025-02-28] [--json]`
6
+
7
+ ---
8
+
9
+ ## Phase 1: Identify Outstanding Bills
10
+
11
+ ### Step 1: List all unpaid bills
12
+
13
+ Pull every posted bill with an outstanding balance:
14
+
15
+ ```
16
+ POST /api/v1/bills/search
17
+ {
18
+ "filter": {
19
+ "status": { "eq": "POSTED" },
20
+ "balanceAmount": { "gt": 0 }
21
+ },
22
+ "sort": { "sortBy": ["dueDate"], "order": "ASC" },
23
+ "limit": 1000
24
+ }
25
+ ```
26
+
27
+ **What you get:** All unpaid bills sorted by due date (earliest first). Each result includes `balanceAmount` (remaining unpaid), `totalAmount` (original), `dueDate`, and contact details.
28
+
29
+ ### Step 2: Filter by due date
30
+
31
+ If `--due-before` is specified, narrow to bills due on or before that date:
32
+
33
+ ```
34
+ POST /api/v1/bills/search
35
+ {
36
+ "filter": {
37
+ "status": { "eq": "POSTED" },
38
+ "balanceAmount": { "gt": 0 },
39
+ "dueDate": { "lte": "2025-02-28" }
40
+ },
41
+ "sort": { "sortBy": ["dueDate"], "order": "ASC" },
42
+ "limit": 1000
43
+ }
44
+ ```
45
+
46
+ **Tip:** Include bills due in the next 7 days beyond your cutoff — paying a few days early is better than missing one because it was due the day after your run.
47
+
48
+ ---
49
+
50
+ ## Phase 2: Group and Summarize
51
+
52
+ ### Step 3: Group by supplier
53
+
54
+ Organize the bills by `contactResourceId`. For each supplier, summarize:
55
+
56
+ - Number of bills
57
+ - Total amount due
58
+ - Earliest due date
59
+ - Currency (important for FX payments)
60
+
61
+ **Why group:** Suppliers prefer a single consolidated payment over multiple small ones. It also reduces bank transaction fees for the payer.
62
+
63
+ ### Step 4: Generate AP aging for context
64
+
65
+ ```
66
+ POST /api/v1/generate-reports/ap-report
67
+ { "endDate": "2025-02-28" }
68
+ ```
69
+
70
+ **What to check:**
71
+ - Total AP aging should match the sum of all unpaid bills from Step 1
72
+ - Identify any bills in the 60d+ aging buckets — these are overdue and may need priority payment or dispute resolution
73
+ - Flag disputed bills (do NOT include them in the payment run)
74
+
75
+ ---
76
+
77
+ ## Phase 3: Select and Approve
78
+
79
+ ### Step 5: Build the payment batch
80
+
81
+ Select which bills to pay. Three common approaches:
82
+
83
+ **All-due:** Pay everything due on or before the cutoff date. Simplest, works for most SMBs.
84
+
85
+ **Priority-based:** Pay overdue first (60d+, then 30d+), then current. Useful when cash is tight.
86
+
87
+ **Supplier-based:** Pay strategic suppliers first (sole suppliers, key relationships), then others. Business judgment call.
88
+
89
+ **Before proceeding:** Confirm cash availability. Check the bank balance:
90
+
91
+ ```
92
+ POST /api/v1/generate-reports/bank-balance-summary
93
+ { "primarySnapshotDate": "2025-02-28" }
94
+ ```
95
+
96
+ If total payments exceed available cash, prioritize and defer the rest to the next run.
97
+
98
+ ---
99
+
100
+ ## Phase 4: Record Payments
101
+
102
+ ### Step 6: Record payment for each bill
103
+
104
+ For each bill in the approved batch, record the payment:
105
+
106
+ ```
107
+ POST /api/v1/bills/{billResourceId}/payments
108
+ {
109
+ "payments": [{
110
+ "paymentAmount": 5350.00,
111
+ "transactionAmount": 5350.00,
112
+ "accountResourceId": "<bank-account-uuid>",
113
+ "paymentMethod": "BANK_TRANSFER",
114
+ "reference": "PAYRUN-2025-02-28-001",
115
+ "valueDate": "2025-02-28"
116
+ }]
117
+ }
118
+ ```
119
+
120
+ **CRITICAL field notes:**
121
+ - `paymentAmount` — The amount leaving the bank account (bank currency)
122
+ - `transactionAmount` — The amount applied to the bill balance (bill currency). Same as `paymentAmount` for same-currency. Different for FX (see below).
123
+ - `accountResourceId` — The bank account UUID (NOT the expense account)
124
+ - `paymentMethod` — Use `"BANK_TRANSFER"` for electronic payments. Other options: `"CHEQUE"`, `"CASH"`, `"CREDIT_CARD"`, `"E_WALLET"`
125
+ - `reference` — Use a consistent naming convention (e.g., `PAYRUN-{date}-{seq}`)
126
+ - `valueDate` — The date the payment is made (YYYY-MM-DD format)
127
+
128
+ Always wrap in `{ "payments": [...] }` even for a single payment.
129
+
130
+ **Note:** There is no batch payment endpoint yet. Each bill requires an individual `POST /bills/{id}/payments` call. If you're paying 50 bills, that's 50 API calls. The batch endpoint is planned but not yet available.
131
+
132
+ ### Step 7: Partial payments
133
+
134
+ If paying less than the full balance (e.g., cash constraints or instalment arrangement), set `paymentAmount` and `transactionAmount` to the partial amount. The bill remains in `POSTED` status with a reduced `balanceAmount`.
135
+
136
+ ```
137
+ POST /api/v1/bills/{billResourceId}/payments
138
+ {
139
+ "payments": [{
140
+ "paymentAmount": 2000.00,
141
+ "transactionAmount": 2000.00,
142
+ "accountResourceId": "<bank-account-uuid>",
143
+ "paymentMethod": "BANK_TRANSFER",
144
+ "reference": "PAYRUN-2025-02-28-PARTIAL",
145
+ "valueDate": "2025-02-28"
146
+ }]
147
+ }
148
+ ```
149
+
150
+ ---
151
+
152
+ ## Phase 5: FX Payments
153
+
154
+ **Conditional:** Only if paying bills in a non-base currency.
155
+
156
+ ### Step 8: Record FX payment
157
+
158
+ When paying a foreign currency bill from a base currency bank account (e.g., paying a USD bill from an SGD account):
159
+
160
+ ```
161
+ POST /api/v1/bills/{billResourceId}/payments
162
+ {
163
+ "payments": [{
164
+ "paymentAmount": 6750.00,
165
+ "transactionAmount": 5000.00,
166
+ "accountResourceId": "<sgd-bank-account-uuid>",
167
+ "paymentMethod": "BANK_TRANSFER",
168
+ "reference": "PAYRUN-2025-02-28-FX",
169
+ "valueDate": "2025-02-28"
170
+ }]
171
+ }
172
+ ```
173
+
174
+ Here `paymentAmount` is 6,750 SGD (what left the bank) and `transactionAmount` is 5,000 USD (what was applied to the bill). The platform calculates the implied exchange rate and posts any FX gain/loss automatically.
175
+
176
+ **Tip:** Check the actual bank debit amount against your bank statement. Banks often add a spread to the exchange rate — the SGD amount debited may differ from what you'd calculate using the mid-market rate.
177
+
178
+ ---
179
+
180
+ ## Phase 6: Verification
181
+
182
+ ### Step 9: Verify AP aging reflects the payments
183
+
184
+ ```
185
+ POST /api/v1/generate-reports/ap-report
186
+ { "endDate": "2025-02-28" }
187
+ ```
188
+
189
+ **What to check:**
190
+ - Total AP should be reduced by the sum of all payments made
191
+ - Bills that were fully paid should no longer appear in the aging
192
+ - Partially paid bills should show the correct reduced balance
193
+
194
+ ### Step 10: Verify bank balance
195
+
196
+ ```
197
+ POST /api/v1/generate-reports/bank-balance-summary
198
+ { "primarySnapshotDate": "2025-02-28" }
199
+ ```
200
+
201
+ **What to check:**
202
+ - Bank balance should be reduced by the total payment amount
203
+ - Cross-reference to the actual bank statement to confirm all payments cleared
204
+
205
+ ---
206
+
207
+ ## Payment Run Checklist (Quick Reference)
208
+
209
+ | # | Step | Phase | Conditional |
210
+ |---|------|-------|-------------|
211
+ | 1 | List unpaid bills | Identify | Always |
212
+ | 2 | Filter by due date | Identify | If --due-before specified |
213
+ | 3 | Group by supplier | Summarize | Always |
214
+ | 4 | Generate AP aging | Summarize | Always |
215
+ | 5 | Build payment batch | Select | Always |
216
+ | 6 | Record each payment | Pay | Always |
217
+ | 7 | Partial payments | Pay | If cash constraints |
218
+ | 8 | FX payments | Pay | If multi-currency bills |
219
+ | 9 | Verify AP aging | Verify | Always |
220
+ | 10 | Verify bank balance | Verify | Always |
221
+
222
+ ---
223
+
224
+ ## Payment Method Options
225
+
226
+ | Method | When to Use | Code |
227
+ |--------|-------------|------|
228
+ | Bank transfer | Most common for SMBs — GIRO, FAST, wire | `BANK_TRANSFER` |
229
+ | Cheque | Decreasing usage but some suppliers still require it | `CHEQUE` |
230
+ | Cash | Petty cash payments, small amounts | `CASH` |
231
+ | Credit card | Corporate card payments | `CREDIT_CARD` |
232
+ | E-wallet | GrabPay, PayNow for business | `E_WALLET` |
233
+
234
+ ---
235
+
236
+ ## Tips for SMBs
237
+
238
+ **Run payments on a schedule.** Weekly (Friday) or fortnightly. Predictable payment cycles help with cash flow planning and reduce the "can you pay this urgently" interruptions.
239
+
240
+ **Use payment terms strategically.** If a supplier offers 2% 10 Net 30 (2% discount for paying within 10 days), that's equivalent to a 36% annualized return. Take early payment discounts when cash allows.
241
+
242
+ **Keep a buffer.** Don't pay everything that's due if it drains the account. Always maintain a cash buffer of at least 2 weeks of operating expenses.
243
+
244
+ **Payment reference convention:** Use a consistent format like `PAYRUN-YYYY-MM-DD-SEQ` so payments are easy to trace in both your books and the bank statement. This makes bank reconciliation much easier downstream.
245
+
246
+ **Approval workflow:** For SMBs with multiple signatories, build the payment list first, get approval, then execute. Don't record payments in Jaz until the actual bank transfer is initiated.
@@ -0,0 +1,268 @@
1
+ # Quarter-End Close
2
+
3
+ The quarterly close builds on the monthly close. It is month-end close repeated three times, plus a set of quarterly-specific adjustments that only make sense at three-month intervals. For most SMBs, this adds half a day to a day of extra work on top of the regular month-end.
4
+
5
+ **CLI:** `jaz jobs quarter-end --period 2025-Q1 [--currency SGD] [--json]`
6
+
7
+ **Standalone vs Incremental:**
8
+ - **Standalone (default):** Generates the full plan — all monthly close steps for each of the three months in the quarter, followed by the quarterly extras. Use this when months haven't been closed yet.
9
+ - **Incremental (`--incremental`):** Generates only the quarterly extras below. Use this when all three months are already closed and locked.
10
+
11
+ ---
12
+
13
+ ## Phase 1–5: Monthly Close (x3)
14
+
15
+ Complete the full month-end close for each month in the quarter. Each month follows the same 5-phase, 18-step process.
16
+
17
+ **Reference:** `references/month-end-close.md`
18
+
19
+ | Quarter | Month 1 | Month 2 | Month 3 |
20
+ |---------|---------|---------|---------|
21
+ | Q1 (Jan–Mar) | January close | February close | March close |
22
+ | Q2 (Apr–Jun) | April close | May close | June close |
23
+ | Q3 (Jul–Sep) | July close | August close | September close |
24
+ | Q4 (Oct–Dec) | October close | November close | December close |
25
+
26
+ **Important:** Close months in order. Month 1 must be locked before starting Month 2, and Month 2 before Month 3. The quarterly extras run after Month 3 is closed.
27
+
28
+ ---
29
+
30
+ ## Phase 6: Quarterly Extras
31
+
32
+ These steps run once per quarter, after all three months are closed. They address items that are reviewed less frequently or that accumulate over the quarter.
33
+
34
+ ### Step Q1: GST/VAT filing preparation
35
+
36
+ Generate the tax ledger for the full quarter and reconcile input/output tax for filing.
37
+
38
+ ```
39
+ POST /generate-reports/vat-ledger
40
+ { "startDate": "2025-01-01", "endDate": "2025-03-31" }
41
+ ```
42
+
43
+ **What to do:**
44
+ 1. Pull the quarterly tax ledger report
45
+ 2. Review output tax (GST on sales) — verify every taxable invoice is included and the correct tax code was applied
46
+ 3. Review input tax (GST on purchases) — verify every claimable bill is included, no blocked input tax claimed
47
+ 4. Identify discrepancies — missing invoices/bills, wrong tax codes, exempt items coded as taxable
48
+ 5. Cross-reference totals to the GST return form
49
+
50
+ **For Singapore (IRAS):**
51
+ - Quarterly filing (standard GST-registered businesses)
52
+ - File via myTax Portal within one month after quarter end
53
+ - Box 1 (Total Sales): total revenue incl. zero-rated and exempt
54
+ - Box 6 (Output Tax): from tax ledger output tax total
55
+ - Box 7 (Input Tax): from tax ledger input tax total (net of blocked items)
56
+
57
+ **For Philippines (BIR):**
58
+ - Monthly VAT return (BIR Form 2550M) for each month in the quarter
59
+ - Quarterly VAT return (BIR Form 2550Q) for the full quarter
60
+ - Input VAT carried forward if excess over output VAT
61
+ - File within 25 days after the close of the taxable quarter
62
+
63
+ **Verification:** Output tax per tax ledger should equal sum of GST on all sales invoices for the quarter. Input tax per tax ledger should equal sum of GST on all purchase bills (excluding blocked items). Any difference = data entry error to investigate.
64
+
65
+ **See also:** `references/gst-vat-filing.md` for the full GST/VAT filing job.
66
+
67
+ ### Step Q2: ECL / bad debt provision — formal review
68
+
69
+ The monthly close includes a quick bad debt check (Step 13). The quarterly review is the formal one — full aged receivables analysis with loss rates applied.
70
+
71
+ **Recipe:** `bad-debt-provision` | **Calculator:** `jaz calc ecl`
72
+
73
+ **Step-by-step:**
74
+
75
+ 1. Pull the AR aging report as at quarter-end:
76
+ ```
77
+ POST /generate-reports/ar-report
78
+ { "endDate": "2025-03-31" }
79
+ ```
80
+
81
+ 2. Categorize receivables into aging buckets (current, 30d, 60d, 90d, 120d+)
82
+
83
+ 3. Apply historical loss rates to each bucket:
84
+ ```bash
85
+ jaz calc ecl --current 100000 --30d 50000 --60d 20000 --90d 10000 --120d 5000 --rates 0.5,2,5,10,50
86
+ ```
87
+
88
+ 4. Compare the calculated provision to the existing Allowance for Doubtful Debts balance on the trial balance
89
+
90
+ 5. Post an adjustment journal for the difference:
91
+ ```
92
+ POST /journals
93
+ {
94
+ "valueDate": "2025-03-31",
95
+ "reference": "QE-ECL-Q1-25",
96
+ "journalEntries": [
97
+ { "accountResourceId": "<bad-debt-expense>", "amount": 1250.00, "type": "DEBIT", "name": "ECL provision adjustment — Q1 2025" },
98
+ { "accountResourceId": "<allowance-doubtful-debts>", "amount": 1250.00, "type": "CREDIT", "name": "ECL provision adjustment — Q1 2025" }
99
+ ]
100
+ }
101
+ ```
102
+
103
+ **Note:** If the required provision has decreased, reverse the direction (DR Allowance, CR Bad Debt Expense). Some firms use a separate recovery account for write-backs.
104
+
105
+ **Conditional:** Always perform the formal review at quarter-end, even if the monthly quick checks showed no change. Document the analysis — auditors will ask for it.
106
+
107
+ ### Step Q3: Bonus accrual true-up
108
+
109
+ Review quarterly bonus obligations and adjust the accrual if estimates have changed.
110
+
111
+ **Recipe:** `employee-accruals` (bonus component)
112
+
113
+ During monthly closes, you accrue a fixed monthly estimate (1/12 of expected annual bonus). At quarter-end, re-assess whether the estimate is still accurate based on actual performance.
114
+
115
+ **Step-by-step:**
116
+
117
+ 1. Verify three months of bonus accruals exist. Search for journals in the Employee Benefits capsule:
118
+ ```
119
+ POST /journals/search
120
+ {
121
+ "filter": {
122
+ "valueDate": { "between": ["2025-01-01", "2025-03-31"] }
123
+ },
124
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
125
+ "limit": 100
126
+ }
127
+ ```
128
+ Filter results by capsule or reference prefix (e.g., "BONUS-ACCR") to isolate bonus entries.
129
+
130
+ 2. Sum the year-to-date accrual and compare to the revised full-year estimate
131
+
132
+ 3. If the estimate has changed, post a true-up journal:
133
+ ```
134
+ POST /journals
135
+ {
136
+ "valueDate": "2025-03-31",
137
+ "reference": "QE-BONUS-Q1-25",
138
+ "journalEntries": [
139
+ { "accountResourceId": "<bonus-expense>", "amount": 2000.00, "type": "DEBIT", "name": "Bonus accrual true-up — Q1 2025" },
140
+ { "accountResourceId": "<bonus-liability>", "amount": 2000.00, "type": "CREDIT", "name": "Bonus accrual true-up — Q1 2025" }
141
+ ]
142
+ }
143
+ ```
144
+
145
+ **Conditional:** Only if the business has bonus schemes. Most SMBs with 5+ employees and a performance bonus structure should review quarterly. If no change to estimate, document the review but skip the journal.
146
+
147
+ ### Step Q4: Intercompany reconciliation
148
+
149
+ If the business operates multiple entities (e.g., SG parent + PH subsidiary), reconcile intercompany balances and post settlement journals.
150
+
151
+ **Recipe:** `intercompany`
152
+
153
+ **Step-by-step:**
154
+
155
+ 1. Pull the trial balance for each entity and isolate intercompany receivable/payable accounts:
156
+ ```
157
+ POST /generate-reports/trial-balance
158
+ { "startDate": "2025-01-01", "endDate": "2025-03-31" }
159
+ ```
160
+
161
+ 2. Verify that Entity A's intercompany receivable = Entity B's intercompany payable (and vice versa). Differences indicate:
162
+ - Transactions recorded in one entity but not the other
163
+ - Timing differences (one entity booked end-of-quarter, the other booked beginning of next)
164
+ - FX differences if the entities operate in different currencies
165
+
166
+ 3. Post matching journals in both entities to clear discrepancies
167
+
168
+ 4. If settling (netting off balances), post settlement journals:
169
+ ```
170
+ POST /journals
171
+ {
172
+ "valueDate": "2025-03-31",
173
+ "reference": "QE-IC-SETTLE-Q1-25",
174
+ "journalEntries": [
175
+ { "accountResourceId": "<intercompany-payable>", "amount": 15000.00, "type": "DEBIT", "name": "IC settlement — Entity A, Q1 2025" },
176
+ { "accountResourceId": "<bank-account>", "amount": 15000.00, "type": "CREDIT", "name": "IC settlement — Entity A, Q1 2025" }
177
+ ]
178
+ }
179
+ ```
180
+
181
+ **Conditional:** Only if multi-entity. Single-entity SMBs skip this entirely.
182
+
183
+ ### Step Q5: Provision unwinding
184
+
185
+ If IAS 37 provisions exist (e.g., restoration obligations, warranty provisions, legal claims), post the quarterly discount unwinding journal.
186
+
187
+ **Recipe:** `provisions` | **Calculator:** `jaz calc provision`
188
+
189
+ Provisions measured at present value must have the discount unwound each period, recognizing the time value of money as a finance cost.
190
+
191
+ ```bash
192
+ jaz calc provision --amount 500000 --rate 4 --term 60 --start-date 2025-01-01 --json
193
+ ```
194
+
195
+ The calculator generates the unwinding schedule. Post the quarterly entry:
196
+
197
+ ```
198
+ POST /journals
199
+ {
200
+ "valueDate": "2025-03-31",
201
+ "reference": "QE-PROV-UNWIND-Q1-25",
202
+ "journalEntries": [
203
+ { "accountResourceId": "<finance-cost>", "amount": 4975.00, "type": "DEBIT", "name": "Provision discount unwinding — Q1 2025" },
204
+ { "accountResourceId": "<provision-liability>", "amount": 4975.00, "type": "CREDIT", "name": "Provision discount unwinding — Q1 2025" }
205
+ ]
206
+ }
207
+ ```
208
+
209
+ **Conditional:** Only if IAS 37 provisions exist with a discounting component. Most simple SMBs won't have these. Common in businesses with lease restoration obligations or long-term warranty commitments.
210
+
211
+ ---
212
+
213
+ ## Phase 7: Quarterly Verification
214
+
215
+ Run the standard period verification (see `references/building-blocks.md` — Period Verification Pattern) for the full quarter, plus these quarterly-specific checks.
216
+
217
+ ### Standard verification (full quarter)
218
+
219
+ ```
220
+ POST /generate-reports/trial-balance
221
+ { "startDate": "2025-01-01", "endDate": "2025-03-31" }
222
+ ```
223
+
224
+ ```
225
+ POST /generate-reports/profit-and-loss
226
+ { "primarySnapshotDate": "2025-03-31", "secondarySnapshotDate": "2025-01-01" }
227
+ ```
228
+
229
+ ```
230
+ POST /generate-reports/balance-sheet
231
+ { "primarySnapshotDate": "2025-03-31" }
232
+ ```
233
+
234
+ ### Quarterly-specific checks
235
+
236
+ **GST reconciliation:**
237
+ - Tax ledger output tax total = sum of GST on all sales invoices for Q1
238
+ - Tax ledger input tax total = sum of GST on all purchase bills (less blocked items) for Q1
239
+ - Net GST payable/refundable per tax ledger matches the amount on the GST return form
240
+ - If you already filed monthly VAT returns (PH), quarterly total should equal sum of the three monthly returns
241
+
242
+ **ECL provision balance:**
243
+ - Allowance for Doubtful Debts on the balance sheet matches the calculated ECL from Step Q2
244
+ - Bad Debt Expense on the P&L is reasonable relative to revenue
245
+
246
+ **Intercompany balance check (if multi-entity):**
247
+ - Entity A's intercompany receivable = Entity B's intercompany payable
248
+ - Net intercompany position across all entities = zero (eliminates on consolidation)
249
+
250
+ **Bonus accrual reasonableness:**
251
+ - Bonus Liability on the balance sheet = (monthly accrual x months elapsed) + any true-ups
252
+ - Bonus Expense on the P&L is proportional to the period (e.g., Q1 = ~25% of full-year estimate)
253
+
254
+ ---
255
+
256
+ ## Quarter-End Close Checklist (Quick Reference)
257
+
258
+ | # | Step | Phase | Conditional | Recipe/Calc |
259
+ |---|------|-------|-------------|-------------|
260
+ | 1–18 | Month 1 close (all steps) | Monthly | Always | See month-end-close.md |
261
+ | 1–18 | Month 2 close (all steps) | Monthly | Always | See month-end-close.md |
262
+ | 1–18 | Month 3 close (all steps) | Monthly | Always | See month-end-close.md |
263
+ | Q1 | GST/VAT filing preparation | Quarterly | Always (if GST-registered) | gst-vat-filing job |
264
+ | Q2 | ECL / bad debt provision review | Quarterly | Always | bad-debt-provision / `jaz calc ecl` |
265
+ | Q3 | Bonus accrual true-up | Quarterly | If bonus schemes exist | employee-accruals |
266
+ | Q4 | Intercompany reconciliation | Quarterly | If multi-entity | intercompany |
267
+ | Q5 | Provision unwinding | Quarterly | If IAS 37 provisions exist | provisions / `jaz calc provision` |
268
+ | V | Quarterly verification | Verification | Always | — |