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,330 @@
1
+ # Supplier Statement Reconciliation
2
+
3
+ Compare your accounts payable balance for a supplier against the supplier's own statement. Identify missing bills, duplicate payments, pricing discrepancies, and timing differences. This is how you catch errors before they become disputes.
4
+
5
+ **CLI:** `jaz jobs supplier-recon [--supplier "Acme Corp"] [--period 2025-01] [--json]`
6
+
7
+ ---
8
+
9
+ ## Phase 1: Get Supplier Details
10
+
11
+ ### Step 1: Find the supplier contact
12
+
13
+ If `--supplier` is specified, search by name:
14
+
15
+ ```
16
+ POST /api/v1/contacts/search
17
+ {
18
+ "filter": {
19
+ "supplier": { "eq": true },
20
+ "name": { "contains": "Acme Corp" }
21
+ },
22
+ "sort": { "sortBy": ["name"], "order": "ASC" },
23
+ "limit": 10
24
+ }
25
+ ```
26
+
27
+ If no supplier is specified, list all suppliers:
28
+
29
+ ```
30
+ POST /api/v1/contacts/search
31
+ {
32
+ "filter": { "supplier": { "eq": true } },
33
+ "sort": { "sortBy": ["name"], "order": "ASC" },
34
+ "limit": 100
35
+ }
36
+ ```
37
+
38
+ **What you need:** The supplier's `resourceId` and `name` for all subsequent queries.
39
+
40
+ ---
41
+
42
+ ## Phase 2: Pull Your Records
43
+
44
+ ### Step 2: List all bills for the supplier in the period
45
+
46
+ ```
47
+ POST /api/v1/bills/search
48
+ {
49
+ "filter": {
50
+ "contactResourceId": { "eq": "<supplier-uuid>" },
51
+ "status": { "in": ["POSTED", "VOIDED"] },
52
+ "valueDate": { "between": ["2025-01-01", "2025-01-31"] }
53
+ },
54
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
55
+ "limit": 1000
56
+ }
57
+ ```
58
+
59
+ **Include VOIDED status** — you need to see voided bills to explain differences (e.g., "we voided your invoice #123 because it was a duplicate").
60
+
61
+ **Record for each bill:**
62
+ - Reference number
63
+ - Date
64
+ - Total amount
65
+ - Balance amount (how much is still unpaid)
66
+ - Status
67
+
68
+ ### Step 3: List all payments to the supplier in the period
69
+
70
+ Search for payment transactions against the supplier's bills. First, get all bills (from Step 2), then check each bill's payment records:
71
+
72
+ ```
73
+ GET /api/v1/bills/{billResourceId}/payments
74
+ ```
75
+
76
+ Alternatively, search cashflow transactions for supplier payments:
77
+
78
+ ```
79
+ POST /api/v1/cashflow-transactions/search
80
+ {
81
+ "filter": {
82
+ "contact": { "name": { "eq": "Acme Corp" } },
83
+ "businessTransactionType": { "in": ["PURCHASE"] },
84
+ "direction": { "eq": "PAYOUT" },
85
+ "valueDate": { "between": ["2025-01-01", "2025-01-31"] }
86
+ },
87
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
88
+ "limit": 1000
89
+ }
90
+ ```
91
+
92
+ ### Step 4: List any supplier credit notes
93
+
94
+ ```
95
+ POST /api/v1/supplier-credit-notes/search
96
+ {
97
+ "filter": {
98
+ "contactResourceId": { "eq": "<supplier-uuid>" },
99
+ "status": { "eq": "POSTED" },
100
+ "valueDate": { "between": ["2025-01-01", "2025-01-31"] }
101
+ },
102
+ "sort": { "sortBy": ["valueDate"], "order": "ASC" },
103
+ "limit": 100
104
+ }
105
+ ```
106
+
107
+ ---
108
+
109
+ ## Phase 3: Get the Supplier Statement Balance
110
+
111
+ ### Step 5: Determine the AP balance per your books
112
+
113
+ Get the AP balance for this specific supplier from the AP aging report:
114
+
115
+ ```
116
+ POST /api/v1/generate-reports/ap-report
117
+ { "endDate": "2025-01-31" }
118
+ ```
119
+
120
+ Look for the supplier in the report output and note their total balance.
121
+
122
+ Alternatively, for a quick per-supplier calculation:
123
+
124
+ ```
125
+ POST /api/v1/bills/search
126
+ {
127
+ "filter": {
128
+ "contactResourceId": { "eq": "<supplier-uuid>" },
129
+ "status": { "eq": "POSTED" },
130
+ "balanceAmount": { "gt": 0 }
131
+ },
132
+ "sort": { "sortBy": ["dueDate"], "order": "ASC" },
133
+ "limit": 1000
134
+ }
135
+ ```
136
+
137
+ Sum the `balanceAmount` from all results = your AP balance for this supplier.
138
+
139
+ ### Step 6: Compare to supplier's statement
140
+
141
+ The supplier's statement is an external document — you'll have it as a PDF, email, or portal download. The key figure is their **closing balance** for the period.
142
+
143
+ **The reconciliation equation:**
144
+
145
+ ```
146
+ Your AP balance (from Step 5)
147
+ SHOULD EQUAL
148
+ Supplier's statement closing balance
149
+
150
+ If they don't match, the difference is explained by reconciling items (Phase 4).
151
+ ```
152
+
153
+ ---
154
+
155
+ ## Phase 4: Identify Differences
156
+
157
+ Work through each discrepancy type systematically.
158
+
159
+ ### Difference Type 1: Missing bills (in supplier statement, not in your books)
160
+
161
+ The supplier has invoiced you, but the bill isn't entered in Jaz.
162
+
163
+ **Common causes:**
164
+ - Bill arrived late (still in someone's inbox or physical mailbox)
165
+ - Bill was emailed to the wrong person
166
+ - Bill was received but not yet entered by the bookkeeper
167
+
168
+ **Resolution:** Obtain the bill from the supplier and enter it:
169
+
170
+ ```
171
+ POST /api/v1/bills
172
+ {
173
+ "contactResourceId": "<supplier-uuid>",
174
+ "saveAsDraft": false,
175
+ "reference": "BILL-MISSING-001",
176
+ "valueDate": "2025-01-15",
177
+ "dueDate": "2025-02-14",
178
+ "lineItems": [{
179
+ "name": "Office supplies — Jan 2025",
180
+ "unitPrice": 850.00,
181
+ "quantity": 1,
182
+ "accountResourceId": "<expense-account-uuid>",
183
+ "taxProfileResourceId": "<tax-profile-uuid>"
184
+ }]
185
+ }
186
+ ```
187
+
188
+ Or use Jaz Magic if you have the document:
189
+
190
+ ```
191
+ POST /api/v1/magic/createBusinessTransactionFromAttachment
192
+ Content-Type: multipart/form-data
193
+
194
+ Fields:
195
+ - sourceFile: <PDF of the missing bill>
196
+ - businessTransactionType: "BILL"
197
+ - sourceType: "FILE"
198
+ ```
199
+
200
+ ### Difference Type 2: Duplicate payments
201
+
202
+ You paid the same bill twice, or the supplier hasn't credited a payment you made.
203
+
204
+ **How to check:** Look for two payments with the same amount and similar dates against different bills from the same supplier.
205
+
206
+ **Resolution:**
207
+ - If genuinely paid twice → request a refund or credit note from the supplier
208
+ - If the supplier hasn't recorded your payment → send them the bank transfer reference/proof
209
+
210
+ ### Difference Type 3: Timing differences
211
+
212
+ The most common and least worrying type. Your payment was made on Jan 30 but the supplier didn't record it until Feb 3.
213
+
214
+ **Resolution:** No action needed — these resolve themselves in the next period. Note them as reconciling items.
215
+
216
+ ### Difference Type 4: Pricing discrepancies
217
+
218
+ The supplier's invoice amount differs from what you expected (wrong unit price, quantity, or missing discount).
219
+
220
+ **Resolution:**
221
+ - Contact the supplier to clarify
222
+ - If they agree to the correction → request a supplier credit note
223
+ - Enter the credit note when received:
224
+
225
+ ```
226
+ POST /api/v1/supplier-credit-notes
227
+ {
228
+ "contactResourceId": "<supplier-uuid>",
229
+ "saveAsDraft": false,
230
+ "reference": "SCN-DISPUTE-001",
231
+ "valueDate": "2025-01-31",
232
+ "lineItems": [{
233
+ "name": "Price correction — Invoice #12345",
234
+ "unitPrice": 150.00,
235
+ "quantity": 1,
236
+ "accountResourceId": "<expense-account-uuid>",
237
+ "taxProfileResourceId": "<tax-profile-uuid>"
238
+ }]
239
+ }
240
+ ```
241
+
242
+ ### Difference Type 5: Bills in your books, not in supplier statement
243
+
244
+ You have a bill entered, but the supplier doesn't show it.
245
+
246
+ **Common causes:**
247
+ - You entered a bill from a pro-forma/estimate instead of the actual invoice
248
+ - The bill was entered under the wrong supplier contact
249
+ - The supplier issued a credit note you haven't processed
250
+
251
+ **Resolution:** Investigate and either void the incorrect bill or request clarification from the supplier.
252
+
253
+ ---
254
+
255
+ ## Phase 5: Verification
256
+
257
+ ### Step 7: Re-check after adjustments
258
+
259
+ After entering missing bills, credit notes, and resolving discrepancies:
260
+
261
+ ```
262
+ POST /api/v1/bills/search
263
+ {
264
+ "filter": {
265
+ "contactResourceId": { "eq": "<supplier-uuid>" },
266
+ "status": { "eq": "POSTED" },
267
+ "balanceAmount": { "gt": 0 }
268
+ },
269
+ "sort": { "sortBy": ["dueDate"], "order": "ASC" },
270
+ "limit": 1000
271
+ }
272
+ ```
273
+
274
+ Sum `balanceAmount` again. The difference between this and the supplier's statement should now be explainable entirely by timing differences.
275
+
276
+ ### Step 8: Verify AP aging
277
+
278
+ ```
279
+ POST /api/v1/generate-reports/ap-report
280
+ { "endDate": "2025-01-31" }
281
+ ```
282
+
283
+ **What to check:**
284
+ - Supplier's balance reflects all adjustments
285
+ - Total AP still ties to the Accounts Payable control account on the trial balance
286
+
287
+ ---
288
+
289
+ ## Supplier Recon Checklist (Quick Reference)
290
+
291
+ | # | Step | Phase | What |
292
+ |---|------|-------|------|
293
+ | 1 | Find supplier contact | Setup | Search contacts with supplier=true |
294
+ | 2 | List bills for period | Your records | Bills by contact + date range |
295
+ | 3 | List payments for period | Your records | Payment records per bill |
296
+ | 4 | List credit notes | Your records | Supplier credit notes in period |
297
+ | 5 | Get your AP balance | Compare | Sum of unpaid bill balances |
298
+ | 6 | Compare to supplier statement | Compare | External document comparison |
299
+ | — | Missing bills | Resolve | Enter missing, use Jaz Magic |
300
+ | — | Duplicate payments | Resolve | Request refund/credit |
301
+ | — | Timing differences | Resolve | Note only, resolves next period |
302
+ | — | Pricing discrepancies | Resolve | Request supplier credit note |
303
+ | — | Phantom bills | Resolve | Investigate and void if needed |
304
+ | 7 | Re-check balance | Verify | Should match or explain difference |
305
+ | 8 | Verify AP aging | Verify | Total AP ties to trial balance |
306
+
307
+ ---
308
+
309
+ ## Common Discrepancy Types (Summary)
310
+
311
+ | Type | Direction | Action |
312
+ |------|-----------|--------|
313
+ | Missing bill | You owe more than your books show | Enter the bill |
314
+ | Duplicate payment | You've overpaid | Request refund or credit |
315
+ | Timing difference | Payment in transit | No action, resolves next period |
316
+ | Price discrepancy | Amount disagrees | Request credit note or re-invoice |
317
+ | Phantom bill | Your books show more than supplier | Investigate, void if error |
318
+ | Unapplied credit | Credit note not yet applied | Apply to outstanding bill |
319
+
320
+ ---
321
+
322
+ ## Tips for SMBs
323
+
324
+ **Do this quarterly at minimum, monthly for high-volume suppliers.** Most supplier disputes become much harder to resolve after 90 days because people forget the details and documents get lost.
325
+
326
+ **Request statements proactively.** Don't wait for the supplier to send one — email their accounts department at the start of each quarter requesting a statement for the prior period. Many suppliers have online portals where you can download statements on demand.
327
+
328
+ **The most common issue is missing bills.** In our experience, 80% of supplier recon differences are bills you haven't entered yet. The fix is process, not technology — create a shared inbox or folder for bills and check it daily.
329
+
330
+ **GST implications of discrepancies.** If you discover missing bills during reconciliation, the input tax claim on those bills belongs to the quarter the bill is dated, not when you entered it. If you've already filed the GST return for that quarter, you may need to adjust in the next return or file a voluntary disclosure.
@@ -0,0 +1,341 @@
1
+ # Year-End Close
2
+
3
+ The annual close builds on the quarterly close. It is quarter-end close repeated four times, plus a set of year-end-specific adjustments — true-ups, dividends, retained earnings rollover, final GST reconciliation, and audit preparation. For most SMBs, the annual extras add 2-5 days of work depending on complexity and whether an external audit is required.
4
+
5
+ **CLI:** `jaz jobs year-end --period 2025 [--currency SGD] [--json]`
6
+
7
+ **Standalone vs Incremental:**
8
+ - **Standalone (default):** Generates the full plan — all quarterly close steps for each of the four quarters, followed by the annual extras. Use this when quarters haven't been closed yet.
9
+ - **Incremental (`--incremental`):** Generates only the annual extras below. Use this when all four quarters are already closed and locked.
10
+
11
+ ---
12
+
13
+ ## Phase 1–7: Quarterly Close (x4)
14
+
15
+ Complete the full quarter-end close for each quarter in the year. Each quarter follows the monthly close (x3) plus quarterly extras pattern.
16
+
17
+ **Reference:** `references/quarter-end-close.md`
18
+
19
+ | FY | Q1 | Q2 | Q3 | Q4 |
20
+ |----|----|----|----|----|
21
+ | Calendar year | Jan–Mar | Apr–Jun | Jul–Sep | Oct–Dec |
22
+
23
+ **Important:** Close quarters in order. Q1 must be locked before starting Q2, and so on. The annual extras run after Q4 is closed. By the time you reach this phase, all 12 months are individually closed, all four quarterly GST returns are filed, and all quarterly provisions are up to date.
24
+
25
+ ---
26
+
27
+ ## Phase 8: Annual Extras
28
+
29
+ These steps run once per year, after all four quarters are closed. They address items that are inherently annual — full-year depreciation reconciliation, true-ups against actuals, dividends, retained earnings rollover, and audit preparation.
30
+
31
+ ### Step Y1: Final depreciation run
32
+
33
+ Verify the full year's depreciation is correctly recorded and reconciles to the fixed asset register.
34
+
35
+ **Recipe:** `declining-balance` | **Calculator:** `jaz calc depreciation`
36
+
37
+ **Step-by-step:**
38
+
39
+ 1. Pull the fixed asset register as at year-end:
40
+ ```
41
+ POST /generate-reports/fixed-assets-summary
42
+ {}
43
+ ```
44
+
45
+ 2. For each asset class, verify that 12 months of depreciation have been recorded. If using Jaz native FA depreciation (straight-line), this should be automatic. If using manual journals for non-standard methods (DDB, 150DB), verify all 12 monthly entries exist.
46
+
47
+ 3. Run the calculator for each non-standard asset to confirm the full-year charge:
48
+ ```bash
49
+ jaz calc depreciation --cost 50000 --salvage 5000 --life 5 --method ddb --frequency monthly --json
50
+ ```
51
+
52
+ 4. Reconcile accumulated depreciation per the FA register to accumulated depreciation per the trial balance:
53
+ ```
54
+ POST /generate-reports/trial-balance
55
+ { "startDate": "2025-01-01", "endDate": "2025-12-31" }
56
+ ```
57
+
58
+ **What to check:**
59
+ - Depreciation expense on P&L = sum of all 12 monthly depreciation charges
60
+ - Accumulated depreciation on balance sheet = prior year balance + current year depreciation - accumulated depreciation on disposed assets
61
+ - FA register NBV (net book value) per asset ties to the balance sheet total
62
+ - No asset has been depreciated below its salvage value
63
+
64
+ **Conditional:** Always, if fixed assets exist. Even if depreciation runs automatically, verify it at year-end. Auditors will test this.
65
+
66
+ ### Step Y2: Year-end true-ups
67
+
68
+ Reconcile accruals to actuals and post adjustments. Three components:
69
+
70
+ #### a) Leave balance true-up
71
+
72
+ Monthly closes accrued a fixed amount for leave liability. At year-end, reconcile to actual leave balances.
73
+
74
+ **Recipe:** `employee-accruals`
75
+
76
+ ```
77
+ POST /journals
78
+ {
79
+ "valueDate": "2025-12-31",
80
+ "reference": "YE-LEAVE-TRUEUP-FY25",
81
+ "journalEntries": [
82
+ { "accountResourceId": "<leave-expense>", "amount": 3200.00, "type": "DEBIT", "name": "Leave accrual true-up — FY2025 (actual vs accrued)" },
83
+ { "accountResourceId": "<leave-liability>", "amount": 3200.00, "type": "CREDIT", "name": "Leave accrual true-up — FY2025 (actual vs accrued)" }
84
+ ]
85
+ }
86
+ ```
87
+
88
+ **What to check:** Leave liability on balance sheet should equal (unused leave days x daily rate) for each employee. If accrual > actual, reverse the excess (DR Leave Liability, CR Leave Expense).
89
+
90
+ **Conditional:** Only if you track leave balances in the books. Most SMBs with 5+ employees should.
91
+
92
+ #### b) Bonus true-up
93
+
94
+ Quarterly closes maintained the bonus accrual estimate. At year-end, true up to actual bonus amounts declared.
95
+
96
+ **Recipe:** `employee-accruals` (bonus component)
97
+
98
+ ```
99
+ POST /journals
100
+ {
101
+ "valueDate": "2025-12-31",
102
+ "reference": "YE-BONUS-TRUEUP-FY25",
103
+ "journalEntries": [
104
+ { "accountResourceId": "<bonus-expense>", "amount": 5000.00, "type": "DEBIT", "name": "Bonus true-up — FY2025 (actual declared vs accrued)" },
105
+ { "accountResourceId": "<bonus-liability>", "amount": 5000.00, "type": "CREDIT", "name": "Bonus true-up — FY2025 (actual declared vs accrued)" }
106
+ ]
107
+ }
108
+ ```
109
+
110
+ **What to check:** Bonus liability on balance sheet = actual bonuses declared but not yet paid. If over-accrued, reverse the excess.
111
+
112
+ **Conditional:** Only if the business has bonus schemes.
113
+
114
+ #### c) Provision reassessment (IAS 37)
115
+
116
+ At year-end, reassess all provisions — not just unwind the discount, but review whether the provision amount itself is still the best estimate.
117
+
118
+ **Recipe:** `provisions`
119
+
120
+ **What to check for each provision:**
121
+ - Is the obligating event still valid? (If resolved, release the provision.)
122
+ - Has the best estimate changed? (Adjust up or down.)
123
+ - Has the discount rate changed? (Re-measure at current rate, post the difference.)
124
+ - Has the expected settlement date changed? (Adjust the unwinding schedule.)
125
+
126
+ Post adjustment journals for any changes. Document the reasoning — auditors will review provision assessments.
127
+
128
+ **Conditional:** Only if IAS 37 provisions exist. Most simple SMBs can skip this.
129
+
130
+ ### Step Y3: Dividend declaration and payment
131
+
132
+ If the business is declaring dividends for the fiscal year, post two journals — one for declaration and one for payment. These are distinct accounting events.
133
+
134
+ **Recipe:** `dividend`
135
+
136
+ #### Declaration (board resolution date):
137
+
138
+ ```
139
+ POST /journals
140
+ {
141
+ "valueDate": "2025-12-31",
142
+ "reference": "YE-DIV-DECLARE-FY25",
143
+ "journalEntries": [
144
+ { "accountResourceId": "<retained-earnings>", "amount": 50000.00, "type": "DEBIT", "name": "Dividend declared — FY2025" },
145
+ { "accountResourceId": "<dividends-payable>", "amount": 50000.00, "type": "CREDIT", "name": "Dividend declared — FY2025" }
146
+ ]
147
+ }
148
+ ```
149
+
150
+ #### Payment (actual payment date):
151
+
152
+ ```
153
+ POST /journals
154
+ {
155
+ "valueDate": "2026-01-15",
156
+ "reference": "YE-DIV-PAY-FY25",
157
+ "journalEntries": [
158
+ { "accountResourceId": "<dividends-payable>", "amount": 50000.00, "type": "DEBIT", "name": "Dividend paid — FY2025" },
159
+ { "accountResourceId": "<bank-account>", "amount": 50000.00, "type": "CREDIT", "name": "Dividend paid — FY2025" }
160
+ ]
161
+ }
162
+ ```
163
+
164
+ **Note:** Declaration often falls in the current FY (e.g., Dec 31), but payment may fall in the next FY (e.g., Jan 15). The declaration journal reduces retained earnings in the current year. The payment journal just clears the liability — no P&L impact.
165
+
166
+ **For Singapore:** Dividends are tax-exempt in the hands of the shareholder (one-tier system). No withholding tax. No additional tax journal needed.
167
+
168
+ **For Philippines:** Dividends to resident individuals are subject to 10% final withholding tax. Post the withholding tax separately (DR Dividends Payable, CR Withholding Tax Payable) and remit to BIR.
169
+
170
+ **Conditional:** Only if the business is declaring dividends. Many SMBs retain all earnings. Skip if no dividend resolution.
171
+
172
+ ### Step Y4: Retained earnings rollover (Current Year Earnings)
173
+
174
+ Jaz auto-manages the annual rollover of Current Year Earnings (CYE) into Retained Earnings at the start of each new fiscal year. The net P&L for the year is accumulated in CYE during the year, then rolled forward.
175
+
176
+ **What to verify:**
177
+
178
+ 1. Pull the equity movement report:
179
+ ```
180
+ POST /generate-reports/equity-movement
181
+ { "primarySnapshotStartDate": "2025-01-01", "primarySnapshotEndDate": "2025-12-31" }
182
+ ```
183
+
184
+ 2. Confirm:
185
+ - CYE balance at year-end = Net profit (or loss) for the year per P&L
186
+ - Retained Earnings opening balance = prior year closing Retained Earnings
187
+ - After rollover (in the new year): CYE resets to zero, Retained Earnings increases by last year's net profit (less any dividends declared)
188
+
189
+ **Tip:** If CYE doesn't match the P&L bottom line, there's a posting error somewhere — most likely a journal posted directly to an equity account that shouldn't have been.
190
+
191
+ **No journal needed** — this is a platform-managed rollover. Your job is to verify it happened correctly.
192
+
193
+ ### Step Y5: Final GST/VAT reconciliation
194
+
195
+ Reconcile the full year's GST/VAT against all four quarterly returns (or twelve monthly returns for PH).
196
+
197
+ ```
198
+ POST /generate-reports/vat-ledger
199
+ { "startDate": "2025-01-01", "endDate": "2025-12-31" }
200
+ ```
201
+
202
+ **What to check:**
203
+
204
+ 1. Annual output tax per tax ledger = sum of output tax across all four quarterly returns
205
+ 2. Annual input tax per tax ledger = sum of input tax across all four quarterly returns
206
+ 3. Net GST paid/refunded during the year = sum of all quarterly GST payments/refunds
207
+ 4. GST control account on trial balance = net GST payable/receivable for Q4 (if Q1–Q3 already settled)
208
+ 5. No orphan transactions — every taxable invoice and bill is accounted for in the tax ledger
209
+
210
+ **For Singapore:** IRAS may request the Annual GST Return (GST F8) for certain businesses. The annual reconciliation feeds directly into this.
211
+
212
+ **For Philippines:** Cross-check annual totals against the Summary List of Sales (SLS) and Summary List of Purchases (SLP) required by BIR.
213
+
214
+ **Tip:** If the annual tax ledger total doesn't match the sum of quarterly returns, the most common causes are: (a) transactions entered after the quarterly filing with a backdated date, (b) credit notes or amendments posted in a later quarter, (c) reclassification of tax codes mid-year.
215
+
216
+ ### Step Y6: Audit preparation
217
+
218
+ Compile all reports, reconciliation schedules, and supporting documentation for the external auditor or tax preparer.
219
+
220
+ **Reference:** `references/audit-prep.md` for the full audit preparation job.
221
+
222
+ At minimum, generate and export:
223
+
224
+ | Report | API Call |
225
+ |--------|----------|
226
+ | Trial Balance (full year) | `POST /generate-reports/trial-balance { "startDate": "2025-01-01", "endDate": "2025-12-31" }` |
227
+ | Balance Sheet (year-end) | `POST /generate-reports/balance-sheet { "primarySnapshotDate": "2025-12-31" }` |
228
+ | P&L (full year) | `POST /generate-reports/profit-and-loss { "primarySnapshotDate": "2025-12-31", "secondarySnapshotDate": "2025-01-01" }` |
229
+ | General Ledger (full year) | `POST /generate-reports/general-ledger { "startDate": "2025-01-01", "endDate": "2025-12-31", "groupBy": "ACCOUNT" }` |
230
+ | Cashflow Statement | `POST /generate-reports/cashflow { "primaryStartDate": "2025-01-01", "primaryEndDate": "2025-12-31" }` |
231
+ | AR Aging (year-end) | `POST /generate-reports/ar-report { "endDate": "2025-12-31" }` |
232
+ | AP Aging (year-end) | `POST /generate-reports/ap-report { "endDate": "2025-12-31" }` |
233
+ | FA Register | `POST /generate-reports/fixed-assets-summary {}` |
234
+ | Tax Ledger (full year) | `POST /generate-reports/vat-ledger { "startDate": "2025-01-01", "endDate": "2025-12-31" }` |
235
+ | Equity Movement | `POST /generate-reports/equity-movement { "primarySnapshotStartDate": "2025-01-01", "primarySnapshotEndDate": "2025-12-31" }` |
236
+
237
+ **Supporting schedules to prepare:**
238
+ - Bank reconciliation statements for each bank account at year-end
239
+ - ECL provision calculation workpaper (from Q4 Step Q2)
240
+ - Fixed asset movement schedule (additions, disposals, depreciation, NBV)
241
+ - Intercompany balance confirmation letters (if multi-entity)
242
+ - Loan amortization schedules with principal/interest split
243
+ - Provision schedules with movement analysis
244
+
245
+ **Conditional:** Always for audited entities. For non-audited SMBs, at minimum prepare TB + BS + P&L for tax filing purposes.
246
+
247
+ ### Step Y7: Final lock date
248
+
249
+ Lock the entire fiscal year. This prevents any accidental or unauthorized entries into the closed year.
250
+
251
+ **Best practice:** Set the org lock date to the last day of the fiscal year (e.g., `2025-12-31`).
252
+
253
+ **Important considerations:**
254
+ - Confirm with the auditor that they have no remaining adjustments before locking. Many auditors request a "soft close" first, with the hard lock applied after audit adjustments are posted.
255
+ - If using an audit adjustments period (e.g., January 1–15 of the new year for audit entries), set the lock date after those entries are complete.
256
+ - Once locked, reopening requires admin action and should be documented.
257
+
258
+ ---
259
+
260
+ ## Phase 9: Annual Verification
261
+
262
+ Run the standard period verification (see `references/building-blocks.md` — Period Verification Pattern) for the full year, plus these annual-specific checks.
263
+
264
+ ### Standard verification (full year)
265
+
266
+ ```
267
+ POST /generate-reports/trial-balance
268
+ { "startDate": "2025-01-01", "endDate": "2025-12-31" }
269
+ ```
270
+
271
+ ```
272
+ POST /generate-reports/profit-and-loss
273
+ { "primarySnapshotDate": "2025-12-31", "secondarySnapshotDate": "2025-01-01" }
274
+ ```
275
+
276
+ ```
277
+ POST /generate-reports/balance-sheet
278
+ { "primarySnapshotDate": "2025-12-31" }
279
+ ```
280
+
281
+ ### Annual-specific checks
282
+
283
+ **CYE rollover check:**
284
+ - Current Year Earnings at year-end = Net profit per the annual P&L
285
+ - After the new FY opens: CYE resets to zero, Retained Earnings increases by the prior year's net profit (less dividends)
286
+ - Total equity movement = Net profit - Dividends declared + Other equity movements (capital injection, etc.)
287
+
288
+ **Annual P&L vs monthly P&Ls sum:**
289
+ - Generate P&L for each of the 12 months individually
290
+ - Sum all 12 monthly net profit figures
291
+ - This sum MUST equal the annual P&L net profit
292
+ - If it doesn't, there's a timing/posting error — most commonly a journal posted to a month that was supposed to be locked
293
+
294
+ **FA register reconciliation:**
295
+ - NBV per FA register = Cost less accumulated depreciation per balance sheet
296
+ - Depreciation expense per FA register = Depreciation expense per P&L
297
+ - Asset count per FA register = physical count (if performed)
298
+ - Any fully depreciated assets still in use should be noted but not removed from register
299
+
300
+ **Provision balances:**
301
+ - Each provision on the balance sheet has documented support (IAS 37 criteria met)
302
+ - Provision movement = Opening + New provisions + Unwinding - Utilizations - Releases
303
+ - Unwinding total for the year = sum of four quarterly unwinding entries
304
+
305
+ **Intercompany elimination (if consolidating):**
306
+ - All intercompany balances net to zero across the group
307
+ - Intercompany revenue/expense eliminated on consolidation
308
+ - No intercompany profit in inventory or fixed assets (if applicable)
309
+
310
+ ---
311
+
312
+ ## Year-End Close Checklist (Quick Reference)
313
+
314
+ | # | Step | Phase | Conditional | Recipe/Calc |
315
+ |---|------|-------|-------------|-------------|
316
+ | 1–18 | Q1 Month 1 close | Monthly | Always | See month-end-close.md |
317
+ | 1–18 | Q1 Month 2 close | Monthly | Always | See month-end-close.md |
318
+ | 1–18 | Q1 Month 3 close | Monthly | Always | See month-end-close.md |
319
+ | Q1–Q5 | Q1 quarterly extras | Quarterly | See quarter-end-close.md | See quarter-end-close.md |
320
+ | 1–18 | Q2 Month 1 close | Monthly | Always | See month-end-close.md |
321
+ | 1–18 | Q2 Month 2 close | Monthly | Always | See month-end-close.md |
322
+ | 1–18 | Q2 Month 3 close | Monthly | Always | See month-end-close.md |
323
+ | Q1–Q5 | Q2 quarterly extras | Quarterly | See quarter-end-close.md | See quarter-end-close.md |
324
+ | 1–18 | Q3 Month 1 close | Monthly | Always | See month-end-close.md |
325
+ | 1–18 | Q3 Month 2 close | Monthly | Always | See month-end-close.md |
326
+ | 1–18 | Q3 Month 3 close | Monthly | Always | See month-end-close.md |
327
+ | Q1–Q5 | Q3 quarterly extras | Quarterly | See quarter-end-close.md | See quarter-end-close.md |
328
+ | 1–18 | Q4 Month 1 close | Monthly | Always | See month-end-close.md |
329
+ | 1–18 | Q4 Month 2 close | Monthly | Always | See month-end-close.md |
330
+ | 1–18 | Q4 Month 3 close | Monthly | Always | See month-end-close.md |
331
+ | Q1–Q5 | Q4 quarterly extras | Quarterly | See quarter-end-close.md | See quarter-end-close.md |
332
+ | Y1 | Final depreciation run | Annual | If fixed assets exist | declining-balance / `jaz calc depreciation` |
333
+ | Y2a | Leave balance true-up | Annual | If tracking leave | employee-accruals |
334
+ | Y2b | Bonus true-up | Annual | If bonus schemes exist | employee-accruals |
335
+ | Y2c | Provision reassessment | Annual | If IAS 37 provisions exist | provisions |
336
+ | Y3 | Dividend declaration & payment | Annual | If declaring dividends | dividend |
337
+ | Y4 | Retained earnings rollover (CYE) | Annual | Always (verify only) | — |
338
+ | Y5 | Final GST/VAT reconciliation | Annual | Always (if GST-registered) | gst-vat-filing job |
339
+ | Y6 | Audit preparation | Annual | Always (scope varies) | audit-prep job |
340
+ | Y7 | Final lock date | Annual | Always | — |
341
+ | V | Annual verification | Verification | Always | — |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: transaction-recipes
3
- version: 2.7.0
3
+ version: 2.8.0
4
4
  description: 16 IFRS-compliant recipes for complex multi-step accounting in Jaz — prepaid amortization, deferred revenue, loan schedules, IFRS 16 leases, hire purchase, fixed deposits, asset disposal, FX revaluation, ECL provisioning, IAS 37 provisions, dividends, intercompany, and capital WIP. Each recipe includes journal entries, capsule structure, and verification steps. Paired with 10 financial calculators that produce execution-ready blueprints with workings.
5
5
  license: MIT
6
6
  compatibility: Works with Claude Code, Claude Cowork, Claude.ai, and any agent that reads markdown. For API payloads, load the jaz-api skill alongside this one.