jaz-clio 5.43.0 → 5.44.1
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.
- package/assets/skills/api/SKILL.md +4 -4
- package/assets/skills/api/references/errors.md +9 -5
- package/assets/skills/api/references/field-map.md +13 -0
- package/assets/skills/api/references/search-enums.md +39 -15
- package/assets/skills/cli/SKILL.md +1 -1
- package/assets/skills/conversion/SKILL.md +1 -1
- package/assets/skills/conversion/references/mapping-rules.md +3 -1
- package/assets/skills/jaz-kit/SKILL.md +1 -1
- package/assets/skills/jaz-pseudo-sql/SKILL.md +1 -1
- package/assets/skills/jobs/SKILL.md +1 -1
- package/assets/skills/jobs/references/year-end-close.md +3 -3
- package/assets/skills/transaction-recipes/SKILL.md +1 -1
- package/assets/skills/transaction-recipes/references/asset-disposal.md +1 -1
- package/assets/skills/transaction-recipes/references/bank-loan.md +2 -2
- package/assets/skills/transaction-recipes/references/building-blocks.md +7 -7
- package/assets/skills/transaction-recipes/references/capital-wip.md +3 -3
- package/assets/skills/transaction-recipes/references/declining-balance.md +1 -1
- package/assets/skills/transaction-recipes/references/fixed-deposit.md +1 -1
- package/assets/skills/transaction-recipes/references/ifrs16-lease.md +2 -2
- package/assets/skills/transaction-recipes/references/provisions.md +2 -2
- package/cli.mjs +395 -395
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jaz-api
|
|
3
|
-
version: 5.
|
|
3
|
+
version: 5.44.1
|
|
4
4
|
description: >-
|
|
5
5
|
Use this skill whenever you call, debug, or review code that touches the Jaz
|
|
6
6
|
REST API. Covers field names, response shapes, 159 production gotchas, error
|
|
@@ -79,7 +79,7 @@ The rest of this skill — field names, gotchas, error catalog, dependency order
|
|
|
79
79
|
18. **Bank accounts are CoA entries** with `accountType: "Bank Accounts"`. A convenience endpoint `GET /bank-accounts` exists but returns a **flat array** `[{...}]` — NOT the standard paginated `{ data, totalElements, totalPages }` shape. Normalize before use.
|
|
80
80
|
19. **CoA bulk-upsert wrapper is `accounts`** — not `chartOfAccounts`.
|
|
81
81
|
20. **CoA POST uses `currency`** — not `currencyCode`. (Asymmetry — GET returns `currencyCode`.)
|
|
82
|
-
21. **CoA POST uses `classificationType`** — GET returns `accountType`. Same values. Both
|
|
82
|
+
21. **CoA POST uses `classificationType`** — GET returns `accountType`. Same values. Both accept all 23 types: Bank Accounts, Cash, Current Asset, Non-current Asset, Fixed Asset, Inventory, Investment, Goodwill, Current Liability, Non-current Liability, Shareholders Equity, Operating Revenue, Other Revenue, Discontinued Income, Financing Income, Investing Income, Direct Costs, Operating Expense, Other Expense, Finance Cost, Investing Expense, Income Tax Expense, Discontinued Expense (nine of these are the IFRS 18 set added 2026-05, listed in rule 140). COGS is **Direct Costs**, never Operating Expense; "Cost of Goods Sold" is the default account NAME, not a type. Values are singular — a plural or invented value returns zero rows with no error, and `search_accounts` does not normalise (only `create_account` does). The set is GLOBAL (same for every org); confirm against the platform with `list_account_classifications` using `limit: 100` — its default page is 20 and there are 23.
|
|
83
83
|
22. **CoA code mapping: match by NAME, not code** — pre-existing accounts may have different codes. Resource IDs are the universal identifier.
|
|
84
84
|
|
|
85
85
|
### Bulk Upsert (Items, Contacts & Rates)
|
|
@@ -442,9 +442,9 @@ Bills, invoices, and credit notes share identical mandatory field specs. Adding
|
|
|
442
442
|
|
|
443
443
|
139. **`validate_drafts` per-result enrichment (MID7)** — every entry in `results[]` now carries two extra slices alongside the existing `eligible` / `errors[]` / `displayData[]`: (a) **`contactSignals`** — full Mid-7 insight (cadence, outliers, severity, divergences, outstanding balance) computed against the draft's contact history. Null when the draft has no contact, the draft is ineligible, or the contact has no qualifying history in the 12-month window. Same shape as `get_contact_signals` but populated WITH the always-empty-on-GET slices (severitySummary, outlierFlags, revealedDivergences) — those compare the draft against the contact's modal pattern. (b) **`breakdown`** — full Balance-panel payload (`items[]` + `meta` with subtotal / tax / total / paymentRecorded / balance / exchangeRate). Use breakdown to surface the trx-level metadata an agent needs for "show me what this draft looks like" questions without a separate `get_invoice` / `get_bill` call. Top-level: `eligibleCount`, `ineligibleCount`, `columns` / `errorColumns` (table render hints), and `contactSignalsMeta.unavailable=true` when the freshness layer was offline for the whole batch (per-result `contactSignals` will all be null). Wire response uses legacy field names `contactInsight` (per-result) and `contactInsightsMeta` (top-level); motherboard's API client renames both to `contactSignals` / `contactSignalsMeta` for consistency with `get_contact_signals`.
|
|
444
444
|
|
|
445
|
-
140. **IFRS 18 accountType values (effective 2027)** — `create_account` / `update_account` / `bulk_upsert_chart_of_accounts` accept the 9 IFRS 18 classification types alongside the
|
|
445
|
+
140. **IFRS 18 accountType values (effective 2027)** — `create_account` / `update_account` / `bulk_upsert_chart_of_accounts` accept the 9 IFRS 18 classification types alongside the 14 pre-IFRS-18 types (23 in total, listed in rule 21): **Discontinued Expense**, **Discontinued Income**, **Finance Cost**, **Financing Income**, **Goodwill**, **Income Tax Expense**, **Investing Expense**, **Investing Income**, **Investment**. `normalizeAccountType` (in `core/api/guards.ts`) maps unambiguous variants client-side: "income tax" / "tax expense" → "Income Tax Expense", "finance costs" → "Finance Cost", "investments" → "Investment". **Ambiguous variants are intentionally NOT auto-mapped** — under IFRS 18, "interest expense" can land in EITHER Finance Cost (financing activities) OR Operating / Investing Expense depending on the entity's main business activity, and "interest income" can land in EITHER Financing Income OR Investing Income. The agent must pick the explicit canonical string for those cases instead of relying on a guess that could misclassify the account. Pass any value to `accountType` (POST/PUT will receive it as `classificationType` per rule 21). The classic types still work — IFRS 18 is purely additive.
|
|
446
446
|
|
|
447
|
-
141. **`bulk_upsert_chart_of_accounts` — sync bulk-upsert with PARTIAL_SUCCESS** — wraps `POST /api/v1/chart-of-accounts/bulk-upsert` (max 500 per call). Returns synchronously (no jobId polling): `{ resourceIds: string[], failedRows: ImportedRowError[], failedCount: number }` per rule 136. Each successful row contributes one `resourceId`; each failure surfaces a `failedRows[]` entry with `rowIndex` (1-based per the API), `columnName`, `columnValue`, `errorCode`, `errorMessage`. **Dedup is by NAME, not code** — collisions emit `ORGANIZATION_CHART_OF_ACCOUNT_DUPLICATED` per row (other rows in the batch still succeed). Provide `resourceId` per account to update; omit to create. Accepts the
|
|
447
|
+
141. **`bulk_upsert_chart_of_accounts` — sync bulk-upsert with PARTIAL_SUCCESS** — wraps `POST /api/v1/chart-of-accounts/bulk-upsert` (max 500 per call). Returns synchronously (no jobId polling): `{ resourceIds: string[], failedRows: ImportedRowError[], failedCount: number }` per rule 136. Each successful row contributes one `resourceId`; each failure surfaces a `failedRows[]` entry with `rowIndex` (1-based per the API), `columnName`, `columnValue`, `errorCode`, `errorMessage`. **Dedup is by NAME, not code** — collisions emit `ORGANIZATION_CHART_OF_ACCOUNT_DUPLICATED` per row (other rows in the batch still succeed). Provide `resourceId` per account to update; omit to create. Accepts the all 23 `accountType` values per rules 21 and 140 (variants normalized client-side). For one-off creates with auto-dedup-on-name (returns existing if found), use `create_account` instead. CLI counterpart: `clio accounts bulk-upsert --input <file.json>`.
|
|
448
448
|
|
|
449
449
|
142. **`capsuleRecipe` payload is mutually exclusive with `capsuleResourceId`** on trigger mutations (create/update of invoice, bill, journal, cash_in, cash_out). Use `capsuleRecipe` to CREATE a new capsule via the recipe engine; use `capsuleResourceId` to ATTACH a base-trx to an existing capsule. Sending both returns 422 (`excluded_with` validator).
|
|
450
450
|
|
|
@@ -33,14 +33,18 @@ Common `error_type` values:
|
|
|
33
33
|
## Chart of Accounts Errors
|
|
34
34
|
|
|
35
35
|
### "Account Classification Type not found" (400)
|
|
36
|
-
**Cause**: `classificationType` value doesn't match one of the
|
|
37
|
-
**Wrong values we tried**: `"Revenue"`, `"REVENUE"`, `"revenue"`, `"INCOME"`, `"OPERATING_REVENUE"`, `"Sales"`, `"Asset"`, `"ASSET"`
|
|
36
|
+
**Cause**: `classificationType` value doesn't match one of the 23 valid values.
|
|
37
|
+
**Wrong values we tried**: `"Revenue"`, `"REVENUE"`, `"revenue"`, `"INCOME"`, `"OPERATING_REVENUE"`, `"Sales"`, `"Asset"`, `"ASSET"`, `"Operating Expenses"` (plural), `"Cost of Goods Sold"` (an account NAME — the type is `"Direct Costs"`)
|
|
38
38
|
**Fix**: Use the exact `accountType` values from GET response:
|
|
39
39
|
```
|
|
40
|
-
"Bank Accounts", "Cash", "Current Asset", "
|
|
41
|
-
"
|
|
42
|
-
"
|
|
40
|
+
"Bank Accounts", "Cash", "Current Asset", "Non-current Asset", "Fixed Asset",
|
|
41
|
+
"Inventory", "Investment", "Goodwill", "Current Liability",
|
|
42
|
+
"Non-current Liability", "Shareholders Equity", "Operating Revenue",
|
|
43
|
+
"Other Revenue", "Discontinued Income", "Financing Income", "Investing Income",
|
|
44
|
+
"Direct Costs", "Operating Expense", "Other Expense", "Finance Cost",
|
|
45
|
+
"Investing Expense", "Income Tax Expense", "Discontinued Expense"
|
|
43
46
|
```
|
|
47
|
+
Or call `list_account_classifications` — authoritative for that organisation.
|
|
44
48
|
**Key insight**: `classificationType` in POST uses the same values as `accountType` from GET. NOT `accountClass` values (which are broader: Asset, Liability, Equity, Revenue, Expense).
|
|
45
49
|
|
|
46
50
|
### "ORGANIZATION_CHART_OF_ACCOUNT_DUPLICATED" (400)
|
|
@@ -109,13 +109,26 @@ When POSTing, `classificationType` must be one of these exact strings (same as `
|
|
|
109
109
|
| `"Current Asset"` | Asset |
|
|
110
110
|
| `"Fixed Asset"` | Asset |
|
|
111
111
|
| `"Inventory"` | Asset |
|
|
112
|
+
| `"Non-current Asset"` | Asset |
|
|
113
|
+
| `"Investment"` | Asset |
|
|
114
|
+
| `"Goodwill"` | Asset |
|
|
112
115
|
| `"Current Liability"` | Liability |
|
|
113
116
|
| `"Non-current Liability"` | Liability |
|
|
114
117
|
| `"Shareholders Equity"` | Equity |
|
|
115
118
|
| `"Operating Revenue"` | Revenue |
|
|
116
119
|
| `"Other Revenue"` | Revenue |
|
|
120
|
+
| `"Discontinued Income"` | Revenue |
|
|
121
|
+
| `"Financing Income"` | Revenue |
|
|
122
|
+
| `"Investing Income"` | Revenue |
|
|
117
123
|
| `"Operating Expense"` | Expense |
|
|
124
|
+
| `"Other Expense"` | Expense |
|
|
118
125
|
| `"Direct Costs"` | Expense |
|
|
126
|
+
| `"Finance Cost"` | Expense |
|
|
127
|
+
| `"Investing Expense"` | Expense |
|
|
128
|
+
| `"Income Tax Expense"` | Expense |
|
|
129
|
+
| `"Discontinued Expense"` | Expense |
|
|
130
|
+
|
|
131
|
+
COGS maps to `"Direct Costs"` — "Cost of Goods Sold" is the default account name shipped in the CoA template, not a type.
|
|
119
132
|
|
|
120
133
|
### Account Create (POST /chart-of-accounts) Fields
|
|
121
134
|
|
|
@@ -55,20 +55,44 @@ Used by: invoices, bills, credit notes, journals, items, scheduled transactions,
|
|
|
55
55
|
|
|
56
56
|
### accountType (Chart of Accounts)
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
|
58
|
+
23 values. Source: `GET /api/v1/account-classifications` (`list_account_classifications`),
|
|
59
|
+
which is authoritative. The set is GLOBAL — the same 23 for every organisation
|
|
60
|
+
(the classifications table has no org column) — so this is a stable list, not a
|
|
61
|
+
per-tenant one. This table mirrors the CLI's canonical
|
|
62
|
+
account-type list and is kept in step with it by an automated drift check.
|
|
63
|
+
|
|
64
|
+
**Singular, and not the account's name.** An earlier version of this table listed
|
|
65
|
+
pluralized inventions (`Current Assets`, `Operating Expenses`, `Other Expenses`)
|
|
66
|
+
plus `Cost of Goods Sold`, which is an account NAME whose type is `Direct Costs`.
|
|
67
|
+
A wrong value returns **zero rows with no error**, which reads exactly like "the
|
|
68
|
+
org has no such account". `search_accounts` does not normalise — only
|
|
69
|
+
`create_account` does.
|
|
70
|
+
|
|
71
|
+
| Value | accountClass |
|
|
72
|
+
|-------|--------------|
|
|
73
|
+
| `Bank Accounts` | Asset |
|
|
74
|
+
| `Cash` | Asset |
|
|
75
|
+
| `Current Asset` | Asset |
|
|
76
|
+
| `Non-current Asset` | Asset |
|
|
77
|
+
| `Fixed Asset` | Asset |
|
|
78
|
+
| `Inventory` | Asset |
|
|
79
|
+
| `Investment` | Asset |
|
|
80
|
+
| `Goodwill` | Asset |
|
|
81
|
+
| `Current Liability` | Liability |
|
|
82
|
+
| `Non-current Liability` | Liability |
|
|
83
|
+
| `Shareholders Equity` | Equity |
|
|
84
|
+
| `Operating Revenue` | Revenue |
|
|
85
|
+
| `Other Revenue` | Revenue |
|
|
86
|
+
| `Discontinued Income` | Revenue |
|
|
87
|
+
| `Financing Income` | Revenue |
|
|
88
|
+
| `Investing Income` | Revenue |
|
|
89
|
+
| `Direct Costs` | Expense |
|
|
90
|
+
| `Operating Expense` | Expense |
|
|
91
|
+
| `Other Expense` | Expense |
|
|
92
|
+
| `Finance Cost` | Expense |
|
|
93
|
+
| `Investing Expense` | Expense |
|
|
94
|
+
| `Income Tax Expense` | Expense |
|
|
95
|
+
| `Discontinued Expense` | Expense |
|
|
72
96
|
|
|
73
97
|
---
|
|
74
98
|
|
|
@@ -185,7 +209,7 @@ Used by: invoices, bills, credit notes, journals, items, scheduled transactions,
|
|
|
185
209
|
|-------|-------------|
|
|
186
210
|
| `status` | `ACTIVE`, `INACTIVE` |
|
|
187
211
|
| `accountClass` | `Asset`, `Liability`, `Equity`, `Revenue`, `Expense` |
|
|
188
|
-
| `accountType` | See
|
|
212
|
+
| `accountType` | See the 23 values in Universal Enums above |
|
|
189
213
|
| `appliesTo` | `Sales & Sale Credits`, `Purchases & Purchase Credits`, `Payments` |
|
|
190
214
|
| `controlFlag` | `true`, `false` (BooleanExpression) |
|
|
191
215
|
|
|
@@ -45,7 +45,9 @@ Source systems use different classification names. Map to Jaz types:
|
|
|
45
45
|
| Operating Expenses | Operating Expense |
|
|
46
46
|
| Other Income | Other Revenue |
|
|
47
47
|
|
|
48
|
-
**Valid `classificationType` values (exactly
|
|
48
|
+
**Valid `classificationType` values (exactly 23):** Bank Accounts, Cash, Current Asset, Non-current Asset, Fixed Asset, Inventory, Investment, Goodwill, Current Liability, Non-current Liability, Shareholders Equity, Operating Revenue, Other Revenue, Discontinued Income, Financing Income, Investing Income, Direct Costs, Operating Expense, Other Expense, Finance Cost, Investing Expense, Income Tax Expense, Discontinued Expense
|
|
49
|
+
|
|
50
|
+
The set is GLOBAL (identical for every org). Confirm with `list_account_classifications` using `limit: 100` — its default page size is 20 and there are 23 types.
|
|
49
51
|
|
|
50
52
|
### Clearing Account Creation
|
|
51
53
|
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
### Platform tools — current/non-current reclassification (manual annual journals)
|
|
22
22
|
- **`search_capsules(filter: {capsuleType: {eq: 'Loan Repayment'}})`** + per-capsule `clio calc loan` to compute next-12-months principal portion.
|
|
23
23
|
- **`search_capsules(filter: {capsuleType: {eq: 'Lease'}})`** + per-capsule `clio calc lease` for IFRS 16 reclassification.
|
|
24
|
-
- **`create_journal(...)`** for the reclassification entries (Dr Loan Payable Non-
|
|
24
|
+
- **`create_journal(...)`** for the reclassification entries (Dr Loan Payable Non-current / Cr Loan Payable Current; Dr Lease Liability Non-current / Cr Lease Liability Current).
|
|
25
25
|
|
|
26
26
|
### Handoff to audit-prep
|
|
27
27
|
- See `audit-prep.md` — year-end-close hands off to the audit-prep job, which produces the report pack + supporting schedules + audit analyses.
|
|
@@ -166,14 +166,14 @@ create_journal({
|
|
|
166
166
|
valueDate: '2025-12-31',
|
|
167
167
|
reference: 'YE-RECLASS-LOAN-<facility>',
|
|
168
168
|
journalEntries: [
|
|
169
|
-
{ accountResourceId: <Loan Payable Non-
|
|
169
|
+
{ accountResourceId: <Loan Payable Non-current>, amount: <next-12mo-principal>, type: 'DEBIT' },
|
|
170
170
|
{ accountResourceId: <Loan Payable Current>, amount: <next-12mo-principal>, type: 'CREDIT' }
|
|
171
171
|
],
|
|
172
172
|
saveAsDraft: false
|
|
173
173
|
})
|
|
174
174
|
```
|
|
175
175
|
|
|
176
|
-
Mirror for IFRS 16 lease liability (`Lease Liability Non-
|
|
176
|
+
Mirror for IFRS 16 lease liability (`Lease Liability Non-current` → `Lease Liability Current`).
|
|
177
177
|
|
|
178
178
|
### Y7 — Final TB + draft gate + report pack handoff
|
|
179
179
|
|
|
@@ -94,7 +94,7 @@ For gain (proceeds > NBV): engine debits Cash, debits Accum Dep, credits Vehicle
|
|
|
94
94
|
### Step 3 — Resolve dependencies
|
|
95
95
|
|
|
96
96
|
For each account in `requiredAccounts`:
|
|
97
|
-
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: asset → `Non-
|
|
97
|
+
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: asset → `Non-current Asset`; accum dep → `Non-current Asset` contra; **`Gain on Disposal` → `Other Revenue`** (NOT Operating Revenue per IAS 16.71); `Loss on Disposal` → `Other Expense` (or `Operating Expense`, jurisdiction-specific).
|
|
98
98
|
|
|
99
99
|
Bank account: resolve via `list_bank_accounts()` if the bank account resourceId isn't already known. For scrap (no proceeds): `bankAccountResourceId` is required only if there's a disposal-cost cash-out (e.g., scrap fee paid to disposal vendor) — pass it for safety even if proceeds are zero.
|
|
100
100
|
|
|
@@ -68,7 +68,7 @@ Returns: `RecipePlan` with `requiredAccounts`, `needsContact: true`, `steps[0]`
|
|
|
68
68
|
### Step 3 — Resolve dependencies
|
|
69
69
|
|
|
70
70
|
For every account in `requiredAccounts`:
|
|
71
|
-
- `search_accounts(filter: {name: {eq: <accountName>}})`. If empty, halt: "Loan recipe references GL account `<accountName>` not in CoA. Create via `create_account` (suggested classifications: `Loan Payable` → `Non-
|
|
71
|
+
- `search_accounts(filter: {name: {eq: <accountName>}})`. If empty, halt: "Loan recipe references GL account `<accountName>` not in CoA. Create via `create_account` (suggested classifications: `Loan Payable` → `Non-current Liability`; `Interest Expense` → `Operating Expense`) or remap the account before retry."
|
|
72
72
|
|
|
73
73
|
If `bankAccountResourceId` resolution failed:
|
|
74
74
|
- `list_bank_accounts()`, match by `name + currency`. If still no match: halt and surface it.
|
|
@@ -143,7 +143,7 @@ After the FINAL period (60th repayment) is finalized:
|
|
|
143
143
|
- **Interest-only period:** Not supported by the loan calculator. Workaround: post N manual interest-only journals via `create_journal` (Dr Interest Expense / Cr Cash) for the interest-only window, then run `plan_recipe(recipe: 'loan', ...)` from the start of the amortizing window with the full outstanding principal.
|
|
144
144
|
- **Multi-currency loan (USD loan with SGD base):** Pass `currency: 'USD'`. Disbursement records via `currency: { sourceCurrency: 'USD' }` per `jaz-api/SKILL.md` rule 25. Monthly repayments stay in USD. Period-end FX revaluation against base currency is auto-handled by Jaz (Loan Payable is a monetary item per IAS 21.23 — Jaz auto-translates at closing rate). Verify via the month-end close FX verification flow; do NOT invoke `execute_recipe(recipe: 'fx-reval', ...)`.
|
|
145
145
|
- **Loan origination fees:** Out of scope for this recipe (the engine's IFRS 9 effective-interest treatment doesn't currently amortize fees into the EIR). Post fees as a separate manual journal: Dr `Operating Expense > Loan Origination Fee` / Cr Cash. For IFRS 9 EIR-amortized fees, model the fee as `prepaid-expense` over the loan term.
|
|
146
|
-
- **Year-end current/non-current reclassification:** Out of scope for the engine — manual annual journal: Dr Loan Payable Non-
|
|
146
|
+
- **Year-end current/non-current reclassification:** Out of scope for the engine — manual annual journal: Dr Loan Payable Non-current / Cr Loan Payable Current for the next 12 months' principal portion. Job blueprint `jobs/references/year-end-close.md` Y6 covers this.
|
|
147
147
|
|
|
148
148
|
---
|
|
149
149
|
|
|
@@ -254,15 +254,15 @@ Each recipe lists the specific CoA accounts needed. Common patterns:
|
|
|
254
254
|
| Prepaid Expenses | Asset | Current Asset | Prepaid amortization |
|
|
255
255
|
| Deferred Revenue | Liability | Current Liability | Deferred revenue |
|
|
256
256
|
| Accrued Expenses | Liability | Current Liability | Accrued expenses |
|
|
257
|
-
| Loan Payable | Liability | Non-
|
|
257
|
+
| Loan Payable | Liability | Non-current Liability | Bank loan |
|
|
258
258
|
| Loan Payable (Current) | Liability | Current Liability | Bank loan (current portion) |
|
|
259
259
|
| Interest Expense | Expense | Expense | Bank loan, IFRS 16 |
|
|
260
|
-
| Right-of-Use Asset | Asset | Non-
|
|
261
|
-
| Lease Liability | Liability | Non-
|
|
260
|
+
| Right-of-Use Asset | Asset | Non-current Asset | IFRS 16 |
|
|
261
|
+
| Lease Liability | Liability | Non-current Liability | IFRS 16 |
|
|
262
262
|
| Lease Liability (Current) | Liability | Current Liability | IFRS 16 |
|
|
263
|
-
| Accumulated Depreciation | Asset | Non-
|
|
263
|
+
| Accumulated Depreciation | Asset | Non-current Asset | Declining balance, Capital WIP |
|
|
264
264
|
| Depreciation Expense | Expense | Expense | Declining balance, Capital WIP |
|
|
265
|
-
| FX Unrealized Gain | Revenue | Other
|
|
265
|
+
| FX Unrealized Gain | Revenue | Other Revenue | FX revaluation |
|
|
266
266
|
| FX Unrealized Loss | Expense | Other Expense | FX revaluation |
|
|
267
267
|
| Bad Debt Expense | Expense | Expense | ECL provision |
|
|
268
268
|
| Allowance for Doubtful Debts | Asset | Current Asset (contra) | ECL provision |
|
|
@@ -271,12 +271,12 @@ Each recipe lists the specific CoA accounts needed. Common patterns:
|
|
|
271
271
|
| Bonus Expense | Expense | Expense | Employee accruals |
|
|
272
272
|
| Accrued Bonus Liability | Liability | Current Liability | Employee accruals |
|
|
273
273
|
| Provision Expense | Expense | Expense | IAS 37 provisions |
|
|
274
|
-
| Provision for Obligations | Liability | Non-
|
|
274
|
+
| Provision for Obligations | Liability | Non-current Liability | IAS 37 provisions |
|
|
275
275
|
| Finance Cost — Unwinding | Expense | Expense | IAS 37 provisions, Lease |
|
|
276
276
|
| Retained Earnings | Equity | Retained Earnings | Dividends |
|
|
277
277
|
| Dividends Payable | Liability | Current Liability | Dividends |
|
|
278
278
|
| Intercompany Receivable | Asset | Current Asset | Intercompany |
|
|
279
279
|
| Intercompany Payable | Liability | Current Liability | Intercompany |
|
|
280
|
-
| Capital Work-in-Progress | Asset | Non-
|
|
280
|
+
| Capital Work-in-Progress | Asset | Non-current Asset | Capital WIP |
|
|
281
281
|
|
|
282
282
|
**API:** `POST /chart-of-accounts` or `POST /chart-of-accounts/bulk-upsert`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Recipe: Capital Work-in-Progress (CWIP) → Fixed Asset (manual — no engine)
|
|
2
2
|
|
|
3
|
-
> Multi-month asset construction pattern: accumulate construction costs in `Capital Work-in-Progress` (Non-
|
|
3
|
+
> Multi-month asset construction pattern: accumulate construction costs in `Capital Work-in-Progress` (Non-current Asset) via bills coded to CWIP, then transfer the accumulated cost to a Jaz native FA on completion. No recipe engine — built from primitive `create_bill` + `create_journal` + `create_fixed_asset`. The CWIP-to-FA transfer triggers Jaz's auto-depreciation (SL).
|
|
4
4
|
|
|
5
5
|
## Why no engine
|
|
6
6
|
|
|
@@ -38,7 +38,7 @@ search_accounts(filter: {name: {in: ['Capital Work-in-Progress', 'Office Improve
|
|
|
38
38
|
|
|
39
39
|
`Capital Work-in-Progress` is the holding account. The eventual FA destination (`Office Improvements`, `Buildings`, `Plant & Equipment`, etc.) and its corresponding accumulated depreciation account both need to exist before completion-time transfer.
|
|
40
40
|
|
|
41
|
-
If `Capital Work-in-Progress` doesn't exist: `create_account(name: 'Capital Work-in-Progress', accountType: 'Non-
|
|
41
|
+
If `Capital Work-in-Progress` doesn't exist: `create_account(name: 'Capital Work-in-Progress', accountType: 'Non-current Asset')` first. CRITICAL: classify as Non-current Asset (not Operating Expense) — the whole point of CWIP is to defer expense recognition.
|
|
42
42
|
|
|
43
43
|
### Step 1 — Create the project capsule
|
|
44
44
|
|
|
@@ -188,7 +188,7 @@ Close the project capsule (or keep ACTIVE for traceability — the FA still refe
|
|
|
188
188
|
|
|
189
189
|
| Source | Error | Recovery |
|
|
190
190
|
|--------|-------|----------|
|
|
191
|
-
| Step 0 | `Capital Work-in-Progress` doesn't exist as Non-
|
|
191
|
+
| Step 0 | `Capital Work-in-Progress` doesn't exist as Non-current Asset | `create_account(accountType: 'Non-current Asset')`. Common gap in CoAs that haven't done capital projects. |
|
|
192
192
|
| Step 2 | Bill posted to Operating Expense instead of CWIP | Reverse via `delete_bill` (if DRAFT) OR `create_supplier_credit_note` + `apply_credit_to_bill` (if ACTIVE). Re-post correctly. AVOID year-end audit headache — auditor will challenge any P&L expense for capital project items. |
|
|
193
193
|
| Step 4b | Transfer journal unbalanced | Verify the `amount` on both lines exactly matches the closing CWIP balance from step 4a. Per `jaz-api/SKILL.md` rule 23 — total debits = total credits. |
|
|
194
194
|
| Step 4c | `create_fixed_asset` 422 `cost_mismatch` | Cost passed differs from the transfer journal amount. Both must equal CWIP closing balance. Re-pull `generate_general_ledger` and re-confirm. |
|
|
@@ -72,7 +72,7 @@ Returns `RecipePlan` with `requiredAccounts: ['Vehicles', 'Accumulated Depreciat
|
|
|
72
72
|
### Step 3 — Resolve dependencies
|
|
73
73
|
|
|
74
74
|
For each account in `requiredAccounts`:
|
|
75
|
-
- `search_accounts(filter: {name: {eq: <accountName>}})`. If empty: halt. Suggested classifications: asset GL → `Non-
|
|
75
|
+
- `search_accounts(filter: {name: {eq: <accountName>}})`. If empty: halt. Suggested classifications: asset GL → `Non-current Asset`; accumulated depreciation → `Non-current Asset` (contra); expense → `Operating Expense`.
|
|
76
76
|
|
|
77
77
|
NO contact resolution (depreciation has no counterparty). NO bank account resolution.
|
|
78
78
|
|
|
@@ -73,7 +73,7 @@ Returns `RecipePlan` with `requiredAccounts: ['Fixed Deposit Receivable', 'Accru
|
|
|
73
73
|
### Step 3 — Resolve dependencies
|
|
74
74
|
|
|
75
75
|
For each account in `requiredAccounts`:
|
|
76
|
-
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Fixed Deposit Receivable` → `Current Asset` (≤12-month FD) OR `Non-
|
|
76
|
+
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Fixed Deposit Receivable` → `Current Asset` (≤12-month FD) OR `Non-current Asset` (>12-month); `Accrued Interest Receivable` → `Current Asset`; `Interest Income` → `Other Revenue`.
|
|
77
77
|
|
|
78
78
|
Bank account: resolve `bankAccountResourceId` for the disbursement bank (where the cash leaves to placement). Should be the actual operational bank account, NOT the FD account itself — the FD becomes its own balance-sheet line, separate from cash.
|
|
79
79
|
|
|
@@ -76,7 +76,7 @@ Returns `RecipePlan` with:
|
|
|
76
76
|
### Step 3 — Resolve dependencies
|
|
77
77
|
|
|
78
78
|
For each account in `requiredAccounts`:
|
|
79
|
-
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Right-of-Use Asset` → `Non-
|
|
79
|
+
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Right-of-Use Asset` → `Non-current Asset`; `Lease Liability` → `Non-current Liability`; `Interest Expense — Leases` → `Operating Expense`. The Depreciation Expense + Accumulated Depreciation accounts are FA-register defaults — Jaz uses standard ones unless overridden.
|
|
80
80
|
|
|
81
81
|
Lessor:
|
|
82
82
|
- `search_contacts(filter: {supplier: true, name: {eq: 'Marina One Holdings'}})`. If empty: `create_contact(supplier: true, ...)`.
|
|
@@ -164,7 +164,7 @@ After the FINAL period (month 36):
|
|
|
164
164
|
- **Variable rent** (CPI-linked, turnover-linked): NOT supported by initial recipe. Recompute PV at each reset event and re-measure manually.
|
|
165
165
|
- **Multi-currency lease** (USD payments from SGD bank): pass `currency: 'USD'`. ROU + Lease Liability denominate in USD; Jaz auto-translates BS balances at closing rate per IAS 21.23 (do NOT invoke `fx-reval` recipe).
|
|
166
166
|
- **Lease with prepayments** (initial payment at signing): post the prepayment as `create_cash_out_entry` against ROU Asset BEFORE invoking the recipe. The recipe's PV calculation should exclude the upfront payment portion.
|
|
167
|
-
- **Year-end current/non-current reclassification**: Out of scope for the engine. Manual annual journal: Dr Lease Liability (Non-
|
|
167
|
+
- **Year-end current/non-current reclassification**: Out of scope for the engine. Manual annual journal: Dr Lease Liability (Non-current) / Cr Lease Liability (Current) for the next 12 months' principal portion. Job blueprint `jobs/references/year-end-close.md` Y6 covers this.
|
|
168
168
|
|
|
169
169
|
---
|
|
170
170
|
|
|
@@ -73,7 +73,7 @@ Returns `RecipePlan` with `requiredAccounts: ['Provision for Warranties', 'Warra
|
|
|
73
73
|
### Step 3 — Resolve dependencies
|
|
74
74
|
|
|
75
75
|
For each account in `requiredAccounts`:
|
|
76
|
-
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Provision for Warranties` → `Non-
|
|
76
|
+
- `search_accounts(filter: {name: {eq: <accountName>}})`. Suggested classifications: `Provision for Warranties` → `Non-current Liability` (or `Current Liability` if settlement < 12 months); `Warranty Expense` → `Operating Expense` (P&L, period of recognition); `Finance Cost` → `Operating Expense` or `Other Expense` (jurisdiction-specific; SG often `Other Expense`).
|
|
77
77
|
|
|
78
78
|
Bank account: only needed for the settlement cash-out at the end of the term.
|
|
79
79
|
|
|
@@ -135,7 +135,7 @@ If actual settlement amount differs from estimated $500,000 (highly likely for w
|
|
|
135
135
|
| `plan_recipe` | 422 `unsupported_recipe` | Use canonical engine name `provision` (not `provisions`). |
|
|
136
136
|
| `plan_recipe` | 422 `term_too_short` | Provision must span ≥ 2 periods (otherwise PV unwinding is immaterial). For short-term provisions (settlement < 6 months): post directly via `create_journal` at face value, no PV needed. |
|
|
137
137
|
| `plan_recipe` | 422 `rate_invalid` | Discount rate must be > 0. Per IAS 37.47, use a pre-tax rate reflecting current market + obligation-specific risks. SG: typically gov't bond rate + risk premium. |
|
|
138
|
-
| `execute_recipe` | 422 `account_not_found` for `Finance Cost` | Step 3 incomplete. Create via `create_account(accountType: '
|
|
138
|
+
| `execute_recipe` | 422 `account_not_found` for `Finance Cost` | Step 3 incomplete. Create via `create_account(accountType: 'Finance Cost', name: 'Finance Cost')`. Note `Finance Cost` is both a valid account TYPE and the account NAME here — the error refers to the missing account, not a bad type. |
|
|
139
139
|
| Step 6 remeasurement | Recipe doesn't natively support mid-life remeasurement | Manual journal + delete remaining DRAFT unwinding journals + re-execute recipe for remaining term. |
|
|
140
140
|
| Step 7 actual settlement ≠ estimated | (always, for real-world provisions) | Edit settlement cash-out via `update_cash_out_entry` before finalizing, post true-up journal for the delta. |
|
|
141
141
|
| Provision presented as Operating Expense vs Finance Cost confusion | (presentation) | Per IAS 37.84, the unwinding charge is presented in P&L as a Finance Cost (separate from the recognition expense which is Operating Expense). Practitioner judgment if jurisdiction disagrees. |
|