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,250 @@
1
+ # GST/VAT Filing Preparation
2
+
3
+ Prepare your GST/VAT return by generating the tax ledger, reviewing output and input tax, identifying errors, and producing the filing summary. This job does NOT file the return for you — it produces the numbers and supporting detail you need to file accurately via IRAS myTax Portal (SG) or the equivalent authority.
4
+
5
+ **CLI:** `jaz jobs gst-vat --period 2025-Q1 [--json]`
6
+
7
+ ---
8
+
9
+ ## Background: SG GST Basics
10
+
11
+ | Item | Detail |
12
+ |------|--------|
13
+ | **Current rate** | 9% (effective Jan 1, 2024) |
14
+ | **Filing frequency** | Quarterly (most SMBs) or monthly (if approved) |
15
+ | **Due date** | 1 month after the end of the quarter (e.g., Q1 Jan-Mar due Apr 30) |
16
+ | **Return form** | GST F5 (standard) or GST F7 (group registration) |
17
+ | **Penalty** | 5% surcharge on unpaid tax + $200/month late filing penalty |
18
+
19
+ **Tax codes in Jaz (SG defaults):**
20
+
21
+ | Code | Description | Rate |
22
+ |------|-------------|------|
23
+ | SR | Standard-Rated Supplies (output tax) | 9% |
24
+ | TX | Taxable Purchases (input tax) | 9% |
25
+ | ZR | Zero-Rated Supplies | 0% |
26
+ | ES | Exempt Supplies | 0% |
27
+ | OS | Out-of-Scope Supplies | 0% |
28
+ | EP | Exempt Purchases | 0% |
29
+ | IM | Import of Goods (subject to GST) | 9% |
30
+
31
+ ---
32
+
33
+ ## Phase 1: Generate the Tax Ledger
34
+
35
+ The tax ledger is your primary working paper. It lists every transaction that has a tax component.
36
+
37
+ ### Step 1: Generate tax ledger for the quarter
38
+
39
+ ```
40
+ POST /api/v1/generate-reports/vat-ledger
41
+ { "startDate": "2025-01-01", "endDate": "2025-03-31" }
42
+ ```
43
+
44
+ **What you get:** Every invoice, bill, credit note, and journal with a tax profile attached — grouped by tax code, showing gross amount, tax amount, and net amount.
45
+
46
+ ### Step 2: Export for offline review (optional)
47
+
48
+ ```
49
+ POST /api/v1/data-exports/vat-ledger
50
+ { "startDate": "2025-01-01", "endDate": "2025-03-31" }
51
+ ```
52
+
53
+ This gives you the Excel/CSV version for spreadsheet review.
54
+
55
+ ---
56
+
57
+ ## Phase 2: Review Output Tax (Sales GST Collected)
58
+
59
+ Output tax is the GST you charged customers on your sales. This is what you owe IRAS.
60
+
61
+ ### Step 3: Cross-reference invoices to tax ledger
62
+
63
+ ```
64
+ POST /api/v1/invoices/search
65
+ {
66
+ "filter": {
67
+ "status": { "eq": "POSTED" },
68
+ "valueDate": { "between": ["2025-01-01", "2025-03-31"] }
69
+ },
70
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
71
+ "limit": 1000
72
+ }
73
+ ```
74
+
75
+ **What to check:**
76
+ - Total standard-rated sales (SR) on the tax ledger matches total invoiced amount at 9%
77
+ - Zero-rated sales (ZR) have proper documentation (export evidence, international service proof)
78
+ - Exempt sales (ES) are correctly classified (financial services, residential property, etc.)
79
+ - Customer credit notes are deducted from output tax (they reduce your GST liability)
80
+
81
+ ### Step 4: Check for missing tax profiles
82
+
83
+ Look for invoices with no tax profile — these won't appear on the tax ledger and could mean under-declared output tax.
84
+
85
+ ```
86
+ POST /api/v1/cashflow-transactions/search
87
+ {
88
+ "filter": {
89
+ "businessTransactionType": { "eq": "SALE" },
90
+ "valueDate": { "between": ["2025-01-01", "2025-03-31"] }
91
+ },
92
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
93
+ "limit": 1000
94
+ }
95
+ ```
96
+
97
+ Compare the count and total to the invoices search above. Discrepancies may indicate missing tax codes.
98
+
99
+ ---
100
+
101
+ ## Phase 3: Review Input Tax (Purchases GST Paid)
102
+
103
+ Input tax is the GST you paid on business purchases. This is what you can claim back from IRAS.
104
+
105
+ ### Step 5: Cross-reference bills to tax ledger
106
+
107
+ ```
108
+ POST /api/v1/bills/search
109
+ {
110
+ "filter": {
111
+ "status": { "eq": "POSTED" },
112
+ "valueDate": { "between": ["2025-01-01", "2025-03-31"] }
113
+ },
114
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
115
+ "limit": 1000
116
+ }
117
+ ```
118
+
119
+ **What to check:**
120
+ - Total taxable purchases (TX) on the tax ledger matches total bills with 9% GST
121
+ - Supplier credit notes are deducted from input tax claims
122
+ - No claims on exempt purchases (EP) — these should not have claimable GST
123
+
124
+ ### Step 6: Identify blocked input tax (SG-specific)
125
+
126
+ Certain purchases have GST that CANNOT be claimed even though the supplier charged it. These are "blocked" under the GST Act:
127
+
128
+ | Blocked Category | Examples |
129
+ |-----------------|----------|
130
+ | **Club subscription fees** | Country clubs, social clubs |
131
+ | **Medical/accident insurance** | Employee medical insurance (unless contractual) |
132
+ | **Medical expenses** | GP visits, dental, specialist |
133
+ | **Family benefits** | Housing, school fees, holiday passage |
134
+ | **Motor vehicle expenses** | Purchase, maintenance, fuel for non-commercial vehicles |
135
+ | **Entertainment** | Client entertainment, staff entertainment (> $50/person) |
136
+
137
+ **Conditional:** Only relevant if your business has expenses in these categories. Most SMBs will have at least motor vehicle and entertainment expenses to review.
138
+
139
+ **Action:** Ensure blocked input tax items are coded to a non-claimable tax code (EP or no tax profile), NOT TX. If they're coded as TX, they'll inflate your input tax claim and trigger IRAS scrutiny.
140
+
141
+ ---
142
+
143
+ ## Phase 4: Error Checks
144
+
145
+ ### Step 7: Check for common GST errors
146
+
147
+ Run these checks against your tax ledger data:
148
+
149
+ **1. Zero-rated sales without documentation:**
150
+ - Every ZR sale needs export evidence (bill of lading, airway bill) or proof of international service
151
+ - IRAS can reclassify ZR to SR (9%) on audit if documentation is missing
152
+
153
+ **2. Exempt supplies miscoded as standard-rated:**
154
+ - Financial services, residential rental, sale of residential property are exempt (ES)
155
+ - If coded as SR, you've over-declared output tax and customers were overcharged
156
+
157
+ **3. Input tax claimed on non-business purchases:**
158
+ - Personal purchases through the business account with GST claimed
159
+ - Capital items used partly for non-business purposes (apportion the claim)
160
+
161
+ **4. Timing errors:**
162
+ - Invoice dated in Q1 but goods/services delivered in Q2 (tax point = earlier of invoice date or payment date)
163
+ - Supplier bill received in Q2 but dated Q1 — claim in the quarter of the tax invoice date
164
+
165
+ **5. FX transactions:**
166
+ - GST on FX transactions is calculated on the SGD equivalent at the transaction date rate
167
+ - Verify FX invoices/bills show the correct SGT amount for GST purposes
168
+
169
+ ---
170
+
171
+ ## Phase 5: GST Return Summary
172
+
173
+ ### Step 8: Compile the GST F5 box mapping
174
+
175
+ Map your tax ledger totals to the IRAS GST F5 return boxes:
176
+
177
+ | Box | Description | Source |
178
+ |-----|-------------|--------|
179
+ | **Box 1** | Total value of standard-rated supplies | SR gross amount from tax ledger |
180
+ | **Box 2** | Total value of zero-rated supplies | ZR gross amount from tax ledger |
181
+ | **Box 3** | Total value of exempt supplies | ES gross amount from tax ledger |
182
+ | **Box 4** | Total value of supplies (Box 1 + 2 + 3) | Sum |
183
+ | **Box 5** | Total value of taxable purchases | TX + IM gross amount from tax ledger |
184
+ | **Box 6** | Output tax due (Box 1 x 9%) | SR tax amount from tax ledger |
185
+ | **Box 7** | Input tax and refunds claimed | TX + IM tax amount from tax ledger (minus blocked items) |
186
+ | **Box 8** | Net GST to pay/claim (Box 6 - Box 7) | If positive = pay IRAS. If negative = refund claim. |
187
+
188
+ ### Step 9: Generate supporting reports
189
+
190
+ ```
191
+ POST /api/v1/generate-reports/profit-and-loss
192
+ { "primarySnapshotDate": "2025-03-31", "secondarySnapshotDate": "2025-01-01" }
193
+ ```
194
+
195
+ ```
196
+ POST /api/v1/generate-reports/trial-balance
197
+ { "startDate": "2025-01-01", "endDate": "2025-03-31" }
198
+ ```
199
+
200
+ **What to check:**
201
+ - GST Receivable (input tax) and GST Payable (output tax) accounts on the trial balance should reconcile to your Box 6 and Box 7 amounts
202
+ - Revenue on P&L should be consistent with Box 1 + Box 2 + Box 3 (total supplies)
203
+
204
+ ---
205
+
206
+ ## Phase 6: Export and File
207
+
208
+ ### Step 10: Export the tax ledger for records
209
+
210
+ ```
211
+ POST /api/v1/data-exports/vat-ledger
212
+ { "startDate": "2025-01-01", "endDate": "2025-03-31" }
213
+ ```
214
+
215
+ Keep this export as your supporting workpaper. IRAS can request transaction-level detail on audit.
216
+
217
+ **Filing:** Log into IRAS myTax Portal > GST > File GST Return (F5). Enter the box amounts from Step 8. Submit before the due date.
218
+
219
+ ---
220
+
221
+ ## GST Filing Checklist (Quick Reference)
222
+
223
+ | # | Step | Phase | Conditional |
224
+ |---|------|-------|-------------|
225
+ | 1 | Generate tax ledger | Generate | Always |
226
+ | 2 | Export for offline review | Generate | Optional |
227
+ | 3 | Cross-reference invoices | Output tax | Always |
228
+ | 4 | Check missing tax profiles | Output tax | Always |
229
+ | 5 | Cross-reference bills | Input tax | Always |
230
+ | 6 | Identify blocked input tax | Input tax | If blocked categories exist |
231
+ | 7 | Run error checks | Errors | Always |
232
+ | 8 | Compile F5 box mapping | Summary | Always |
233
+ | 9 | Generate supporting reports | Summary | Always |
234
+ | 10 | Export and file | File | Always |
235
+
236
+ ---
237
+
238
+ ## Common SMB GST Mistakes
239
+
240
+ 1. **Claiming input tax on blocked items** — Motor vehicle fuel and entertainment are the most common. IRAS audits specifically look for these.
241
+
242
+ 2. **Late registration** — If your taxable turnover exceeds $1M in any 12-month period (or you expect it to in the next 12 months), you must register within 30 days. Penalties apply retroactively.
243
+
244
+ 3. **Wrong tax point** — GST is due on the earlier of: invoice date, payment date, or delivery date. Backdating invoices to shift GST to a later quarter is a compliance risk.
245
+
246
+ 4. **Not claiming input tax on imports** — If you import goods and pay GST at customs, you CAN claim this as input tax. Many SMBs forget to include import GST in their returns.
247
+
248
+ 5. **Mixing exempt and taxable supplies** — If you make both exempt and taxable supplies, you must apportion input tax. Only the portion attributable to taxable supplies is claimable. Use the standard method (revenue ratio) unless IRAS has approved a special method.
249
+
250
+ 6. **Filing after the deadline** — Even if you owe nothing, late filing triggers a $200/month penalty. Set a calendar reminder for the 15th of the month after quarter-end to give yourself buffer time.
@@ -0,0 +1,308 @@
1
+ # Month-End Close
2
+
3
+ The monthly close is the foundation of accurate books. For an SMB, this typically takes 1-3 days depending on transaction volume and complexity. Every quarter-end and year-end builds on this.
4
+
5
+ **CLI:** `jaz jobs month-end --period 2025-01 [--currency SGD] [--json]`
6
+
7
+ ---
8
+
9
+ ## Phase 1: Pre-Close Preparation
10
+
11
+ Before adjusting anything, ensure the raw data is complete. These are verification steps — you're checking, not creating.
12
+
13
+ ### Step 1: Verify all sales invoices are entered
14
+
15
+ Confirm every invoice issued during the period is in Jaz.
16
+
17
+ ```
18
+ POST /invoices/search
19
+ {
20
+ "filter": { "valueDate": { "between": ["2025-01-01", "2025-01-31"] } },
21
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
22
+ "limit": 1000
23
+ }
24
+ ```
25
+
26
+ **What to check:** Compare the count and total against your sales records or POS system. Missing invoices = understated revenue.
27
+
28
+ ### Step 2: Verify all purchase bills are entered
29
+
30
+ Confirm every bill received during the period is in Jaz. For SMBs, this is the most common gap — bills arrive late or sit in someone's inbox.
31
+
32
+ ```
33
+ POST /bills/search
34
+ {
35
+ "filter": { "valueDate": { "between": ["2025-01-01", "2025-01-31"] } },
36
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
37
+ "limit": 1000
38
+ }
39
+ ```
40
+
41
+ **What to check:** Cross-reference against email, supplier portals, and physical mail. Late bills → missed expenses → overstated profit.
42
+
43
+ **Tip:** If you have the bill document but haven't entered it yet, use **Jaz Magic** (`POST /magic/createBusinessTransactionFromAttachment`) — upload the PDF/JPG and let extraction & autofill handle it.
44
+
45
+ ### Step 3: Complete bank reconciliation
46
+
47
+ This is the single most important pre-close step. Every bank account must be reconciled to its statement closing balance.
48
+
49
+ ```
50
+ POST /bank-records/{accountResourceId}/search
51
+ {
52
+ "filter": { "status": { "eq": "UNRECONCILED" } },
53
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
54
+ "limit": 1000
55
+ }
56
+ ```
57
+
58
+ **What to check:**
59
+ - All unreconciled items are genuine timing differences (outstanding cheques, deposits in transit)
60
+ - No items older than 30 days (investigate and resolve)
61
+ - Book balance per Jaz matches bank statement closing balance
62
+
63
+ **See also:** `references/bank-recon.md` for the full bank reconciliation catch-up job.
64
+
65
+ ### Step 4: Review AR aging
66
+
67
+ Identify overdue customer invoices. This feeds into credit control and bad debt assessment.
68
+
69
+ ```
70
+ POST /generate-reports/ar-report
71
+ { "endDate": "2025-01-31" }
72
+ ```
73
+
74
+ **What to check:**
75
+ - Total AR ties to Accounts Receivable on trial balance
76
+ - Flag invoices overdue > 30/60/90 days
77
+ - Consider bad debt provision if material (→ Phase 3)
78
+
79
+ ### Step 5: Review AP aging
80
+
81
+ Identify upcoming and overdue supplier payments. This feeds into payment planning.
82
+
83
+ ```
84
+ POST /generate-reports/ap-report
85
+ { "endDate": "2025-01-31" }
86
+ ```
87
+
88
+ **What to check:**
89
+ - Total AP ties to Accounts Payable on trial balance
90
+ - Identify bills due in the next 7-14 days for the payment run
91
+ - Flag any disputed or held bills
92
+
93
+ ---
94
+
95
+ ## Phase 2: Accruals & Adjustments
96
+
97
+ Record transactions that belong to this period but aren't yet in the books. This is where recipes come in.
98
+
99
+ ### Step 6: Record accrued expenses
100
+
101
+ Expenses incurred but not yet billed (utilities, professional services, cleaning, etc.). The most common month-end adjustment for SMBs.
102
+
103
+ **Recipe:** `accrued-expenses`
104
+ **Pattern:** DR Expense, CR Accrued Liabilities → reverse on Day 1 of next month
105
+
106
+ ```
107
+ POST /journals
108
+ {
109
+ "valueDate": "2025-01-31",
110
+ "reference": "ME-ACCR-JAN25",
111
+ "journalEntries": [
112
+ { "accountResourceId": "<expense-account>", "amount": 500.00, "type": "DEBIT", "name": "Electricity accrual — Jan 2025" },
113
+ { "accountResourceId": "<accrued-liabilities>", "amount": 500.00, "type": "CREDIT", "name": "Electricity accrual — Jan 2025" }
114
+ ]
115
+ }
116
+ ```
117
+
118
+ **Conditional:** Only if there are expenses not yet billed for the period. Common examples: utilities, internet, cleaning, accounting fees.
119
+
120
+ ### Step 7: Amortize prepaid expenses
121
+
122
+ If you've set up prepaid expense capsules with schedulers, verify the scheduler fired for this month. If not, post the amortization journal manually.
123
+
124
+ **Recipe:** `prepaid-amortization` | **Calculator:** `jaz calc prepaid-expense`
125
+ **Pattern:** DR Expense, CR Prepaid Asset
126
+
127
+ **Verification:** Search for journals in the prepaid capsule for this period:
128
+ ```
129
+ POST /journals/search
130
+ {
131
+ "filter": {
132
+ "valueDate": { "between": ["2025-01-01", "2025-01-31"] }
133
+ },
134
+ "sort": { "sortBy": ["valueDate"], "order": "DESC" },
135
+ "limit": 100
136
+ }
137
+ ```
138
+
139
+ Filter results by capsule name (e.g., "FY2025 Office Insurance") to confirm the entry exists.
140
+
141
+ ### Step 8: Recognize deferred revenue
142
+
143
+ If you've received upfront payments that should be recognized over time, verify the scheduler fired or post manually.
144
+
145
+ **Recipe:** `deferred-revenue` | **Calculator:** `jaz calc deferred-revenue`
146
+ **Pattern:** DR Deferred Revenue (liability), CR Revenue
147
+
148
+ **Conditional:** Only if your business has subscription or prepaid revenue models.
149
+
150
+ ### Step 9: Record depreciation
151
+
152
+ For fixed assets, record the monthly depreciation charge. Jaz supports straight-line natively via fixed assets. For declining balance or 150DB methods, use the calculator and post manual journals.
153
+
154
+ **Recipe:** `declining-balance` | **Calculator:** `jaz calc depreciation`
155
+ **Pattern:** DR Depreciation Expense, CR Accumulated Depreciation
156
+
157
+ **If using native Jaz FA depreciation:** Verify auto-calculated depreciation is running correctly via the FA register.
158
+ **If using non-standard methods:** Post manual journal from calculator output.
159
+
160
+ ### Step 10: Accrue employee benefits
161
+
162
+ Record monthly leave accrual. If using a scheduler, verify it fired.
163
+
164
+ **Recipe:** `employee-accruals`
165
+ **Pattern:** DR Leave Expense, CR Leave Liability (monthly fixed amount from scheduler)
166
+
167
+ **Conditional:** Only if you track leave balances. Most SMBs with 5+ employees should.
168
+
169
+ ### Step 11: Accrue loan interest
170
+
171
+ If you have bank loans, verify the interest portion of this month's payment is correctly recorded. If payments are embedded in bill/cash-out entries, this may already be handled.
172
+
173
+ **Recipe:** `bank-loan` | **Calculator:** `jaz calc loan`
174
+ **Pattern:** Interest splits from principal in each payment — verify the amortization table matches.
175
+
176
+ **Conditional:** Only if you have active loans. Skip if loan payments are already correctly coded.
177
+
178
+ ---
179
+
180
+ ## Phase 3: Period-End Valuations
181
+
182
+ Adjustments that depend on period-end rates or balances. These are less common for simple SMBs but critical for accuracy.
183
+
184
+ ### Step 12: FX revaluation
185
+
186
+ If your org has foreign currency monetary items (bank accounts, receivables, payables in non-base currency), revalue them at period-end exchange rates.
187
+
188
+ **Recipe:** `fx-revaluation` | **Calculator:** `jaz calc fx-reval`
189
+ **Pattern:** DR/CR FX Unrealized Gain/Loss for the difference between book rate and closing rate. Post a Day 1 reversal.
190
+
191
+ ```bash
192
+ jaz calc fx-reval --amount 50000 --book-rate 1.35 --closing-rate 1.38 --currency USD --base-currency SGD
193
+ ```
194
+
195
+ **Conditional:** Only if multi-currency org with material foreign currency balances. Many SGD-only SMBs can skip this.
196
+
197
+ **Note:** Jaz auto-handles FX on AR/AP (invoices/bills in foreign currency). This step is for non-AR/AP items only (foreign currency bank accounts, deposits, intercompany balances).
198
+
199
+ ### Step 13: Review bad debt provision (ECL)
200
+
201
+ Assess whether the bad debt provision needs adjusting based on the AR aging report from Step 4.
202
+
203
+ **Recipe:** `bad-debt-provision` | **Calculator:** `jaz calc ecl`
204
+ **Pattern:** DR Bad Debt Expense, CR Allowance for Doubtful Debts
205
+
206
+ ```bash
207
+ jaz calc ecl --current 100000 --30d 50000 --60d 20000 --90d 10000 --120d 5000 --rates 0.5,2,5,10,50
208
+ ```
209
+
210
+ **Conditional:** Review monthly, but typically adjust quarterly unless there's a significant change (e.g., major customer default). For most SMBs, a quick mental check is sufficient monthly — formal ECL review in quarter-end.
211
+
212
+ ---
213
+
214
+ ## Phase 4: Verification
215
+
216
+ Run the numbers. Everything should tie.
217
+
218
+ ### Step 14: Review trial balance
219
+
220
+ The master check. Total debits must equal total credits.
221
+
222
+ ```
223
+ POST /generate-reports/trial-balance
224
+ { "startDate": "2025-01-01", "endDate": "2025-01-31" }
225
+ ```
226
+
227
+ **What to check:**
228
+ - Debits = Credits (always — if not, something is seriously wrong)
229
+ - Cash/bank accounts match bank statements
230
+ - AR balance matches AR aging total from Step 4
231
+ - AP balance matches AP aging total from Step 5
232
+ - No unexpected balances (negative cash, credit balances in expense accounts)
233
+
234
+ ### Step 15: Generate P&L
235
+
236
+ ```
237
+ POST /generate-reports/profit-and-loss
238
+ { "primarySnapshotDate": "2025-01-31", "secondarySnapshotDate": "2025-01-01" }
239
+ ```
240
+
241
+ **What to check:**
242
+ - Revenue is in line with expectations
243
+ - Expenses make sense for the month
244
+ - Gross margin is reasonable
245
+ - Any large one-off items should be explainable (accruals, adjustments from Phase 2)
246
+
247
+ ### Step 16: Generate balance sheet
248
+
249
+ ```
250
+ POST /generate-reports/balance-sheet
251
+ { "primarySnapshotDate": "2025-01-31" }
252
+ ```
253
+
254
+ **What to check:**
255
+ - Assets = Liabilities + Equity (by definition — if not, the API has a bug)
256
+ - Cash position is reasonable
257
+ - Prepaid balances reduced by one month's amortization
258
+ - Accrued liabilities reflect the accruals from Phase 2
259
+
260
+ ### Step 17: Compare to prior month
261
+
262
+ Run the same P&L for the prior month and compare. Significant variances should be explainable.
263
+
264
+ ```
265
+ POST /generate-reports/profit-and-loss
266
+ { "primarySnapshotDate": "2024-12-31", "secondarySnapshotDate": "2024-12-01" }
267
+ ```
268
+
269
+ **Flag:** Revenue or expense lines that moved > 20% month-over-month without a clear reason.
270
+
271
+ ---
272
+
273
+ ## Phase 5: Close & Lock
274
+
275
+ Once everything checks out, lock the period to prevent accidental backdated entries.
276
+
277
+ ### Step 18: Set lock date
278
+
279
+ Move the org lock date forward to the last day of the closed month.
280
+
281
+ **Best practice:** Lock date = last day of the closed period (e.g., `2025-01-31` after January close).
282
+
283
+ **Important:** Only move the lock date forward. Moving it backward reopens prior periods — do this only if you need to post corrections (and re-close afterward).
284
+
285
+ ---
286
+
287
+ ## Month-End Close Checklist (Quick Reference)
288
+
289
+ | # | Step | Phase | Conditional | Recipe/Calc |
290
+ |---|------|-------|-------------|-------------|
291
+ | 1 | Verify invoices entered | Pre-close | Always | — |
292
+ | 2 | Verify bills entered | Pre-close | Always | — |
293
+ | 3 | Complete bank reconciliation | Pre-close | Always | bank-recon job |
294
+ | 4 | Review AR aging | Pre-close | Always | — |
295
+ | 5 | Review AP aging | Pre-close | Always | — |
296
+ | 6 | Record accrued expenses | Accruals | If unbilled expenses exist | accrued-expenses |
297
+ | 7 | Amortize prepaid expenses | Accruals | If prepaid capsules exist | prepaid-amortization / `jaz calc prepaid-expense` |
298
+ | 8 | Recognize deferred revenue | Accruals | If deferred revenue exists | deferred-revenue / `jaz calc deferred-revenue` |
299
+ | 9 | Record depreciation | Accruals | If fixed assets exist | declining-balance / `jaz calc depreciation` |
300
+ | 10 | Accrue employee benefits | Accruals | If tracking leave | employee-accruals |
301
+ | 11 | Accrue loan interest | Accruals | If active loans | bank-loan / `jaz calc loan` |
302
+ | 12 | FX revaluation | Valuations | If multi-currency | fx-revaluation / `jaz calc fx-reval` |
303
+ | 13 | Review bad debt provision | Valuations | If material AR change | bad-debt-provision / `jaz calc ecl` |
304
+ | 14 | Review trial balance | Verification | Always | — |
305
+ | 15 | Generate P&L | Verification | Always | — |
306
+ | 16 | Generate balance sheet | Verification | Always | — |
307
+ | 17 | Compare to prior month | Verification | Always | — |
308
+ | 18 | Set lock date | Close | Always | — |