jaz-clio 5.36.9 → 5.36.11
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 +2 -2
- package/assets/skills/api/references/endpoints.md +4 -2
- package/assets/skills/api/references/errors.md +2 -2
- package/assets/skills/api/references/field-map.md +1 -1
- package/assets/skills/cli/SKILL.md +1 -1
- package/assets/skills/cli/references/command-catalog.md +2 -2
- package/assets/skills/cli/references/common-workflows.md +6 -2
- package/assets/skills/conversion/SKILL.md +1 -1
- package/assets/skills/conversion/references/mapping-rules.md +1 -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/transaction-recipes/SKILL.md +1 -1
- package/cli.mjs +375 -375
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jaz-api
|
|
3
|
-
version: 5.36.
|
|
3
|
+
version: 5.36.11
|
|
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, 158 production gotchas, error
|
|
@@ -174,7 +174,7 @@ The rest of this skill — field names, gotchas, error catalog, dependency order
|
|
|
174
174
|
46. **Known API bugs (500s)**: Contact groups PUT (nil pointer on search response), custom fields PUT (dangling stack pointers in mapping), capsules POST (upstream returns nil), catalogs POST, inventory balances by status GET (`/inventory-balances/:status`, missing `c.Bind`) — all return 500.
|
|
175
175
|
47. **Non-existent endpoints**: `POST /deposits`, `POST /inventory/adjustments`, `GET /payments` (list), and `POST /payments/search` return 404 — these endpoints are not implemented. To list/search payments, use `POST /cashflow-transactions/search` (the unified transaction ledger — see Rule 63).
|
|
176
176
|
48. **Attachments — full CRUD**: **Add**: `POST /:type/:id/attachments` (multipart, `file` field, `application/pdf` or `image/*` — NOT `text/plain`). **List**: `GET /:type/:id/attachments`. **Delete**: `DELETE /:type/:id/attachments/:attachmentResourceId` (HTTP 200). CLI: `clio attachments add --file <path>` or `--url <url>`, `clio attachments list`, `clio attachments delete <attachmentResourceId>`. **Response shape is non-standard**: `{ reference, resourceId, attachments: [{fileName, fileType, fileId, attachmentResourceId}] }` — NOT `{ data: [...] }`. The attachment ID field is `attachmentResourceId` (not `resourceId`).
|
|
177
|
-
49. **Currency rate direction: `rate` = functionalToSource (1 base = X foreign)** — POST `rate: 0.74` for a SGD org means 1 SGD = 0.74 USD. **If your data stores rates as "1 USD = 1.35 SGD" (sourceToFunctional), you MUST invert: `rate = 1 / 1.35 = 0.74`.** GET confirms both: `rateFunctionalToSource` (what you POSTed) and `rateSourceToFunctional` (the inverse). **You do not have to do the arithmetic**: `add_currency_rate`, `update_currency_rate` and the `currency` object on the 8 FX create tools (invoice, bill, journal, both credit notes, both cash entries, TTB) accept an optional `rateDirection` (`FUNCTIONAL_TO_SOURCE` | `SOURCE_TO_FUNCTIONAL
|
|
177
|
+
49. **Currency rate direction: `rate` = functionalToSource (1 base = X foreign)** — POST `rate: 0.74` for a SGD org means 1 SGD = 0.74 USD. **If your data stores rates as "1 USD = 1.35 SGD" (sourceToFunctional), you MUST invert: `rate = 1 / 1.35 = 0.74`.** GET confirms both: `rateFunctionalToSource` (what you POSTed) and `rateSourceToFunctional` (the inverse). **You do not have to do the arithmetic**: `add_currency_rate`, `update_currency_rate` and the `currency` object on the 8 FX create tools (invoice, bill, journal, both credit notes, both cash entries, TTB) accept an optional `rateDirection` (`FUNCTIONAL_TO_SOURCE` | `SOURCE_TO_FUNCTIONAL`) — declare how your figure reads and pass it verbatim. Omitting it always means `FUNCTIONAL_TO_SOURCE`. The two families differ only in where the label is applied: the rate-table tools (plus `bulk_upsert_currency_rates`) send it on the wire and the server applies it, while the 8 FX create tools have no such field, so the client inverts and strips it there. Prefer either to inverting by hand: a wrong inversion is silent and wrong by rate². `clio calc fx-reval` REQUIRES the direction — that calculator historically assumed the opposite convention to the API.
|
|
178
178
|
|
|
179
179
|
### Search & Filter
|
|
180
180
|
50. **Search endpoint universal pattern** — All 32 `POST /*/search` endpoints share identical structure: `{ filter?, sort: { sortBy: ["field"], order: "ASC"|"DESC" }, limit: 1-1000, offset: 0-65536 }`. `offset` is a 0-indexed page number (not row-skip). Sort is REQUIRED when offset is present (even `offset: 0`). Default limit: 100. `sortBy` is always an array on all endpoints (no exceptions). See `references/search-reference.md` for per-endpoint filter/sort fields.
|
|
@@ -307,7 +307,7 @@ Enable currencies first, then set rates via the **separate** rate endpoints belo
|
|
|
307
307
|
**CRITICAL**: Response `data` is a **plain string** `"Rate added successfully"` — NOT a CurrencyRate object. You do NOT get back a `resourceId`. If you need the rate's `resourceId` (e.g., for later PUT/DELETE), you must follow up with `GET /organization/currencies/:code/rates` and match by `rateApplicableFrom` date.
|
|
308
308
|
|
|
309
309
|
**Required fields**:
|
|
310
|
-
- `rate` — positive number (must be > 0). Direction is **functionalToSource** (1 base = X foreign). Example for SGD org setting USD rate: `rate: 0.74` means 1 SGD = 0.74 USD. **If your data is sourceToFunctional (1 USD = 1.35 SGD), invert: `rate = 1 / yourRate`.** You do not have to do this by hand: pass your figure as-is with `rateDirection` (`FUNCTIONAL_TO_SOURCE` | `SOURCE_TO_FUNCTIONAL`)
|
|
310
|
+
- `rate` — positive number (must be > 0). Direction is **functionalToSource** (1 base = X foreign). Example for SGD org setting USD rate: `rate: 0.74` means 1 SGD = 0.74 USD. **If your data is sourceToFunctional (1 USD = 1.35 SGD), invert: `rate = 1 / yourRate`.** You do not have to do this by hand: pass your figure as-is with `rateDirection` (`FUNCTIONAL_TO_SOURCE` | `SOURCE_TO_FUNCTIONAL`), which this endpoint accepts natively and applies server-side. Omitting it means `FUNCTIONAL_TO_SOURCE`. See SKILL.md Rule 49.
|
|
311
311
|
- `rateApplicableFrom` — `YYYY-MM-DD` string (NOT ISO datetime — `"2026-02-10T00:00:00Z"` is rejected with "does not match 2006-01-02 format")
|
|
312
312
|
|
|
313
313
|
**Optional fields**:
|
|
@@ -337,6 +337,8 @@ Enable currencies first, then set rates via the **separate** rate endpoints belo
|
|
|
337
337
|
|
|
338
338
|
#### PUT /api/v1/organization/currencies/:currencyCode/rates/:resourceId
|
|
339
339
|
|
|
340
|
+
Takes the same optional `rateDirection` as the POST above, with the same `FUNCTIONAL_TO_SOURCE` default. Edit and add read a bare `rate` identically; supply the label to send an everyday quote verbatim.
|
|
341
|
+
|
|
340
342
|
```json
|
|
341
343
|
// Request:
|
|
342
344
|
{ "rate": 0.71, "rateApplicableFrom": "2026-02-10" }
|
|
@@ -388,7 +390,7 @@ Create exchange rates in bulk (max 500). **Auto-enables currencies not yet enabl
|
|
|
388
390
|
{ "data": { "resourceId": null, "resourceIds": ["uuid1", "uuid2"] } }
|
|
389
391
|
```
|
|
390
392
|
|
|
391
|
-
`rateDirection` (SGD-base org, USD source): `FUNCTIONAL_TO_SOURCE` means the value is source-per-base — 1 SGD = 0.74 USD → send `0.74`. `SOURCE_TO_FUNCTIONAL` means base-per-source — 1 USD = 1.35 SGD → send `1.35` as-is, no inversion.
|
|
393
|
+
`rateDirection` (SGD-base org, USD source): `FUNCTIONAL_TO_SOURCE` means the value is source-per-base — 1 SGD = 0.74 USD → send `0.74`. `SOURCE_TO_FUNCTIONAL` means base-per-source — 1 USD = 1.35 SGD → send `1.35` as-is, no inversion. All three rate endpoints (single add, single edit, bulk-upsert) accept the everyday quote this way; the difference here is that `rateDirection` is **required** on bulk-upsert and optional on the single-rate pair, where omitting it means `FUNCTIONAL_TO_SOURCE`. Unlike the single-rate POST endpoint, this returns `resourceIds` directly.
|
|
392
394
|
|
|
393
395
|
---
|
|
394
396
|
|
|
@@ -210,9 +210,9 @@ Enable currencies first via `POST /organization/currencies`, then set rates via
|
|
|
210
210
|
**Fix**: Ensure `rateApplicableTo` is after `rateApplicableFrom`, or omit `rateApplicableTo` entirely.
|
|
211
211
|
|
|
212
212
|
### Rates appear inverted (wrong direction)
|
|
213
|
-
**Cause**: POSTing a sourceToFunctional rate (1 foreign = X base) as the `rate` field, which expects functionalToSource (1 base = X foreign). You do not have to do this by hand: pass your figure as-is with `rateDirection` (`FUNCTIONAL_TO_SOURCE` | `SOURCE_TO_FUNCTIONAL`)
|
|
213
|
+
**Cause**: POSTing a sourceToFunctional rate (1 foreign = X base) as the `rate` field, which expects functionalToSource (1 base = X foreign). You do not have to do this by hand: pass your figure as-is with `rateDirection` (`FUNCTIONAL_TO_SOURCE` | `SOURCE_TO_FUNCTIONAL`), which the rate-table endpoints accept natively. Omitting it means `FUNCTIONAL_TO_SOURCE`. See SKILL.md Rule 49.
|
|
214
214
|
**Symptom**: UI shows "1 SGD = 0.0088 JPY" instead of "1 SGD ≈ 111 JPY" — the reciprocal of what you intended.
|
|
215
|
-
**Fix**:
|
|
215
|
+
**Fix**: Either declare the direction and send your figure as-is (`rate: 0.009, rateDirection: "SOURCE_TO_FUNCTIONAL"`), or invert before POSTing: if your data says "1 JPY = 0.009 SGD", POST `rate: 111.11` bare. Declaring is preferred — a wrong inversion is silent and wrong by rate².
|
|
216
216
|
|
|
217
217
|
### Wrong body format for enabling
|
|
218
218
|
**Cause**: Using `{ currencyCode: "USD" }` instead of array format.
|
|
@@ -472,7 +472,7 @@ DELETE → expects "A" (parentEntityResourceId, via /cash-entries/:id)
|
|
|
472
472
|
| `baseCurrency` (GET response) | `functionalCurrencyCode` | The org's base currency code in rate response |
|
|
473
473
|
| `notes` (GET response) | `notes: { date, name }` | Metadata object — `date` is the creation date, `name` is the creator |
|
|
474
474
|
|
|
475
|
-
> **Rate direction cheat-sheet**: POST `rate` = GET `rateFunctionalToSource` = "1 base → X foreign". If your data is "1 foreign → X base", **invert before POSTing** — or set `rateDirection: "SOURCE_TO_FUNCTIONAL"` and
|
|
475
|
+
> **Rate direction cheat-sheet**: POST `rate` = GET `rateFunctionalToSource` = "1 base → X foreign". If your data is "1 foreign → X base", **invert before POSTing** — or set `rateDirection: "SOURCE_TO_FUNCTIONAL"` and send your figure as-is, which the endpoint applies server-side (Rule 49).
|
|
476
476
|
|
|
477
477
|
**Rate POST response gotcha**: `POST /organization/currencies/:code/rates` returns `{ "data": "Rate added successfully" }` — a **plain string**, NOT a CurrencyRate object. No `resourceId` is returned. To get the rate's `resourceId` for later PUT/DELETE, follow up with GET and match by `rateApplicableFrom`.
|
|
478
478
|
|
|
@@ -182,8 +182,8 @@ Same subcommands and flags as `cash-in`.
|
|
|
182
182
|
| Subcommand | Key flags |
|
|
183
183
|
|------------|-----------|
|
|
184
184
|
| `list <code>` | `--limit`, `--offset`, `--all`, `--format`, `--json` |
|
|
185
|
-
| `add <code>` | `--rate`, `--from`, `--to` |
|
|
186
|
-
| `update <code> <rateId>` | `--rate`, `--from`, `--to` |
|
|
185
|
+
| `add <code>` | `--rate`, `--rate-direction`, `--from`, `--to` |
|
|
186
|
+
| `update <code> <rateId>` | `--rate`, `--rate-direction`, `--from`, `--to` |
|
|
187
187
|
| `bulk-upsert` | `--input <file>` (max 500 rates; requires `rateDirection` per rate) |
|
|
188
188
|
|
|
189
189
|
### `clio tax-profiles` — Tax profiles and tax types
|
|
@@ -99,10 +99,14 @@ Handle a foreign currency invoice from start to finish.
|
|
|
99
99
|
clio currencies add USD
|
|
100
100
|
|
|
101
101
|
# Set the exchange rate for the period.
|
|
102
|
-
# --rate
|
|
103
|
-
# "1 USD = 1.3450 SGD" quote before sending (1 / 1.3450 = 0.7435).
|
|
102
|
+
# --rate defaults to functionalToSource: 1 SGD = 0.7435 USD.
|
|
104
103
|
clio currency-rates add USD --rate 0.7435 --from 2026-03-01 --to 2026-03-31
|
|
105
104
|
|
|
105
|
+
# Holding an everyday "1 USD = 1.3450 SGD" quote instead? Declare the
|
|
106
|
+
# direction and send it as-is rather than inverting by hand.
|
|
107
|
+
clio currency-rates add USD --rate 1.3450 --rate-direction SOURCE_TO_FUNCTIONAL \
|
|
108
|
+
--from 2026-03-01 --to 2026-03-31
|
|
109
|
+
|
|
106
110
|
# For bulk updates, prepare a JSON file and use bulk-upsert (max 500 rates/call)
|
|
107
111
|
clio currency-rates bulk-upsert --input rates.json
|
|
108
112
|
|
|
@@ -229,7 +229,7 @@ POST /api/v1/organization/currencies/<code>/rates
|
|
|
229
229
|
}
|
|
230
230
|
```
|
|
231
231
|
|
|
232
|
-
**Rate direction:** `functionalToSource` — how many units of SOURCE (foreign) currency = 1 unit of FUNCTIONAL (base) currency. Example: base SGD, 1 SGD = 0.74 USD → rate = 0.74. A quote written foreign-first ("1 USD = 1.35 SGD") is the inverse — send 1/1.35 = 0.74, or send 1.35 with `rateDirection: "SOURCE_TO_FUNCTIONAL"` and let the
|
|
232
|
+
**Rate direction:** `functionalToSource` — how many units of SOURCE (foreign) currency = 1 unit of FUNCTIONAL (base) currency. Example: base SGD, 1 SGD = 0.74 USD → rate = 0.74. A quote written foreign-first ("1 USD = 1.35 SGD") is the inverse — send 1/1.35 = 0.74, or send 1.35 with `rateDirection: "SOURCE_TO_FUNCTIONAL"` and let the endpoint apply it. Omitting `rateDirection` means `FUNCTIONAL_TO_SOURCE`.
|
|
233
233
|
|
|
234
234
|
**Note:** Rate endpoints and enable/disable both live under the nested `/organization/currencies` family. The older hyphenated `/organization-currencies/...` rate paths are **deprecated** in the OpenAPI spec.
|
|
235
235
|
|