jaz-cli 2.6.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 (62) hide show
  1. package/assets/skills/api/SKILL.md +12 -2
  2. package/assets/skills/api/references/dependencies.md +3 -2
  3. package/assets/skills/api/references/endpoints.md +78 -0
  4. package/assets/skills/api/references/feature-glossary.md +4 -4
  5. package/assets/skills/api/references/field-map.md +17 -0
  6. package/assets/skills/api/references/full-api-surface.md +1 -1
  7. package/assets/skills/conversion/SKILL.md +1 -1
  8. package/assets/skills/jobs/SKILL.md +104 -0
  9. package/assets/skills/jobs/references/audit-prep.md +319 -0
  10. package/assets/skills/jobs/references/bank-recon.md +234 -0
  11. package/assets/skills/jobs/references/building-blocks.md +135 -0
  12. package/assets/skills/jobs/references/credit-control.md +273 -0
  13. package/assets/skills/jobs/references/fa-review.md +267 -0
  14. package/assets/skills/jobs/references/gst-vat-filing.md +250 -0
  15. package/assets/skills/jobs/references/month-end-close.md +308 -0
  16. package/assets/skills/jobs/references/payment-run.md +246 -0
  17. package/assets/skills/jobs/references/quarter-end-close.md +268 -0
  18. package/assets/skills/jobs/references/supplier-recon.md +330 -0
  19. package/assets/skills/jobs/references/year-end-close.md +341 -0
  20. package/assets/skills/transaction-recipes/SKILL.md +1 -1
  21. package/dist/__tests__/amortization.test.js +101 -0
  22. package/dist/__tests__/asset-disposal.test.js +249 -0
  23. package/dist/__tests__/blueprint.test.js +72 -0
  24. package/dist/__tests__/depreciation.test.js +125 -0
  25. package/dist/__tests__/ecl.test.js +134 -0
  26. package/dist/__tests__/fixed-deposit.test.js +214 -0
  27. package/dist/__tests__/fx-reval.test.js +115 -0
  28. package/dist/__tests__/jobs-audit-prep.test.js +125 -0
  29. package/dist/__tests__/jobs-bank-recon.test.js +108 -0
  30. package/dist/__tests__/jobs-credit-control.test.js +98 -0
  31. package/dist/__tests__/jobs-fa-review.test.js +104 -0
  32. package/dist/__tests__/jobs-gst-vat.test.js +113 -0
  33. package/dist/__tests__/jobs-month-end.test.js +162 -0
  34. package/dist/__tests__/jobs-payment-run.test.js +106 -0
  35. package/dist/__tests__/jobs-quarter-end.test.js +155 -0
  36. package/dist/__tests__/jobs-supplier-recon.test.js +115 -0
  37. package/dist/__tests__/jobs-validate.test.js +181 -0
  38. package/dist/__tests__/jobs-year-end.test.js +149 -0
  39. package/dist/__tests__/lease.test.js +96 -0
  40. package/dist/__tests__/loan.test.js +80 -0
  41. package/dist/__tests__/provision.test.js +141 -0
  42. package/dist/__tests__/validate.test.js +81 -0
  43. package/dist/calc/asset-disposal.js +17 -13
  44. package/dist/calc/fixed-deposit.js +26 -17
  45. package/dist/calc/lease.js +7 -3
  46. package/dist/commands/jobs.js +184 -0
  47. package/dist/index.js +2 -0
  48. package/dist/jobs/audit-prep.js +211 -0
  49. package/dist/jobs/bank-recon.js +163 -0
  50. package/dist/jobs/credit-control.js +126 -0
  51. package/dist/jobs/fa-review.js +121 -0
  52. package/dist/jobs/format.js +102 -0
  53. package/dist/jobs/gst-vat.js +187 -0
  54. package/dist/jobs/month-end.js +232 -0
  55. package/dist/jobs/payment-run.js +199 -0
  56. package/dist/jobs/quarter-end.js +135 -0
  57. package/dist/jobs/supplier-recon.js +132 -0
  58. package/dist/jobs/types.js +36 -0
  59. package/dist/jobs/validate.js +115 -0
  60. package/dist/jobs/year-end.js +153 -0
  61. package/dist/types/index.js +2 -1
  62. package/package.json +5 -2
@@ -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 | — |
@@ -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.