jaz-clio 5.20.39 → 5.20.41
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/README.md +5 -5
- package/assets/skills/api/SKILL.md +1 -1
- package/assets/skills/api/references/claims.md +1 -1
- package/assets/skills/cli/SKILL.md +1 -1
- package/assets/skills/conversion/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 +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@ Requires **Node.js 18+** ([nodejs.org](https://nodejs.org)). Also fully compatib
|
|
|
30
30
|
|---|---|---|
|
|
31
31
|
| **CLI** | Every accounting operation as a command | `clio invoices list` |
|
|
32
32
|
| **MCP** | Plug into Claude Code, Cursor, Codex, Copilot | `clio mcp` |
|
|
33
|
-
| **Skills** | Teach any
|
|
33
|
+
| **Skills** | Teach any agent the Jaz API | `clio init` |
|
|
34
34
|
|
|
35
35
|
---
|
|
36
36
|
|
|
@@ -85,15 +85,15 @@ claude mcp add jaz -- npx jaz-clio mcp
|
|
|
85
85
|
|
|
86
86
|
## Skills
|
|
87
87
|
|
|
88
|
-
158 API rules from production testing
|
|
88
|
+
158 API rules from production testing: field-name maps, error-recovery patterns, response-shape quirks. Plus 12 job playbooks. Installable into any agent project.
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
|
-
clio init # auto-detect
|
|
91
|
+
clio init # auto-detect agent + install skills + agent-rules
|
|
92
92
|
clio init --platform cursor # explicit platform
|
|
93
93
|
clio init --no-rules # skills only, skip the agent-rules file
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
-
Auto-detects the
|
|
96
|
+
Auto-detects the agent (Claude Code, Codex, Copilot, Cursor, Antigravity, Gemini, Windsurf, Goose) and installs the right skill files. `init` also writes a one-page `jaz-agent-rules.md` to the path your platform reads on workspace open (`CLAUDE.md` / `AGENTS.md` / `.github/copilot-instructions.md` / `.cursor/rules/jaz.mdc` / `.windsurf/rules/jaz.md` / `GEMINI.md`) so any agent starts every session with the meta-tool flow, the 6 API gotchas, and the recipe-engine carve-outs.
|
|
97
97
|
|
|
98
98
|
---
|
|
99
99
|
|
|
@@ -110,7 +110,7 @@ clio auth whoami # Verify
|
|
|
110
110
|
|
|
111
111
|
## Help-center semantic search (optional)
|
|
112
112
|
|
|
113
|
-
`search_help_center` uses
|
|
113
|
+
`search_help_center` uses keyword search over the bundled help-center corpus by default. Set `CLIO_HELP_CENTER_OPENAI_API_KEY` to add semantic search (matches on intent, not just exact keywords): the CLI embeds only your query via the OpenAI embeddings API (`text-embedding-3-small`, the model the bundled index was built with) and merges both rankings. On auth failure it warns once and falls back to keyword search. Use a project-scoped key restricted to embedding models with a low monthly cap. CLI-only: MCPB installs ship without the embedding index and always use keyword search.
|
|
114
114
|
|
|
115
115
|
## Privacy
|
|
116
116
|
|
|
@@ -144,7 +144,7 @@ One MCP namespace wraps all three: **`claim_settings`**. CLI: `clio claim-types
|
|
|
144
144
|
| Entity | What it is | Key fields |
|
|
145
145
|
|--------|-----------|-----------|
|
|
146
146
|
| **Claim Type** | An expense category (e.g. "Travel", "Meals"). | `name` (unique/org), `expenseAccountResourceId`, `taxProfileResourceId`, `classifierConfig`, `isDefault` |
|
|
147
|
-
| **Claim Profile** | A per-employee policy bundle (who approves, spend limits, which types are visible, the liability account). | `name` (unique/org), `approverUserResourceId`, `visibleClaimTypeIds[]`, `visibleTaxProfileIds[]`, `visibleClassifierIds[]`, `visibleVendorResourceIds[]`, `allowedCurrencies[]`, `minClaimAmount`, `maxClaimAmount`, `maxPerPeriodAmount`, `perPeriod`, `employeeBalanceAccountResourceId`, `
|
|
147
|
+
| **Claim Profile** | A per-employee policy bundle (who approves, spend limits, which types are visible, the liability account). | `name` (unique/org), `approverUserResourceId`, `visibleClaimTypeIds[]`, `visibleTaxProfileIds[]`, `visibleClassifierIds[]`, `visibleVendorResourceIds[]`, `allowedCurrencies[]`, `minClaimAmount`, `maxClaimAmount`, `maxPerPeriodAmount`, `perPeriod`, `employeeBalanceAccountResourceId`, `taxMode`, `isDefault` |
|
|
148
148
|
| **Posting Rule** | How approved claims group into journals at conversion (the "Posting Rules" tab). | `name` (unique/org), `outerAxis`, `innerAxis`, `lineDescriptionTemplate`, `journalReferenceTemplate`, `defaultBankAccountResourceId`, `defaultIncludeReimbursementPayout`, `isDefault` |
|
|
149
149
|
|
|
150
150
|
## Enums (use EXACT values)
|
package/cli.mjs
CHANGED
|
@@ -445,7 +445,7 @@ ${r.comment}`:r.comment}this.doc.range[2]=r.offset;break}default:this.errors.pus
|
|
|
445
445
|
`))}var jOe=K(()=>{"use strict";Fe()});function PUt(t){return YOe[t]?YOe[t]:t>=500?"Server error. Try again shortly.":""}function HOe(t,e,r){let n=oe(Cn.vertical),i=[`${St}${n}`,`${St}${n} ${oe(`API Error (${t})`)}`];r&&i.push(`${St}${n} ${G(r)}`),i.push(`${St}${n}`);let o=PUt(t);o&&(i.push(`${St}${n} ${o}`),i.push(`${St}${n}`));let s=e.replace(/^.*?→\s*\d+:\s*/,"").trim();if(s&&s!==o){let a=r?3:2;i.splice(a,0,`${St}${n} ${G(s)}`)}return i.join(`
|
|
446
446
|
`)}function zOe(t){let e=oe(Cn.vertical);return[`${St}${e}`,`${St}${e} ${oe(`${ps.cross} Auth Error`)}`,`${St}${e} ${t}`,`${St}${e}`,`${St}${e} Run ${G("clio auth add <key>")} to authenticate.`,`${St}${e}`].join(`
|
|
447
447
|
`)}function GOe(t){let e=oe(Cn.vertical);return[`${St}${e}`,`${St}${e} ${oe(`${ps.cross} Error`)}`,`${St}${e} ${t}`,`${St}${e}`].join(`
|
|
448
|
-
`)}var YOe,VOe=K(()=>{"use strict";Fe();YOe={400:"Check request format. The server could not parse the request body.",401:"API key may be invalid. Run `clio auth whoami` to check.",403:"Permission denied. Check your API key scope.",404:"Resource not found. Check the ID and try again.",409:"Conflict \u2014 the resource may have been modified. Refresh and retry.",422:"Validation failed. Check your input fields.",429:"Rate limited. Wait a moment and try again."}});var JOe={};Hc(JOe,{apiAction:()=>L});function UUt(t){let e=String(t?.message??"");if(e.includes("401")||e.includes("Unauthorized"))return"clio auth whoami";if(e.includes("404"))return"Check the resourceId. Use search to find it.";if(e.includes("Multiple")&&e.includes("match"))return"Use exact name or UUID instead of fuzzy name.";if(e.includes("rate limit")||e.includes("429"))return"Wait 30 seconds, then retry.";if(e.includes("No API key"))return"clio auth add <your-jaz-api-key>"}function L(t){return async e=>{let r,n=!1;try{n=IA(e)}catch{}try{if(e.apiKey&&e.org)throw new ms("Cannot use both --api-key and --org. Use one or the other.");let i=Fm(e.apiKey),o=new $o(i,"cli");if(!n){let s=VI();if(s){let a=ec(s);if(a){let c=JI(),u=c==="env-org"||c==="flag-org"||c==="flag-api-key"||c==="env-api-key",d=0;try{d=Object.keys(Zc()??{}).length}catch{}qOe({label:s,orgName:a.orgName,currency:a.currency},u,d>1)}}}await t(o,e,i)}catch(i){let o=UUt(i);i instanceof ms&&(console.error(n?JSON.stringify({error:{code:"AUTH_ERROR",message:i.message,...o?{try:o}:{}}}):zOe(i.message)),process.exit(3)),i instanceof Ps&&(console.error(n?JSON.stringify({error:{code:"API_ERROR",status:i.status,message:i.message,...o?{try:o}:{}}}):HOe(i.status,i.message,i.endpoint)),process.exit(2));let s=i.message;console.error(n?JSON.stringify({error:{code:"UNKNOWN_ERROR",message:s,...o?{try:o}:{}}}):GOe(s)),process.exit(2)}finally{r?.stop()}}}var Et=K(()=>{"use strict";Zl();ub();Ut();jOe();VOe()});async function dL(t,e){return t.list("/api/v1/items",e)}async function Rb(t,e){return t.get(`/api/v1/items/${e}`)}async function Bb(t,e){return t.search("/api/v1/items/search",e)}async function V_(t,e){let r={...e};return e.appliesToSale&&!r.saleItemName&&(r.saleItemName=e.internalName),e.appliesToPurchase&&!r.purchaseItemName&&(r.purchaseItemName=e.internalName),t.post("/api/v1/items",r)}async function fL(t,e,r){let i=(await Rb(t,e)).data,o={itemCode:i.itemCode,internalName:i.internalName,appliesToSale:i.appliesToSale,appliesToPurchase:i.appliesToPurchase};return i.appliesToSale&&(i.saleItemName&&(o.saleItemName=i.saleItemName),i.salePrice!==void 0&&(o.salePrice=i.salePrice),i.saleAccountResourceId&&(o.saleAccountResourceId=i.saleAccountResourceId)),i.appliesToPurchase&&(i.purchaseItemName&&(o.purchaseItemName=i.purchaseItemName),i.purchasePrice!==void 0&&(o.purchaseItemPrice=i.purchasePrice),i.purchaseAccountResourceId&&(o.purchaseAccountResourceId=i.purchaseAccountResourceId)),Object.assign(o,r),t.put(`/api/v1/items/${e}`,o)}async function pL(t,e){await t.delete(`/api/v1/items/${e}`)}async function hL(t,e){return t.post("/api/v1/items/bulk-upsert",{items:e})}var mL=K(()=>{"use strict"});async function xb(t){return t.get("/api/v1/capsuleTypes")}async function J_(t,e){return t.post("/api/v1/capsuleTypes",e)}async function AL(t,e){return t.list("/api/v1/capsules",e)}async function Tb(t,e){return t.search("/api/v1/capsules/search",e)}async function W_(t,e){return t.get(`/api/v1/capsules/${e}`)}async function wA(t,e){return t.post("/api/v1/capsules",e)}async function gL(t,e,r){let n=await W_(t,e),i=n.data.capsuleType?.resourceId;if(!i)throw new Error(`Cannot update capsule ${e}: missing capsuleType.resourceId from GET response`);let o={resourceId:e,capsuleTypeResourceId:i,title:n.data.title,description:n.data.description,...r};return t.put(`/api/v1/capsules/${e}`,o)}async function yL(t,e){await t.delete(`/api/v1/capsules/${e}`)}async function EL(t,e){return t.post("/api/v1/moveTransactionCapsules",e)}var Z_=K(()=>{"use strict"});async function kb(t,e){return t.list("/api/v1/tax-profiles",e)}async function bL(t,e){return t.list("/api/v1/tax-types",e)}async function CL(t,e){return t.post("/api/v1/tax-profiles",e)}async function Nb(t,e){return t.post("/api/v1/tax-profiles/search",e)}async function vL(t,e){return t.get(`/api/v1/tax-profiles/${e}`)}async function IL(t,e,r){return t.put(`/api/v1/tax-profiles/${e}`,r)}async function wL(t){let e=await t.get("/api/v1/withholding-tax-codes");return{data:Array.isArray(e)?e:e.data??[]}}var X_=K(()=>{"use strict"});async function Fb(t,e){return t.list("/api/v1/tags",e)}async function _L(t,e){return t.get(`/api/v1/tags/${e}`)}async function DL(t,e){return t.search("/api/v1/tags/search",e)}async function K_(t,e){return t.post("/api/v1/tags",e)}async function SL(t,e,r){return t.put(`/api/v1/tags/${e}`,r)}async function RL(t,e){await t.delete(`/api/v1/tags/${e}`)}var BL=K(()=>{"use strict"});async function xL(t,e){return t.list("/api/v1/claim-types",e)}async function TL(t,e){return t.get(`/api/v1/claim-types/${e}`)}async function Ob(t,e){return t.search("/api/v1/claim-types/search",e)}async function kL(t,e){return t.post("/api/v1/claim-types",e)}async function NL(t,e,r){return t.put(`/api/v1/claim-types/${e}`,r)}async function FL(t,e){await t.delete(`/api/v1/claim-types/${e}`)}var eD,OL=K(()=>{"use strict";eD=["expenseAccountResourceId","taxProfileResourceId","classifierConfig"]});async function QL(t,e){return t.list("/api/v1/claim-profiles",e)}async function LL(t,e){return t.get(`/api/v1/claim-profiles/${e}`)}async function Qb(t,e){return t.search("/api/v1/claim-profiles/search",e)}async function ML(t,e){return t.post("/api/v1/claim-profiles",e)}async function PL(t,e,r){return t.put(`/api/v1/claim-profiles/${e}`,r)}async function UL(t,e){await t.delete(`/api/v1/claim-profiles/${e}`)}var tD,S7,rD,nD=K(()=>{"use strict";tD=["DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"],S7=["NO_TAX","INCLUSIVE"],rD=["approverUserResourceId","visibleClaimTypeIds","visibleTaxProfileIds","visibleClassifierIds","visibleVendorResourceIds","allowedCurrencies","minClaimAmount","maxClaimAmount","maxPerPeriodAmount","perPeriod","employeeBalanceAccountResourceId","taxMode"]});async function $L(t,e){return t.list("/api/v1/posting-rules",e)}async function qL(t,e){return t.get(`/api/v1/posting-rules/${e}`)}async function Lb(t,e){return t.search("/api/v1/posting-rules/search",e)}async function jL(t,e){return t.post("/api/v1/posting-rules",e)}async function YL(t,e,r){return t.put(`/api/v1/posting-rules/${e}`,r)}async function HL(t,e){await t.delete(`/api/v1/posting-rules/${e}`)}var iD,oD,sD=K(()=>{"use strict";iD=["PER_EMPLOYEE","PER_VENDOR","PER_PAIR","ONE_BATCH","PER_CLAIM"],oD=["RAW","BY_CT_TP_NC","BY_CT_TP_NC_EMPLOYEE","BY_CT_TP_NC_VENDOR"]});async function Mb(t,e){return t.search("/api/v1/employees/search",e)}async function zL(t,e){return t.search("/api/v1/employees/balances/search",e)}async function GL(t,e){return t.get(`/api/v1/employees/${e}`)}async function VL(t,e){return t.post("/api/v1/employees",e)}async function JL(t,e,r){return t.put(`/api/v1/employees/${e}`,r)}async function WL(t,e){return t.delete(`/api/v1/employees/${e}`)}async function ZL(t,e,r){return t.post(`/api/v1/employees/${e}/bind-user`,{userResourceId:r})}async function XL(t,e){return t.post("/api/v1/employees/import/preprocess",e)}async function KL(t,e){if((e.create?.length??0)+(e.update?.length??0)+(e.delete?.length??0)===0)throw new Error("import requires at least one create / update / delete row.");for(let[n,i]of Object.entries(e))if(Array.isArray(i)&&i.length>100)throw new Error(`max 100 ${n} rows per import. Split into batches.`);return t.post("/api/v1/employees/import",e)}var _A,aD=K(()=>{"use strict";_A=["FULL_TIME","PART_TIME","CONTRACTOR","INTERN","TEMPORARY","CONSULTANT"]});async function cD(t,e){return e?((await cc(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(n=>n.name===e):void 0}async function eM(t,e){return e?((await Bb(t,{filter:{itemCode:{eq:e}},limit:5}))?.data??[]).find(n=>n.itemCode===e):void 0}function Pb(t){if(typeof t!="string")return String(t??"");let e=t.trim();return $Ut[e.toLowerCase()]??e}async function WOe(t,e){if(!e?.trim())return;let r=e.trim().toLowerCase();return((await Tb(t,{filter:{title:{contains:e.trim()}},limit:20}))?.data??[]).find(i=>i.title?.trim().toLowerCase()===r)}async function tM(t,e){return e?((await Ub(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(n=>n.name===e):void 0}async function rM(t,e){return e?((await Nb(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(n=>n.name===e):void 0}async function nM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Fb(t,{limit:500}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function iM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Ob(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function oM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Qb(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function sM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Lb(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function aM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Mb(t,{filter:{email:{eq:e}},limit:5}))?.data??[]).find(i=>i.email?.toLowerCase().trim()===r)}function ZOe(t,e,r){if(!qUt.test(t))throw new Error(`${e} must be a valid UUID (got "${t}"). ${r}`)}function hl(t,e={}){if(!(e.assumeFinalize===!0||t.saveAsDraft===!1))return;let n=t.lineItems;if(!Array.isArray(n)||n.length===0)return;let i=[];for(let a=0;a<n.length;a++){let c=n[a];if(!c||typeof c!="object")continue;let u=c.accountResourceId;(typeof u!="string"||u.trim().length===0)&&i.push(a)}if(i.length===0)return;let o=i.slice(0,5).join(", "),s=i.length>5?` (and ${i.length-5} more)`:"";return{error:`lineItems[${o}]${s}: accountResourceId is required when finalizing.`,status:422,hint:"Pre-flight guard \u2014 request never hit Clio. Search for the right GL account first, then retry with the resourceId on each line item.",repair:{tool:"search_accounts",arguments:{},reason:"Line item missing accountResourceId on a finalize call. Search for the GL account (by name or accountType) and attach the resourceId to each line item."}}}var $Ut,qUt,uc=K(()=>{"use strict";Wf();mL();$b();Z_();X_();BL();OL();nD();sD();aD();$Ut={"current assets":"Current Asset","current asset":"Current Asset","fixed assets":"Fixed Asset","fixed asset":"Fixed Asset","bank account":"Bank Accounts","bank accounts":"Bank Accounts",bank:"Bank Accounts","current liabilities":"Current Liability","current liability":"Current Liability","non-current liabilities":"Non-current Liability","non-current liability":"Non-current Liability",equity:"Shareholders Equity","shareholders equity":"Shareholders Equity","shareholders' equity":"Shareholders Equity","shareholder's equity":"Shareholders Equity",revenue:"Operating Revenue","operating revenue":"Operating Revenue","other revenue":"Other Revenue","other income":"Other Revenue",expense:"Operating Expense","operating expense":"Operating Expense",expenses:"Operating Expense","direct costs":"Direct Costs","cost of goods sold":"Direct Costs",cogs:"Direct Costs",cash:"Cash",inventory:"Inventory","discontinued expense":"Discontinued Expense","discontinued income":"Discontinued Income","finance cost":"Finance Cost","finance costs":"Finance Cost","financing income":"Financing Income",goodwill:"Goodwill","income tax expense":"Income Tax Expense","income tax":"Income Tax Expense","tax expense":"Income Tax Expense","investing expense":"Investing Expense","investing income":"Investing Income",investment:"Investment",investments:"Investment"};qUt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i});async function Id(t,e){return t.list("/api/v1/chart-of-accounts",e)}async function Ub(t,e){return t.search("/api/v1/chart-of-accounts/search",e)}async function XOe(t,e){return t.get(`/api/v1/chart-of-accounts/${e}`)}async function lD(t,e){return t.post("/api/v1/chart-of-accounts",e)}async function KOe(t,e,r){return t.put(`/api/v1/chart-of-accounts/${e}`,r)}function cM(t){let e={};for(let r of jUt){let n=t[r];n!=null&&(r==="accountType"&&typeof n=="string"?e.accountType=Pb(n):e[r]=n)}return e}async function lM(t,e){return t.post("/api/v1/chart-of-accounts/bulk-upsert",{accounts:e})}async function uM(t,e){await t.delete(`/api/v1/chart-of-accounts/${e}`)}async function e1e(t,e){return t.list("/api/v1/account-classifications",e)}var jUt,$b=K(()=>{"use strict";uc();jUt=["resourceId","code","name","accountType","currencyCode","description","status"]});function qb(t,e,r={}){let n=r.threshold??.4,i=r.limit??5,o=t.toLowerCase().trim(),s=e.find(c=>c.code?.toLowerCase()===o);if(s)return[{item:s,score:1}];let a=e.find(c=>c.name.toLowerCase()===o);return a?[{item:a,score:1}]:uA(t,e,c=>c.name,{threshold:n,limit:i})}function dM(t,e){let r=qb(t,e,{threshold:.45,limit:1});return r.length>0?r[0].item:null}function t1e(t){return t.filter(e=>e.status==="ACTIVE"&&!e.controlFlag&&e.accountType!=="Bank Accounts"&&e.accountType!=="Cash")}function r1e(t){return t.filter(e=>e.status==="ACTIVE"&&(e.accountType==="Bank Accounts"||e.accountType==="Cash"))}var R7=K(()=>{"use strict";cb()});function fM(t,e,r={}){let n=r.threshold??.4,i=r.limit??5;return e.map(s=>{let a=[s.billingName,s.name].filter(Boolean),c=Math.max(...a.map(u=>_W(t,u)));return{item:s,score:c}}).filter(s=>s.score>=n).sort((s,a)=>a.score-s.score).slice(0,i)}var B7=K(()=>{"use strict";cb()});var o1e={};Hc(o1e,{collectValue:()=>x7,parseCustomFields:()=>an,parseJournalEntries:()=>dc,parseJsonArray:()=>pu,parseJsonObject:()=>k7,parseLineItems:()=>Un,parseMoney:()=>ar,parseNonNegativeInt:()=>et,parseOrderTerms:()=>SA,parsePositiveInt:()=>be,parseRate:()=>wd,parseTemplateOverrides:()=>T7,readBodyInput:()=>ve,requireFields:()=>Qe,splitCsv:()=>Co,todayLocal:()=>N7});import{readFileSync as i1e}from"node:fs";function be(t){let e=Number.parseInt(t,10);return(!Number.isFinite(e)||e<=0)&&(console.error(oe(`Error: invalid positive integer: ${t}`)),process.exit(1)),e}function et(t){let e=Number.parseInt(t,10);return(!Number.isFinite(e)||e<0)&&(console.error(oe(`Error: invalid non-negative integer: ${t}`)),process.exit(1)),e}function SA(t){let e=Number.parseInt(t,10);return(!Number.isFinite(e)||![0,7,15,30,45,60].includes(e))&&(console.error(oe(`Error: terms must be one of 0, 7, 15, 30, 45, 60 (got: ${t})`)),process.exit(1)),e}function ar(t){return/^-?\d+(\.\d{1,2})?$/.test(t)||(console.error(oe(`Error: invalid amount: ${t} (max 2 decimal places)`)),process.exit(1)),Math.round(Number(t)*100)/100}function wd(t){let e=Number(t);return(!Number.isFinite(e)||e<=0)&&(console.error(oe(`Error: invalid exchange rate: ${t}`)),process.exit(1)),e}function Un(t){try{let e=JSON.parse(t);if(!Array.isArray(e))throw new Error("Line items must be a JSON array");return e}catch{console.error(oe("Error: --lines must be valid JSON array")),console.error(G(`Example: --lines '[{"name":"Service","quantity":1,"unitPrice":100,"accountResourceId":"..."}]'`)),console.error(G("Tip: pipe the full request body via stdin, or use --input <file>")),process.exit(1)}}function dc(t){try{let e=JSON.parse(t);if(!Array.isArray(e))throw new Error("Entries must be a JSON array");return e}catch{console.error(oe("Error: --entries must be valid JSON array")),console.error(G(`Example: --entries '[{"accountResourceId":"...","amount":100,"type":"DEBIT"},...]'`)),console.error(G("Tip: pipe the full request body via stdin, or use --input <file>")),process.exit(1)}}function an(t){try{let e=JSON.parse(t);if(!Array.isArray(e))throw new Error("Must be a JSON array");return e}catch{console.error(oe("Error: --custom-fields must be valid JSON array")),console.error(G(`Example: --custom-fields '[{"customFieldName":"PO Number","actualValue":"PO-123"}]'`)),process.exit(1)}}function x7(t,e=[]){return e.push(t),e}function T7(t){return t.map(e=>{let r=e.indexOf("=");r===-1&&(console.error(oe(`Error: --template-override must be "slotKey=template" (got "${e}")`)),console.error(G("Example: --template-override capsule.title='Loan {{loanReference}}'")),process.exit(1));let n=e.slice(0,r).trim(),i=e.slice(r+1);return n||(console.error(oe("Error: --template-override slotKey must be non-empty (slotKey=template)")),process.exit(1)),{slotKey:n,template:i}})}function k7(t,e="--inputs"){try{let r=JSON.parse(t);if(typeof r!="object"||r===null||Array.isArray(r))throw new Error("not an object");return r}catch{return console.error(oe(`Error: ${e} must be a valid JSON object`)),process.exit(1),{}}}function ve(t){if(t.input){let e;try{e=i1e(t.input,"utf-8")}catch{console.error(oe(`Error: cannot read file: ${t.input}`)),process.exit(1)}try{let r=JSON.parse(e);return(typeof r!="object"||r===null||Array.isArray(r))&&(console.error(oe("Error: --input file must contain a JSON object")),process.exit(1)),r}catch{console.error(oe("Error: --input file contains invalid JSON")),process.exit(1)}}if(!process.stdin.isTTY)try{let e=i1e(0,"utf-8").trim();if(e){let r=JSON.parse(e);return(typeof r!="object"||r===null||Array.isArray(r))&&(console.error(oe("Error: stdin must contain a JSON object")),process.exit(1)),r}}catch(e){e.message?.includes("JSON")&&(console.error(oe("Error: stdin contains invalid JSON")),process.exit(1))}return null}function Qe(t,e){let r=e.filter(n=>t[n.key]===void 0);if(r.length>0){let n=r.map(i=>i.flag).join(", ");console.error(oe(`Error: missing required option(s): ${n}`)),console.error(G("Provide flags, or pipe JSON via stdin, or use --input <file>")),process.exit(1)}}function Co(t){if(t!==void 0)return t.split(",").map(e=>e.trim()).filter(Boolean)}function pu(t,e){let r;try{r=JSON.parse(t)}catch{throw new Error(`Invalid JSON for ${e}: ${t.slice(0,80)}`)}if(!Array.isArray(r))throw new Error(`${e} must be a JSON array (got ${typeof r}).`);return r}function N7(){let t=new Date,e=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0");return`${e}-${r}-${n}`}var Tt=K(()=>{"use strict";Fe()});function M1e(t){return L1e[t]??L1e.jaz}var L1e,P1e=K(()=>{"use strict";L1e={jaz:{displayName:"Jaz",supportEmail:"support@jaz.ai",domain:"jaz.ai",agentInboxDomain:"jaz.email",dashboardUrl:"https://app.jaz.ai"},juan:{displayName:"Juan",supportEmail:"help@juan.ac",domain:"juan.ac",agentInboxDomain:"sendjuan.com",dashboardUrl:"https://app.juan.ac"}}});import{readFileSync as D$t}from"node:fs";import{dirname as S$t,join as R$t}from"node:path";import{fileURLToPath as B$t}from"node:url";function j1e(t,e,{dashboardUrl:r,orgResourceId:n}){let i=q1e(),o=i.screenByKey.get(t);if(o){if(e)throw new Error(`Destination '${t}' is a screen, not a record view \u2014 omit resourceId. To open a specific record, use a "<resource>.modal.view-*" destination instead.`);return{url:U1e(`${r}${o.path}`,n),kind:"screen",label:o.label}}let s=i.modalByKey.get(t);if(s){if(s.requiresId&&!e)throw new Error(`Destination '${t}' opens a specific record \u2014 pass the record's resourceId. For a create/blank modal, use a "new-*"/"create-*" destination instead.`);let u=s.requiresId?s.urlTemplate.replace(x$t,encodeURIComponent(e)):s.urlTemplate;return{url:U1e(`${r}${s.mountPath}${u}`,n),kind:"modal",label:s.label}}let a=k$t(i,t),c=a.length?` Did you mean: ${a.join(", ")}?`:"";throw new Error(`Unknown dashboard destination '${t}'.${c} Call find_dashboard_destinations to find a valid key.`)}function Y1e({query:t,resource:e,kind:r}){let{manifest:n}=q1e(),i=t?.trim().toLowerCase(),o=[...r==="modal"?[]:n.screens.filter(c=>!e||O$t(c.path)===e).map(c=>({key:c.key,label:c.label,kind:"screen"})),...r==="screen"?[]:n.modals.filter(c=>!e||c.resource===e).map(c=>({key:c.key,label:c.label,kind:"modal"}))],s=i?F$t(i):[],a=i?o.filter(c=>s.some(u=>c.key.toLowerCase().includes(u)||c.label.toLowerCase().includes(u))):o;return{results:a.slice(0,$1e),total:a.length,truncated:a.length>$1e}}var x$t,T$t,V7,q1e,k$t,U1e,$1e,N$t,F$t,O$t,H1e=K(()=>{"use strict";x$t="{id}",T$t=S$t(B$t(import.meta.url)),V7=null,q1e=()=>{if(!V7){let t=JSON.parse(D$t(R$t(T$t,"dashboard-routes-manifest.json"),"utf8"));V7={manifest:t,screenByKey:new Map(t.screens.map(e=>[e.key,e])),modalByKey:new Map(t.modals.map(e=>[e.key,e]))}}return V7},k$t=(t,e,r=5)=>{let n=e.toLowerCase(),i=[],o=[...t.screenByKey.keys(),...t.modalByKey.keys()];for(let s of o)if(s.toLowerCase().includes(n)&&(i.push(s),i.length>=r))break;return i},U1e=(t,e)=>e?`${t}${t.includes("?")?"&":"?"}org=${encodeURIComponent(e)}`:t;$1e=60,N$t=[["credit note","credit"],["invoice","sale"],["bill","purchase"]],F$t=t=>{let e=[t];for(let[r,n]of N$t)t.includes(r)&&e.push(t.split(r).join(n));return e},O$t=t=>t.split("/")[1]??""});var Vb,RA,BA,z1e,EM,_d,mD=K(()=>{"use strict";Vb=["ORGANIZATION","USER_MANAGEMENT","BILLING","ACCOUNTING","SALES","PURCHASES","REPORTS","FIXED_ASSET"],RA=["ADMIN","PREPARER","MEMBER","NO_ACCESS"],BA=["ADMIN","CUSTOM_USER"],z1e=["trial-balance","balance-sheet","profit-and-loss","general-ledger","cashflow","cash-balance","ar-report","ap-report","sales-summary","sales-payments-summary","purchase-summary","purchase-payments-summary","customer-revenue-summary","product-sales-summary","periodic-revenue-summary","supplier-expense-summary","product-purchase-summary","periodic-expense-summary","credit-note-summary","sales-cost-margin","sale-inventory-movement","purchase-inventory-movement","analysis-anomalous-invoices","analysis-anomalous-bills","analysis-cashflow-anomalies","analysis-gl-journal-audit","analysis-receivables-customer-risk","analysis-cash-expense-health","analysis-exchange-rate-audit","statement-of-account-export","tax-ledger","equity-movement","bank-closing-balance","bank-reconciliation-summary","bank-reconciliation-details","fixed-assets-register","fixed-assets-reconciliation-summary","journal-summary"],EM=["MAGIC_MATCH","MAGIC_RECONCILE_WITH_CASH_TRANSFER","MAGIC_RECONCILE_WITH_BANK_RULE","MAGIC_QUICK_RECONCILE","MAGIC_RECONCILE_WITH_CASH_IN_OUT"],_d=["INVOICE","BILL","CUSTOMER_CREDIT_NOTE","SUPPLIER_CREDIT_NOTE","SALE_PAYMENT","PURCHASE_PAYMENT","BATCH_PAYMENT","CONTACT","ITEM","CAPSULE","SCHEDULED_TRANSACTION","JOURNAL","BANK_RECORD","CASHFLOW_TRANSACTION","FIXED_ASSET","CHART_OF_ACCOUNT","TAX_PROFILE"]});var G1e,V1e,J1e,W1e,Z1e,bM,X1e,K1e,eQe,CM,tQe,J7,AD,rQe,nQe,iQe,oQe,sQe,aQe,cQe,lQe,uQe,dQe,fQe,pQe,hQe,mQe,AQe,Vs=K(()=>{"use strict";G1e=["DRAFT","UNPAID","PARTIALLY_PAID","PAID","VOID"],V1e=["DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED","VOID"],J1e=["DRAFT","ACTIVE","VOID"],W1e=["JOURNAL_MANUAL","JOURNAL_DIRECT_CASH_IN","JOURNAL_DIRECT_CASH_OUT","JOURNAL_CASHFLOW","JOURNAL_CASH_TRANSFER","JOURNAL_TRANSFER_BALANCE","JOURNAL_CASHFLOW_BANK_RECON","JOURNAL_CASHFLOW_ADJUSTMENT"],Z1e=["CASH_TRANSFER","DIRECT_CASH_IN","DIRECT_CASH_OUT"],bM=["ACTIVE","INACTIVE"],X1e=["ACTIVE","INACTIVE"],K1e=["ACTIVE","INACTIVE"],eQe=["INVENTORY","NON_INVENTORY"],CM=["PENDING","APPROVED"],tQe=["RECONCILED","UNRECONCILED","ARCHIVED","POSSIBLE_DUPLICATE"],J7=["PAYIN","PAYOUT"],AD=["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE","JOURNAL_MANUAL","JOURNAL_DIRECT_CASH_IN","JOURNAL_DIRECT_CASH_OUT","JOURNAL_CASHFLOW","JOURNAL_CASH_TRANSFER","JOURNAL_CASHFLOW_BANK_RECON","JOURNAL_CASHFLOW_ADJUSTMENT","PAYMENT_SALE","PAYMENT_PURCHASE","PAYMENT_SALE_CREDIT_NOTE","PAYMENT_PURCHASE_CREDIT_NOTE","BATCH_SALE","BATCH_PURCHASE","FIXED_ASSETS"],rQe=["ACTIVE","UNPAID","PARTIALLY_PAID","PAID","VOID","DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED"],nQe=["ACTIVE","DRAFT","DISPOSED","SOLD","DISCARDED","COMPLETED","ONGOING"],iQe=["TANGIBLE","INTANGIBLE"],oQe=["ACTIVE","INACTIVE"],sQe=["ACTIVE","CANCELLED","INACTIVE"],aQe=["ONE_TIME","DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"],cQe=["DRAFT","CREATED","ACCEPTED","CONFIRMED","VOID"],lQe=["DRAFT","ACTIVE","ACCEPTED","CONFIRMED","VOID"],uQe=["Asset","Liability","Equity","Revenue","Expense"],dQe=["Bank Accounts","Cash and Cash Equivalents","Current Assets","Non-Current Assets","Current Liabilities","Non-Current Liabilities","Equity","Revenue","Cost of Goods Sold","Operating Expenses","Other Income","Other Expenses"],fQe=["TEXT","NUMBER","BOOLEAN","DATE","LINK"],pQe=["ADMIN","CUSTOM_USER"],hQe=["ACTIVE","INACTIVE"],mQe=["QUEUED","DISPATCHING","PROCESSING","SUCCESS","FAILED","PARTIAL_SUCCESS"],AQe=["CASH","CREDIT_CARD","BANK_TRANSFER","E_WALLET","CHEQUE","WITHHOLDING_TAX_CERTIFICATE","CLEARING_SETTLEMENT","DEBT_WRITE_OFF","INTER_COMPANY","OTHER","PAYMENT_GATEWAY"]});function up(t,e,r){let n=e.split("."),i=t;for(let s=0;s<n.length-1;s++)(!i[n[s]]||typeof i[n[s]]!="object")&&(i[n[s]]={}),i=i[n[s]];let o=n[n.length-1];i[o]&&typeof i[o]=="object"?Object.assign(i[o],r):i[o]=r}function Q$t(t){return t.split(",").map(e=>e.trim()).filter(Boolean)}function gD(t,e,r){let n={};for(let[o,s]of Object.entries(e)){let a=t[o];if(!(a==null||a===""))switch(s.op){case"contains":up(n,s.path,{contains:String(a)});break;case"eq":up(n,s.path,{eq:a});break;case"gte":{let c=s.type==="number"?yQe(a):a;c!==void 0&&up(n,s.path,{gte:c});break}case"lte":{let c=s.type==="number"?yQe(a):a;c!==void 0&&up(n,s.path,{lte:c});break}case"boolean":up(n,s.path,{eq:!!a});break;case"multi":{let c=Q$t(String(a));c.length>1?up(n,s.path,{in:c}):c.length===1&&up(n,s.path,{eq:c[0]});break}case"array":up(n,s.path,a);break}}let i=Object.keys(n).length>0?n:void 0;if(!(!r&&!i))return r?i?L$t(r,i):r:i}function L$t(t,e){let r={...t};for(let[n,i]of Object.entries(e)){let o=r[n];gQe(o)&&gQe(i)?r[n]={...o,...i}:r[n]=i}return r}function gQe(t){return!t||typeof t!="object"||Array.isArray(t)?!1:Object.values(t).some(e=>e!==null&&typeof e=="object"&&!Array.isArray(e))}function yQe(t){let e=typeof t=="number"?t:Number(t);return Number.isFinite(e)?e:void 0}var vM=K(()=>{"use strict"});async function yD(t,e,r,n){return t(r??0,e??n)}var W7=K(()=>{"use strict"});function EQe(t,e=!1){let r={};for(let[n,i]of Object.entries(t)){let o={type:i.type,description:i.description};i.enum&&(o.enum=[...i.enum]),i.type==="array"&&i.items&&(o.items=i.items),r[n]=o}return e&&(r.query=j$t),r.filter=M$t,r.sortBy=P$t,r.sortOrder=U$t,r.limit=$$t,r.offset=q$t,r}function Z7(t){let e=[];for(let[r,n]of Object.entries(t)){let i=n.cliFlag??Y$t(r,n.type),o=n.cliFlag&&n.type!=="boolean"&&!i.includes("<")?`${i} <${i.replace(/^--/,"").split("-").pop()}>`:i;e.push([o,n.description,n.enum,r])}return e}function Y$t(t,e){let r=t.replace(/([A-Z])/g,"-$1").toLowerCase();return e==="boolean"?`--${r}`:`--${r} <${r.split("-").pop()}>`}function Vt(t){let e=EQe(t.fields,t.defaults.supportsQuery);t.pathParam&&(e[t.pathParam]={type:"string",description:t.pathParamDescription??`${t.pathParam} (required)`}),t.extraParams&&Object.assign(e,t.extraParams),e.view={type:"string",enum:["lean","full"],description:"Payload tier: 'lean' (default) = summary row (id + key scalars); 'full' = whole entity per row (heavier). Search lean, then drill in with get_*."};let r=[...t.pathParam?[t.pathParam]:[],...t.extraRequired??[]];return{name:t.name,description:t.description,params:e,required:r,group:t.group,readOnly:!0,isConcurrencySafe:!0,maxResultSizeChars:5e4,...t.searchHint?{searchHint:t.searchHint}:{},execute:async(n,i)=>{let o=i.limit,s=i.offset,a=i.sortBy??t.defaults.sortBy,c=i.sortOrder??t.defaults.sortOrder,u=i.query,d=i.view==="full"?"full":"lean",f=i.filter,p=t.baseFilter?f?{...t.baseFilter,...f}:t.baseFilter:f,h=gD(i,t.fields,p),m={sortBy:[a],order:c},A=t.pathParam?(y,C)=>t.fetcher(n.client,i[t.pathParam],{filter:h,sort:m,limit:C,offset:y,query:u,view:d}):(y,C)=>t.fetcher(n.client,{filter:h,sort:m,limit:C,offset:y,query:u,view:d}),g=d==="lean"&&t.defaults.leanDefaultLimit?t.defaults.leanDefaultLimit:t.defaults.defaultLimit;return yD(A,o,s,g)}}}var M$t,P$t,U$t,$$t,q$t,j$t,X7=K(()=>{"use strict";W7();vM();M$t={type:"object",description:"Raw API filter JSON. Merged with named params (named win). Operators: eq, neq, contains, in, gt, gte, lt, lte, between, isNull, reg. Nested paths supported (e.g. contact.name)."},P$t={type:"string",description:"Sort field (default varies by entity)"},U$t={type:"string",description:"Sort direction",enum:["ASC","DESC"]},$$t={type:"number",description:"Max per page (\u22641000)"},q$t={type:"number",description:"Page (0-indexed). Requires sort."},j$t={type:"string",description:'Jaz search expression. Merged with named params (named win). Examples: "status:unpaid AND $500+", "customer:acme AND date:-30d". Supports amounts ($500+, $100-500), dates (date:this month, due:overdue), enums, string fields (customer:, supplier:, ref:, tag:), boolean (hasattachment:yes), AND/OR/NOT, inline sort (sort:amount:desc).'}});async function H$t(){if(!K7){let[t,e,r,n]=await Promise.all([Promise.resolve().then(()=>(Et(),JOe)),Promise.resolve().then(()=>(Er(),LOe)),Promise.resolve().then(()=>(Ut(),$Oe)),Promise.resolve().then(()=>(Tt(),o1e))]);K7=t.apiAction,bQe=e.paginatedFetch,CQe=r.outputList,eZ=n.parsePositiveInt,vQe=n.parseNonNegativeInt}}function Ge(t){let e=t.commandName??"search",r=t.positionalArg?` <${t.positionalArg}>`:"",n=t.parent.command(`${e}${r}`).description(`Search ${t.label.replace("Searching ","")}`),i=new Map,o=Z7(t.fields);for(let[a,c,u,d]of o){let f=new Vn(a,c),p=t.fields[d];u&&p?.op!=="multi"&&f.choices(u),n.addOption(f);let h=z$t(a);h!==d&&i.set(h,d)}if(t.defaults.supportsQuery&&n.option("--query <expression>",'Jaz search expression (e.g. "status:unpaid AND $500+", "customer:acme AND date:-30d"). Merged with --filter; --filter fields win on conflict.'),n.option("--filter <json>","Raw API filter JSON (merged with flags; flags win on conflict)").addOption(new Vn("--sort <field>","Sort field name")).addOption(new Vn("--order <direction>","Sort direction").choices(["ASC","DESC"])).option("--limit <n>",`Max results (default ${t.defaults.defaultLimit})`).option("--offset <n>","Page number offset (0-indexed)").option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)").option("--format <type>","Output format: table, json, csv, yaml").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON"),t.leanView&&n.addOption(new Vn("--view <tier>","Payload tier: 'lean' = summary rows; 'full' (default) = complete records").choices(["lean","full"])),t.pathParam&&t.pathParam!==t.positionalArg){let a=t.pathParam.replace(/([A-Z])/g,"-$1").toLowerCase();n.requiredOption(`--${a} <id>`,t.pathParamDescription??`${t.pathParam} (required)`)}let s=async(...a)=>{let c=t.positionalArg?a[0]:void 0,u=t.positionalArg?a[1]:a[0];c&&t.positionalArg&&(u[t.positionalArg]=c),await H$t(),await K7(async d=>{t.preProcess&&await t.preProcess(d,u),typeof u.limit=="string"&&(u.limit=eZ(u.limit)),typeof u.offset=="string"&&(u.offset=vQe(u.offset)),typeof u.maxRows=="string"&&(u.maxRows=eZ(u.maxRows));let f={...u};for(let[I,k]of i)f[I]!==void 0&&(f[k]=f[I]);let p;if(typeof u.filter=="string")try{p=JSON.parse(u.filter)}catch{throw new Error(`Invalid --filter JSON: ${u.filter}`)}let h=t.baseFilter?p?{...t.baseFilter,...p}:t.baseFilter:p,m=gD(f,t.fields,h),A;if(c&&t.positionalFilter){let I=t.positionalFilter(c);A=m?{...I,...m}:I}else A=m;let g={sortBy:[u.sort??t.defaults.sortBy],order:u.order??t.defaults.sortOrder},y=t.defaults.supportsQuery?u.query:void 0,C=t.leanView?u.view:void 0,E=t.pathParam?({limit:I,offset:k})=>t.fetcher(d,u[t.pathParam],{filter:A,sort:g,limit:I,offset:k,query:y,view:C}):({limit:I,offset:k})=>t.fetcher(d,{filter:A,sort:g,limit:I,offset:k,query:y,view:C}),v=await bQe(u,E,{label:t.label,defaultLimit:t.defaults.defaultLimit});CQe(v,t.columns,u,t.label.replace("Searching ",""))})(u)};return n.action(s),n}function z$t(t){return t.replace(/^--/,"").split(/[\s<]/)[0].replace(/-([a-z])/g,(r,n)=>n.toUpperCase())}var K7,bQe,CQe,eZ,vQe,IQe=K(()=>{"use strict";Ga();X7();vM()});var Jb,Wb,ED,bD,wQe=K(()=>{"use strict";Vs();Jb={reference:{path:"reference",op:"contains",type:"string",description:"Invoice reference number"},status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:G1e},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact/customer name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (e.g., SGD, USD)"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Approval status",enum:CM},startDate:{path:"valueDate",op:"gte",type:"string",description:"On/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On/before (YYYY-MM-DD)",cliFlag:"--to <date>"},dueDateFrom:{path:"dueDate",op:"gte",type:"string",description:"Due date from (YYYY-MM-DD)"},dueDateTo:{path:"dueDate",op:"lte",type:"string",description:"Due date to (YYYY-MM-DD)"},minAmount:{path:"totalAmount",op:"gte",type:"number",description:"Minimum total amount"},maxAmount:{path:"totalAmount",op:"lte",type:"number",description:"Maximum total amount"}},Wb={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0},ED=Jb,bD=Wb});var _Qe,CD,vD,Zb,ID,dp,fp,DQe=K(()=>{"use strict";Vs();_Qe={reference:{path:"reference",op:"contains",type:"string",description:"Order reference number"},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact (customer/supplier) name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (e.g., SGD, USD)"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On/before (YYYY-MM-DD)",cliFlag:"--to <date>"},dueDateFrom:{path:"dueDate",op:"gte",type:"string",description:"Due date from (YYYY-MM-DD)"},dueDateTo:{path:"dueDate",op:"lte",type:"string",description:"Due date to (YYYY-MM-DD)"},minAmount:{path:"totalAmount",op:"gte",type:"number",description:"Minimum total amount"},maxAmount:{path:"totalAmount",op:"lte",type:"number",description:"Maximum total amount"}},CD={status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:cQe},..._Qe},vD={status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:lQe},..._Qe},Zb={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0},ID=Zb,dp={name:{path:"name",op:"contains",type:"string",description:"Line item text/description"},reference:{path:"reference",op:"contains",type:"string",description:"Parent order reference"},orderId:{path:"btResourceId",op:"eq",type:"string",description:"Parent order resourceId"},contactName:{path:"contactName",op:"contains",type:"string",description:"Contact (customer/supplier) name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (e.g., SGD, USD)"},status:{path:"status",op:"eq",type:"string",description:"Line item status"},account:{path:"organizationAccountName",op:"contains",type:"string",description:"Chart-of-account name on the line"},taxProfile:{path:"taxProfileName",op:"contains",type:"string",description:"Tax profile name on the line"},isOpen:{path:"isOpen",op:"boolean",type:"boolean",description:"Only open (unfulfilled) lines"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On/before (YYYY-MM-DD)",cliFlag:"--to <date>"},minAmount:{path:"totalItemAmount",op:"gte",type:"number",description:"Minimum line amount"},maxAmount:{path:"totalItemAmount",op:"lte",type:"number",description:"Maximum line amount"}},fp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0}});var pp,Xb,wD,SQe=K(()=>{"use strict";Vs();pp={reference:{path:"reference",op:"contains",type:"string",description:"Credit note reference"},status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:V1e},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Approval status",enum:CM},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"}},Xb={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0},wD=Xb});var _D,DD,RQe=K(()=>{"use strict";Vs();_D={reference:{path:"reference",op:"contains",type:"string",description:"Journal reference"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:J1e},type:{path:"type",op:"multi",type:"string",description:"Journal type",enum:W1e},templateType:{path:"templateType",op:"multi",type:"string",description:"Template type",enum:Z1e},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact name"},internalNotes:{path:"internalNotes",op:"contains",type:"string",description:"Search internal notes"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"}},DD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0}});var SD,RD,BQe=K(()=>{"use strict";Vs();SD={name:{path:"name",op:"contains",type:"string",description:"Contact name"},email:{path:"email",op:"contains",type:"string",description:"Email address"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:bM},isCustomer:{path:"customer",op:"boolean",type:"boolean",description:"Filter to customers only",cliFlag:"--customer"},isSupplier:{path:"supplier",op:"boolean",type:"boolean",description:"Filter to suppliers only",cliFlag:"--supplier"},taxId:{path:"taxId",op:"contains",type:"string",description:"Tax ID"}},RD={sortBy:"name",sortOrder:"ASC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0}});var Dd,Sd,BD,xD,xQe=K(()=>{"use strict";Vs();Dd={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Transaction type",enum:AD},direction:{path:"direction",op:"eq",type:"string",description:"Direction (PAYIN or PAYOUT)",enum:J7},status:{path:"businessTransactionStatus",op:"multi",type:"string",description:"Status",enum:rQe},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Bank account resourceId",cliFlag:"--account <id>"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"},businessTransactionType:{path:"businessTransactionType",op:"multi",type:"string",description:"(alias for type)",enum:AD}},Sd={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},BD={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Transaction type (SALE, PURCHASE, etc.)",enum:AD},direction:{path:"direction",op:"eq",type:"string",description:"Direction",enum:J7},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Account resourceId",cliFlag:"--account <id>"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"},businessTransactionType:{path:"businessTransactionType",op:"multi",type:"string",description:"(alias for type)",enum:AD},fromDate:{path:"valueDate",op:"gte",type:"string",description:"(alias for startDate)"},toDate:{path:"valueDate",op:"lte",type:"string",description:"(alias for endDate)"},accountResourceId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"(alias for accountId)"}},xD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20}});var TD,kD,TQe=K(()=>{"use strict";Vs();TD={status:{path:"status",op:"multi",type:"string",description:"Status",enum:tQe},description:{path:"description",op:"contains",type:"string",description:"Description"},payer:{path:"extContactName",op:"contains",type:"string",description:"Payer/payee name"},reference:{path:"extReference",op:"contains",type:"string",description:"Bank reference",cliFlag:"--ref <reference>"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"},minAmount:{path:"netAmount",op:"gte",type:"number",description:"Minimum net amount"},maxAmount:{path:"netAmount",op:"lte",type:"number",description:"Maximum net amount"}},kD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0}});var ND,FD,kQe=K(()=>{"use strict";Vs();ND={status:{path:"status",op:"multi",type:"string",description:"Status",enum:X1e},itemCategory:{path:"itemCategory",op:"eq",type:"string",description:"Category",enum:eQe},appliesToSale:{path:"appliesToSale",op:"boolean",type:"boolean",description:"Filter to sale items only",cliFlag:"--sale"},appliesToPurchase:{path:"appliesToPurchase",op:"boolean",type:"boolean",description:"Filter to purchase items only",cliFlag:"--purchase"}},FD={sortBy:"internalName",sortOrder:"ASC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0}});var OD,QD,NQe=K(()=>{"use strict";Vs();OD={name:{path:"name",op:"contains",type:"string",description:"Asset name"},reference:{path:"reference",op:"contains",type:"string",description:"Reference",cliFlag:"--ref <reference>"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:nQe},category:{path:"category",op:"eq",type:"string",description:"Category",enum:iQe},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},typeName:{path:"typeName",op:"contains",type:"string",description:"Asset type name"},startDate:{path:"purchaseDate",op:"gte",type:"string",description:"Purchase date from (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"purchaseDate",op:"lte",type:"string",description:"Purchase date to (YYYY-MM-DD)",cliFlag:"--to <date>"},minAmount:{path:"purchaseAmount",op:"gte",type:"number",description:"Minimum purchase amount"},maxAmount:{path:"purchaseAmount",op:"lte",type:"number",description:"Maximum purchase amount"}},QD={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});var LD,MD,FQe=K(()=>{"use strict";Vs();LD={type:{path:"businessTransactionType",op:"eq",type:"string",description:"Transaction type (SALE, PURCHASE, JOURNAL_MANUAL)"},status:{path:"status",op:"multi",type:"string",description:"Scheduler status",enum:oQe},subscriptionStatus:{path:"subscriptionStatus",op:"multi",type:"string",description:"Subscription status",enum:sQe},schedulerType:{path:"schedulerType",op:"eq",type:"string",description:"Scheduler type"},interval:{path:"interval",op:"eq",type:"string",description:"Interval",enum:aQe},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact name"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code"}},MD={sortBy:"nextScheduleDate",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});var PD,UD,OQe=K(()=>{"use strict";Vs();PD={id:{path:"resourceId",op:"eq",type:"string",description:"Job ID (the jobId returned from bulk operations)",cliFlag:"--id"},status:{path:"status",op:"multi",type:"string",description:"Job status",enum:mQe},type:{path:"jobType",op:"eq",type:"string",description:"Job type (e.g. UPSERT_CONTACTS, UPSERT_ITEMS, PROCESS_BANK_STATEMENT_FILES)",cliFlag:"--type"},fileName:{path:"fileName",op:"contains",type:"string",description:"File name (file-based jobs only)",cliFlag:"--file-name"},from:{path:"createdAt",op:"gte",type:"string",description:"On/after (ISO date)",cliFlag:"--from"},to:{path:"createdAt",op:"lte",type:"string",description:"On/before (ISO date)",cliFlag:"--to"}},UD={sortBy:"createdAt",sortOrder:"DESC",defaultLimit:20}});var tZ,rZ,QQe=K(()=>{"use strict";tZ={name:{path:"name",op:"contains",type:"string",description:"Purchase item name"},reference:{path:"reference",op:"contains",type:"string",description:"Reference name"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (ISO 4217)"}},rZ={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});var $D,qD,nZ,iZ,LQe=K(()=>{"use strict";$D={catalogName:{path:"catalogName",op:"contains",type:"string",description:"Catalog name"},description:{path:"description",op:"contains",type:"string",description:"Catalog item description"},status:{path:"status",op:"multi",type:"string",description:"Record status (e.g. ACTIVE, INACTIVE)"},contactGroupResourceId:{path:"contactGroupResourceId",op:"eq",type:"string",description:"Contact group resourceId"}},qD={sortBy:"catalogName",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0},nZ={reportType:{path:"reportType",op:"eq",type:"string",description:"Report type"},reportCategory:{path:"reportCategory",op:"eq",type:"string",description:"Report category"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Only default templates",cliFlag:"--default"}},iZ={sortBy:"reportType",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});async function IM(t,e){return t.search("/api/v1/claims/search",e)}async function wM(t,e){return t.get(`/api/v1/claims/${e}`)}async function _M(t,e){return t.post("/api/v1/claims",e)}async function DM(t,e,r){return t.put(`/api/v1/claims/${e}`,r)}async function SM(t,e){return t.delete(`/api/v1/claims/${e}`)}async function RM(t,e,r){return t.delete(`/api/v1/claims/${e}/attachments/${r}`)}async function BM(t,e){return t.post(`/api/v1/claims/${e}/submit`,{})}async function xM(t,e){return t.post(`/api/v1/claims/${e}/approve`,{})}async function TM(t,e,r){return t.post(`/api/v1/claims/${e}/reject`,{rejectionReason:r})}async function kM(t,e,r){return t.post(`/api/v1/claims/${e}/cancel`,{cancellationReason:r})}async function NM(t,e){return t.post(`/api/v1/claims/${e}/unpost`,{})}function jD(t){Kn(t,"resourceIds",500,"claims")}async function FM(t,e){return jD(e),t.post("/api/v1/claims/bulk/submit",{resourceIds:e})}async function OM(t,e){return jD(e),t.post("/api/v1/claims/bulk/approve",{resourceIds:e})}async function QM(t,e){return jD(e),t.post("/api/v1/claims/bulk/delete",{resourceIds:e})}async function LM(t,e,r){return jD(e),t.post("/api/v1/claims/bulk/reject",{resourceIds:e,rejectionReason:r})}async function MM(t,e,r){return jD(e),t.post("/api/v1/claims/bulk/cancel",{resourceIds:e,cancellationReason:r})}async function PM(t){let e=await t.get("/api/v1/claims/tracking-tags");return Array.isArray(e)?e:e?.data??[]}async function UM(t){let e=await t.get("/api/v1/claims/custom-field-values");return Array.isArray(e)?e:e?.data??[]}var MQe,$M=K(()=>{"use strict";Ra();MQe=["DRAFT","SUBMITTED","APPROVED","CONVERTED","REJECTED","CANCELLED"]});var YD,HD,G$t,V$t,zD,GD,VD,JD,WD,ZD,XD,KD,PQe=K(()=>{"use strict";nD();sD();$M();YD={status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:MQe},employeeResourceId:{path:"employeeResourceId",op:"eq",type:"string",description:"Employee resourceId"},contactResourceId:{path:"contactResourceId",op:"eq",type:"string",description:"Vendor contact resourceId"},claimProfileResourceId:{path:"claimProfileResourceId",op:"eq",type:"string",description:"Claim profile resourceId"},approverUserResourceId:{path:"approverUserResourceId",op:"eq",type:"string",description:"Approver user resourceId"},reference:{path:"reference",op:"contains",type:"string",description:"Claim reference"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (ISO 4217)"},startDate:{path:"valueDate",op:"gte",type:"string",description:"Value date on/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"Value date on/before (YYYY-MM-DD)",cliFlag:"--to <date>"},createdFrom:{path:"createdAt",op:"gte",type:"string",description:"Created on/after (YYYY-MM-DD)"},createdTo:{path:"createdAt",op:"lte",type:"string",description:"Created on/before (YYYY-MM-DD)"},minAmount:{path:"totalAmount",op:"gte",type:"number",description:"Minimum total amount"},maxAmount:{path:"totalAmount",op:"lte",type:"number",description:"Maximum total amount"}},HD={sortBy:"createdAt",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50},G$t=["RECORDED","COMPLETED","CANCELLED","IN_PROGRESS","ACTION_NEEDED"],V$t=["DIRECT_ENTRY","REIMBURSEMENT_PAYOUT","ADVANCE"],zD={employeeResourceId:{path:"employeeResourceId",op:"eq",type:"string",description:"Employee resourceId"},employeeName:{path:"employeeName",op:"contains",type:"string",description:"Employee name"},reference:{path:"reference",op:"contains",type:"string",description:"Payout reference"},payoutStatus:{path:"payoutStatus",op:"multi",type:"string",description:"Payout status (comma-separated)",enum:G$t},payoutType:{path:"payoutType",op:"multi",type:"string",description:"Payout type (comma-separated)",enum:V$t}},GD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20},VD={name:{path:"name",op:"contains",type:"string",description:"Claim type name"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Org default claim type"},expenseAccountResourceId:{path:"expenseAccountResourceId",op:"eq",type:"string",description:"Default expense account resourceId"},taxProfileResourceId:{path:"taxProfileResourceId",op:"eq",type:"string",description:"Default tax profile resourceId"}},JD={sortBy:"name",sortOrder:"ASC",defaultLimit:100},WD={name:{path:"name",op:"contains",type:"string",description:"Claim profile name"},approverUserResourceId:{path:"approverUserResourceId",op:"eq",type:"string",description:"Default approver user resourceId"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Org default profile"},minClaimAmount:{path:"minClaimAmount",op:"gte",type:"number",description:"Minimum claim total (>=)"},maxClaimAmount:{path:"maxClaimAmount",op:"lte",type:"number",description:"Maximum claim total (<=)"},maxPerPeriodAmount:{path:"maxPerPeriodAmount",op:"lte",type:"number",description:"Per-period spend cap (<=)"},perPeriod:{path:"perPeriod",op:"eq",type:"string",description:"Per-period window",enum:tD},employeeBalanceAccountResourceId:{path:"employeeBalanceAccountResourceId",op:"eq",type:"string",description:"Employee balance (liability) account resourceId"},digestEmailEnabled:{path:"digestEmailEnabled",op:"boolean",type:"boolean",description:"Digest email enabled"}},ZD={sortBy:"name",sortOrder:"ASC",defaultLimit:100},XD={name:{path:"name",op:"contains",type:"string",description:"Posting rule name"},outerAxis:{path:"outerAxis",op:"eq",type:"string",description:"Outer grouping axis",enum:iD},innerAxis:{path:"innerAxis",op:"eq",type:"string",description:"Inner line-aggregation axis",enum:oD},defaultBankAccountResourceId:{path:"defaultBankAccountResourceId",op:"eq",type:"string",description:"Default reimbursement bank account resourceId"},defaultIncludeReimbursementPayout:{path:"defaultIncludeReimbursementPayout",op:"boolean",type:"boolean",description:"Creates reimbursement DCE by default"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Org default rule"}},KD={sortBy:"name",sortOrder:"ASC",defaultLimit:100}});var eS,tS,rS,nS,UQe=K(()=>{"use strict";aD();eS={name:{path:"name",op:"contains",type:"string",description:"Employee name"},email:{path:"email",op:"contains",type:"string",description:"Work email"},phone:{path:"phone",op:"contains",type:"string",description:"Phone"},userResourceId:{path:"userResourceId",op:"eq",type:"string",description:"Bound login user resourceId"},managerEmployeeResourceId:{path:"managerEmployeeResourceId",op:"eq",type:"string",description:"Manager employee resourceId"},claimProfileResourceId:{path:"claimProfileResourceId",op:"eq",type:"string",description:"Claim profile resourceId"},currency:{path:"currency",op:"eq",type:"string",description:"Balance currency (ISO 4217)"},active:{path:"active",op:"boolean",type:"boolean",description:"Active employees only"},createdFrom:{path:"createdAt",op:"gte",type:"string",description:"Created on/after (YYYY-MM-DD)"},createdTo:{path:"createdAt",op:"lte",type:"string",description:"Created on/before (YYYY-MM-DD)"}},tS={sortBy:"name",sortOrder:"ASC",defaultLimit:50},rS={name:{path:"name",op:"contains",type:"string",description:"Employee name"},email:{path:"email",op:"contains",type:"string",description:"Work email"},phone:{path:"phone",op:"contains",type:"string",description:"Phone"},currency:{path:"currency",op:"eq",type:"string",description:"Balance currency (ISO 4217)"},employmentType:{path:"employmentType",op:"eq",type:"string",description:"Employment type",enum:_A},active:{path:"active",op:"boolean",type:"boolean",description:"Active employees only"}},nS={sortBy:"name",sortOrder:"ASC",defaultLimit:50}});var iS,oS,sS,aS,cS,lS,uS,dS,fS,pS,hS,mS,AS,gS,yS,ES,bS,CS,$Qe=K(()=>{"use strict";Vs();iS={name:{path:"name",op:"contains",type:"string",description:"Account name"},code:{path:"code",op:"contains",type:"string",description:"Account code"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:K1e},accountClass:{path:"accountClass",op:"eq",type:"string",description:"Account class",enum:uQe},accountType:{path:"accountType",op:"eq",type:"string",description:"Account type",enum:dQe},controlFlag:{path:"controlFlag",op:"boolean",type:"boolean",description:"Control flag (system accounts)"}},oS={sortBy:"code",sortOrder:"ASC",defaultLimit:100,supportsQuery:!1},sS={query:{path:"tagName",op:"contains",type:"string",description:"Tag name"}},aS={sortBy:"tagName",sortOrder:"ASC",defaultLimit:100},cS={name:{path:"name",op:"contains",type:"string",description:"Tax profile name",cliFlag:"--name <name>"},taxTypeCode:{path:"taxTypeCode",op:"contains",type:"string",description:"Tax type code"},appliesToSale:{path:"appliesToSale",op:"boolean",type:"boolean",description:"Filter to sale profiles"},appliesToPurchase:{path:"appliesToPurchase",op:"boolean",type:"boolean",description:"Filter to purchase profiles"},appliesToSaleCreditNote:{path:"appliesToSaleCreditNote",op:"boolean",type:"boolean",description:"Filter to sale CN profiles"},appliesToPurchaseCreditNote:{path:"appliesToPurchaseCreditNote",op:"boolean",type:"boolean",description:"Filter to purchase CN profiles"}},lS={sortBy:"name",sortOrder:"ASC",defaultLimit:100,supportsQuery:!0},uS={title:{path:"title",op:"contains",type:"string",description:"Capsule title"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:hQe}},dS={sortBy:"title",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0},fS={query:{path:"customFieldName",op:"contains",type:"string",description:"Custom field name",cliFlag:"--name <name>"},datatypeCode:{path:"datatypeCode",op:"eq",type:"string",description:"Data type",enum:fQe,cliFlag:"--type <type>"},customFieldName:{path:"customFieldName",op:"contains",type:"string",description:"(alias for query)"}},pS={sortBy:"customFieldName",sortOrder:"ASC",defaultLimit:100},hS={query:{path:"name",op:"contains",type:"string",description:"Group name"}},mS={sortBy:"name",sortOrder:"ASC",defaultLimit:100},AS={query:{path:"name",op:"contains",type:"string",description:"User name"},email:{path:"email",op:"contains",type:"string",description:"Email"},role:{path:"role",op:"eq",type:"string",description:"Role",enum:pQe},status:{path:"status",op:"multi",type:"string",description:"Status",enum:bM}},gS={sortBy:"name",sortOrder:"ASC",defaultLimit:50},yS={query:{path:"name",op:"contains",type:"string",description:"Rule name"},account:{path:"appliesToReconciliationAccount",op:"eq",type:"string",description:"Bank account resourceId",cliFlag:"--account <id>"}},ES={sortBy:"name",sortOrder:"ASC",defaultLimit:100},bS={query:{path:"type",op:"contains",type:"string",description:"Classifier type"}},CS={sortBy:"type",sortOrder:"ASC",defaultLimit:100}});var lr=K(()=>{"use strict";Vs();vM();X7();IQe();wQe();DQe();SQe();RQe();BQe();xQe();TQe();kQe();NQe();FQe();OQe();QQe();LQe();PQe();UQe();$Qe()});async function qQe(t,e){return t.list("/api/v1/modules",e)}async function jQe(t,e){return t.get(`/api/v1/modules/${encodeURIComponent(e)}`)}var YQe=K(()=>{"use strict"});async function HQe(t,e){return t.list("/api/v1/purchase-items",e)}async function zQe(t,e){return t.get(`/api/v1/purchase-items/${encodeURIComponent(e)}`)}async function GQe(t,e){return t.search("/api/v1/purchase-items/search",e)}var VQe=K(()=>{"use strict"});async function qM(t,e){return t.list("/api/v1/invoices",e)}async function Is(t,e){let r=await t.get(`/api/v1/invoices/${e}`);return"data"in r&&typeof r.data=="object"?r:{data:r}}async function Kb(t,e){return t.search("/api/v1/invoices/search",e)}async function xA(t,e){return t.post("/api/v1/invoices",{...e,saveAsDraft:e.saveAsDraft??!0})}async function jM(t,e,r){return t.put(`/api/v1/invoices/${e}`,r)}async function YM(t,e){await t.delete(`/api/v1/invoices/${e}`)}async function vS(t,e,r){return t.post(`/api/v1/invoices/${e}/payments`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function IS(t,e){return t.post("/api/v1/scheduled/invoices",e)}async function HM(t,e,r){return t.post(`/api/v1/invoices/${e}/credits`,{credits:r})}async function wS(t,e,r){return t.put(`/api/v1/invoices/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function zM(t,e){return t.get(`/api/v1/invoices/${e}/download`)}async function GM(t,e){let r=await t.get(`/api/v1/invoices/${e}/payments`);return{data:Array.isArray(r)?r:r.data??[]}}async function VM(t,e){let r=await t.get(`/api/v1/invoices/${e}/credits`);return{data:Array.isArray(r)?r:r.data??[]}}async function JM(t,e,r){await t.delete(`/api/v1/invoices/${e}/credits/${r}`)}async function WM(t,e){return Jo(t,"/api/v1/invoices/bulk-upsert","invoices",e)}async function ZM(t,e){return Jo(t,"/api/v1/invoices/line-items/bulk-upsert","invoices",e)}var TA=K(()=>{"use strict";Ra()});async function JQe(t,e,r){return t.list(`/api/v1/${Al[e]}`,r)}async function Rd(t,e,r){return t.get(`/api/v1/${Al[e]}/${r}`)}async function XM(t,e,r){return t.search(`/api/v1/${Al[e]}/search`,r)}async function KM(t,e,r){return t.search(`/api/v1/${Al[e]}/line-items/search`,r)}async function _S(t,e){return t.post("/api/v1/sale-quotes",{...e,saveAsDraft:e.saveAsDraft??!0})}async function DS(t,e){return t.post("/api/v1/sale-orders",e)}async function eP(t,e,r,n){return t.post(`/api/v1/${Al[e]}/${r}/convert-to-invoice`,n)}async function tP(t,e,r,n){return t.put(`/api/v1/${Al[e]}/${r}`,n)}async function rP(t,e,r){await t.delete(`/api/v1/${Al[e]}/${r}`)}async function nP(t,e,r,n){return t.post(`/api/v1/${Al[e]}/${r}/void`,n?{internalNotes:n}:{})}async function iP(t,e){return t.post(`/api/v1/sale-quotes/${e}/accept`,{})}async function oP(t,e){return t.post(`/api/v1/sale-orders/${e}/confirm`,{})}async function WQe(t,e,r,n){return t.post(`/api/v1/${Al[e]}/${r}/fast-fix`,{attributes:n})}async function ZQe(t,e,r,n){return t.post(`/api/v1/${Al[e]}/bulk-void`,{resourceIds:r,...n?{internalNotes:n}:{}})}async function XQe(t,e){return t.post("/api/v1/sale-quotes/bulk-accept",{resourceIds:e})}async function KQe(t,e){return t.post("/api/v1/sale-orders/bulk-confirm",{resourceIds:e})}async function eLe(t,e,r){return t.post(`/api/v1/${Al[e]}/bulk-delete`,{resourceIds:r})}async function tLe(t,e){return t.post("/api/v1/sale-orders/line-items/bulk-upsert",{saleOrders:e})}var Al,oZ=K(()=>{"use strict";Al={SALE_QUOTE:"sale-quotes",SALE_ORDER:"sale-orders"}});async function rLe(t,e,r){return t.list(`/api/v1/${gl[e]}`,r)}async function Bd(t,e,r){return t.get(`/api/v1/${gl[e]}/${r}`)}async function sP(t,e,r){return t.search(`/api/v1/${gl[e]}/search`,r)}async function aP(t,e,r){return t.search(`/api/v1/${gl[e]}/line-items/search`,r)}async function SS(t,e){return t.post("/api/v1/purchase-requests",{...e,saveAsDraft:e.saveAsDraft??!0})}async function RS(t,e){return t.post("/api/v1/purchase-orders",{...e,saveAsDraft:e.saveAsDraft??!0})}async function cP(t,e,r,n){return t.post(`/api/v1/${gl[e]}/${r}/convert-to-bill`,n)}async function lP(t,e,r,n){return t.put(`/api/v1/${gl[e]}/${r}`,n)}async function uP(t,e,r){await t.delete(`/api/v1/${gl[e]}/${r}`)}async function dP(t,e,r,n){return t.post(`/api/v1/${gl[e]}/${r}/void`,n?{internalNotes:n}:{})}async function fP(t,e){return t.post(`/api/v1/purchase-requests/${e}/accept`,{})}async function pP(t,e){return t.post(`/api/v1/purchase-orders/${e}/confirm`,{})}async function nLe(t,e,r,n){return t.post(`/api/v1/${gl[e]}/${r}/fast-fix`,{attributes:n})}async function iLe(t,e,r,n){return t.post(`/api/v1/${gl[e]}/bulk-void`,{resourceIds:r,...n?{internalNotes:n}:{}})}async function oLe(t,e){return t.post("/api/v1/purchase-requests/bulk-accept",{resourceIds:e})}async function sLe(t,e){return t.post("/api/v1/purchase-orders/bulk-confirm",{resourceIds:e})}async function aLe(t,e,r){return t.post(`/api/v1/${gl[e]}/bulk-delete`,{resourceIds:r})}async function cLe(t,e){return t.post("/api/v1/purchase-orders/line-items/bulk-upsert",{purchaseOrders:e})}var gl,sZ=K(()=>{"use strict";gl={PURCHASE_REQUEST:"purchase-requests",PURCHASE_ORDER:"purchase-orders"}});async function hP(t,e){return t.list("/api/v1/journals",e)}async function BS(t,e){return t.search("/api/v1/journals/search",e)}async function kA(t,e){return t.post("/api/v1/journals",{...e,saveAsDraft:e.saveAsDraft??!0})}async function mP(t,e){await t.delete(`/api/v1/journals/${e}`)}async function yl(t,e){return t.get(`/api/v1/journals/${e}`)}async function eC(t,e,r){return t.put(`/api/v1/journals/${e}`,r)}async function lLe(t,e,r){return t.put(`/api/v1/journals/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function xS(t,e){return t.post("/api/v1/scheduled/journals",e)}async function AP(t,e){return Jo(t,"/api/v1/journals/bulk-upsert","journals",e)}var tC=K(()=>{"use strict";Ra()});async function gP(t,e){return t.post("/api/v1/generate-reports/trial-balance",e)}async function yP(t,e){return t.post("/api/v1/generate-reports/balance-sheet",e)}async function EP(t,e){return t.post("/api/v1/generate-reports/profit-and-loss",e)}async function bP(t,e){return t.post("/api/v1/generate-reports/cashflow",e)}async function CP(t,e){return t.post("/api/v1/generate-reports/ar-summary-report",e)}async function vP(t,e){return t.post("/api/v1/generate-reports/ap-summary-report",e)}function rC(t,e){let{root:r,rows:n}=J$t[e],i=t.data?.[r]??{},o=Array.isArray(i[n])?i[n]:[],s={current:0,lessThanOneMonth:0,oneMonth:0,twoMonths:0,threeMonths:0,older:0,total:0};for(let u of o)s.current+=u.currentIso??0,s.lessThanOneMonth+=u.lessThanOneMonthIso??0,s.oneMonth+=u.oneMonthIso??0,s.twoMonths+=u.twoMonthsIso??0,s.threeMonths+=u.threeMonthsIso??0,s.older+=u.olderIso??0,s.total+=u.balanceIso??0;let a=u=>Math.round(u*100)/100,c=i.startDate;return{reportType:e==="receivables"?"AGED_RECEIVABLES":"AGED_PAYABLES",organizationName:i.organizationName,asAt:typeof c=="number"?new Date(c).toISOString().slice(0,10):void 0,currencyCode:i.currencyCode,currencySymbol:i.currencySymbol,buckets:{current:a(s.current),lessThanOneMonth:a(s.lessThanOneMonth),oneMonth:a(s.oneMonth),twoMonths:a(s.twoMonths),threeMonths:a(s.threeMonths),older:a(s.older)},totalOutstanding:a(s.total),contactCount:o.length}}async function IP(t,e){return t.post("/api/v1/generate-reports/cash-balance",e)}async function wP(t,e){return t.post("/api/v1/generate-reports/general-ledger",e)}async function _P(t,e){return t.post("/api/v1/generate-reports/vat-ledger",e)}async function DP(t,e){return t.post("/api/v1/generate-reports/equity-movement",e)}async function SP(t,e){return t.post("/api/v1/generate-reports/bank-balance-summary",e)}async function RP(t,e){return t.post("/api/v1/generate-reports/bank-reconciliation-summary",e)}async function BP(t,e){return t.post("/api/v1/generate-reports/bank-reconciliation-details",e)}async function xP(t,e){return t.post("/api/v1/generate-reports/fixed-assets-summary",e)}async function TP(t,e){return t.post("/api/v1/generate-reports/fixed-assets-recon-summary",e)}async function kP(t,e){return t.post("/api/v1/generate-reports/ar-report",e)}async function NP(t){return t.get("/api/v1/ledger/highlights")}var J$t,aZ=K(()=>{"use strict";J$t={receivables:{root:"generateAgedReceivablesReportGroupByContact",rows:"customerSummary"},payables:{root:"generateAgedPayablesReportGroupByContact",rows:"supplierSummary"}}});async function FP(t,e){return t.list("/api/v1/catalogs",e)}async function OP(t,e){return t.get(`/api/v1/catalogs/${encodeURIComponent(e)}`)}async function QP(t,e){return t.search("/api/v1/catalogs/search",e)}async function LP(t,e){return t.post("/api/v1/catalogs",e)}async function MP(t,e,r){return t.put(`/api/v1/catalogs/${encodeURIComponent(e)}`,r)}async function PP(t,e){await t.delete(`/api/v1/catalogs/${encodeURIComponent(e)}`)}var cZ=K(()=>{"use strict"});async function uLe(t,e){return t.list("/api/v1/organization-report-template",e)}async function dLe(t,e){return t.get(`/api/v1/organization-report-template/${encodeURIComponent(e)}`)}async function fLe(t,e){return t.search("/api/v1/organization-report-template/search",e)}var pLe=K(()=>{"use strict"});async function UP(t,e){return t.list("/api/v1/customer-credit-notes",e)}async function El(t,e){return t.get(`/api/v1/customer-credit-notes/${e}`)}async function TS(t,e){return t.search("/api/v1/customer-credit-notes/search",e)}async function kS(t,e){return t.post("/api/v1/customer-credit-notes",{...e,saveAsDraft:e.saveAsDraft??!0})}async function $P(t,e,r){return t.put(`/api/v1/customer-credit-notes/${e}`,r)}async function NS(t,e,r){return t.put(`/api/v1/customer-credit-notes/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function qP(t,e){await t.delete(`/api/v1/customer-credit-notes/${e}`)}async function FS(t,e,r){return t.post(`/api/v1/customer-credit-notes/${e}/refunds`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function jP(t,e){return t.get(`/api/v1/customer-credit-notes/${e}/refunds`)}async function YP(t,e){return t.get(`/api/v1/customer-credit-notes/${e}/download`)}async function HP(t,e){return Jo(t,"/api/v1/customer-credit-notes/bulk-upsert","customerCreditNotes",e)}var zP=K(()=>{"use strict";Ra()});async function GP(t,e){return t.list("/api/v1/supplier-credit-notes",e)}async function bl(t,e){return t.get(`/api/v1/supplier-credit-notes/${e}`)}async function OS(t,e){return t.search("/api/v1/supplier-credit-notes/search",e)}async function QS(t,e){return t.post("/api/v1/supplier-credit-notes",{...e,saveAsDraft:e.saveAsDraft??!0})}async function VP(t,e,r){return t.put(`/api/v1/supplier-credit-notes/${e}`,r)}async function LS(t,e,r){return t.put(`/api/v1/supplier-credit-notes/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function JP(t,e){await t.delete(`/api/v1/supplier-credit-notes/${e}`)}async function WP(t,e){return t.get(`/api/v1/supplier-credit-notes/${e}/download`)}async function MS(t,e,r){return t.post(`/api/v1/supplier-credit-notes/${e}/refunds`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function ZP(t,e){return t.get(`/api/v1/supplier-credit-notes/${e}/refunds`)}async function XP(t,e){return Jo(t,"/api/v1/supplier-credit-notes/bulk-upsert","supplierCreditNotes",e)}var KP=K(()=>{"use strict";Ra()});async function PS(t){return t.get("/api/v1/organization/currencies")}async function e2(t,e){return t.post("/api/v1/organization/currencies",{currencies:e})}async function t2(t,e,r){return t.list(`/api/v1/organization/currencies/${e}/rates`,r)}async function r2(t,e,r){return t.post(`/api/v1/organization/currencies/${e}/rates`,r)}async function n2(t,e,r,n){return t.put(`/api/v1/organization/currencies/${e}/rates/${r}`,n)}async function i2(t,e){return t.post("/api/v1/organization/currencies/rates/bulk-upsert",{rates:e})}var o2=K(()=>{"use strict"});var hLe=b((lZ,uZ)=>{(function(t,e){typeof define=="function"&&define.amd?define([],e):typeof uZ=="object"&&typeof lZ<"u"?uZ.exports=e():t.Papa=e()})(lZ,function t(){"use strict";var e=(function(){return typeof self<"u"?self:typeof window<"u"?window:typeof e<"u"?e:{}})();function r(){var D=e.URL||e.webkitURL||null,x=t.toString();return a.BLOB_URL||(a.BLOB_URL=D.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ","(",x,")();"],{type:"text/javascript"})))}var n=!e.document&&!!e.postMessage,i=e.IS_PAPA_WORKER||!1,o={},s=0,a={};if(a.parse=u,a.unparse=d,a.RECORD_SEP="",a.UNIT_SEP="",a.BYTE_ORDER_MARK="\uFEFF",a.BAD_DELIMITERS=["\r",`
|
|
448
|
+
`)}var YOe,VOe=K(()=>{"use strict";Fe();YOe={400:"Check request format. The server could not parse the request body.",401:"API key may be invalid. Run `clio auth whoami` to check.",403:"Permission denied. Check your API key scope.",404:"Resource not found. Check the ID and try again.",409:"Conflict \u2014 the resource may have been modified. Refresh and retry.",422:"Validation failed. Check your input fields.",429:"Rate limited. Wait a moment and try again."}});var JOe={};Hc(JOe,{apiAction:()=>L});function UUt(t){let e=String(t?.message??"");if(e.includes("401")||e.includes("Unauthorized"))return"clio auth whoami";if(e.includes("404"))return"Check the resourceId. Use search to find it.";if(e.includes("Multiple")&&e.includes("match"))return"Use exact name or UUID instead of fuzzy name.";if(e.includes("rate limit")||e.includes("429"))return"Wait 30 seconds, then retry.";if(e.includes("No API key"))return"clio auth add <your-jaz-api-key>"}function L(t){return async e=>{let r,n=!1;try{n=IA(e)}catch{}try{if(e.apiKey&&e.org)throw new ms("Cannot use both --api-key and --org. Use one or the other.");let i=Fm(e.apiKey),o=new $o(i,"cli");if(!n){let s=VI();if(s){let a=ec(s);if(a){let c=JI(),u=c==="env-org"||c==="flag-org"||c==="flag-api-key"||c==="env-api-key",d=0;try{d=Object.keys(Zc()??{}).length}catch{}qOe({label:s,orgName:a.orgName,currency:a.currency},u,d>1)}}}await t(o,e,i)}catch(i){let o=UUt(i);i instanceof ms&&(console.error(n?JSON.stringify({error:{code:"AUTH_ERROR",message:i.message,...o?{try:o}:{}}}):zOe(i.message)),process.exit(3)),i instanceof Ps&&(console.error(n?JSON.stringify({error:{code:"API_ERROR",status:i.status,message:i.message,...o?{try:o}:{}}}):HOe(i.status,i.message,i.endpoint)),process.exit(2));let s=i.message;console.error(n?JSON.stringify({error:{code:"UNKNOWN_ERROR",message:s,...o?{try:o}:{}}}):GOe(s)),process.exit(2)}finally{r?.stop()}}}var Et=K(()=>{"use strict";Zl();ub();Ut();jOe();VOe()});async function dL(t,e){return t.list("/api/v1/items",e)}async function Rb(t,e){return t.get(`/api/v1/items/${e}`)}async function Bb(t,e){return t.search("/api/v1/items/search",e)}async function V_(t,e){let r={...e};return e.appliesToSale&&!r.saleItemName&&(r.saleItemName=e.internalName),e.appliesToPurchase&&!r.purchaseItemName&&(r.purchaseItemName=e.internalName),t.post("/api/v1/items",r)}async function fL(t,e,r){let i=(await Rb(t,e)).data,o={itemCode:i.itemCode,internalName:i.internalName,appliesToSale:i.appliesToSale,appliesToPurchase:i.appliesToPurchase};return i.appliesToSale&&(i.saleItemName&&(o.saleItemName=i.saleItemName),i.salePrice!==void 0&&(o.salePrice=i.salePrice),i.saleAccountResourceId&&(o.saleAccountResourceId=i.saleAccountResourceId)),i.appliesToPurchase&&(i.purchaseItemName&&(o.purchaseItemName=i.purchaseItemName),i.purchasePrice!==void 0&&(o.purchaseItemPrice=i.purchasePrice),i.purchaseAccountResourceId&&(o.purchaseAccountResourceId=i.purchaseAccountResourceId)),Object.assign(o,r),t.put(`/api/v1/items/${e}`,o)}async function pL(t,e){await t.delete(`/api/v1/items/${e}`)}async function hL(t,e){return t.post("/api/v1/items/bulk-upsert",{items:e})}var mL=K(()=>{"use strict"});async function xb(t){return t.get("/api/v1/capsuleTypes")}async function J_(t,e){return t.post("/api/v1/capsuleTypes",e)}async function AL(t,e){return t.list("/api/v1/capsules",e)}async function Tb(t,e){return t.search("/api/v1/capsules/search",e)}async function W_(t,e){return t.get(`/api/v1/capsules/${e}`)}async function wA(t,e){return t.post("/api/v1/capsules",e)}async function gL(t,e,r){let n=await W_(t,e),i=n.data.capsuleType?.resourceId;if(!i)throw new Error(`Cannot update capsule ${e}: missing capsuleType.resourceId from GET response`);let o={resourceId:e,capsuleTypeResourceId:i,title:n.data.title,description:n.data.description,...r};return t.put(`/api/v1/capsules/${e}`,o)}async function yL(t,e){await t.delete(`/api/v1/capsules/${e}`)}async function EL(t,e){return t.post("/api/v1/moveTransactionCapsules",e)}var Z_=K(()=>{"use strict"});async function kb(t,e){return t.list("/api/v1/tax-profiles",e)}async function bL(t,e){return t.list("/api/v1/tax-types",e)}async function CL(t,e){return t.post("/api/v1/tax-profiles",e)}async function Nb(t,e){return t.post("/api/v1/tax-profiles/search",e)}async function vL(t,e){return t.get(`/api/v1/tax-profiles/${e}`)}async function IL(t,e,r){return t.put(`/api/v1/tax-profiles/${e}`,r)}async function wL(t){let e=await t.get("/api/v1/withholding-tax-codes");return{data:Array.isArray(e)?e:e.data??[]}}var X_=K(()=>{"use strict"});async function Fb(t,e){return t.list("/api/v1/tags",e)}async function _L(t,e){return t.get(`/api/v1/tags/${e}`)}async function DL(t,e){return t.search("/api/v1/tags/search",e)}async function K_(t,e){return t.post("/api/v1/tags",e)}async function SL(t,e,r){return t.put(`/api/v1/tags/${e}`,r)}async function RL(t,e){await t.delete(`/api/v1/tags/${e}`)}var BL=K(()=>{"use strict"});async function xL(t,e){return t.list("/api/v1/claim-types",e)}async function TL(t,e){return t.get(`/api/v1/claim-types/${e}`)}async function Ob(t,e){return t.search("/api/v1/claim-types/search",e)}async function kL(t,e){return t.post("/api/v1/claim-types",e)}async function NL(t,e,r){return t.put(`/api/v1/claim-types/${e}`,r)}async function FL(t,e){await t.delete(`/api/v1/claim-types/${e}`)}var eD,OL=K(()=>{"use strict";eD=["expenseAccountResourceId","taxProfileResourceId","classifierConfig"]});async function QL(t,e){return t.list("/api/v1/claim-profiles",e)}async function LL(t,e){return t.get(`/api/v1/claim-profiles/${e}`)}async function Qb(t,e){return t.search("/api/v1/claim-profiles/search",e)}async function ML(t,e){return t.post("/api/v1/claim-profiles",e)}async function PL(t,e,r){return t.put(`/api/v1/claim-profiles/${e}`,r)}async function UL(t,e){await t.delete(`/api/v1/claim-profiles/${e}`)}var tD,S7,rD,nD=K(()=>{"use strict";tD=["DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"],S7=["NO_TAX","INCLUSIVE"],rD=["approverUserResourceId","visibleClaimTypeIds","visibleTaxProfileIds","visibleClassifierIds","visibleVendorResourceIds","allowedCurrencies","minClaimAmount","maxClaimAmount","maxPerPeriodAmount","perPeriod","employeeBalanceAccountResourceId","taxMode"]});async function $L(t,e){return t.list("/api/v1/posting-rules",e)}async function qL(t,e){return t.get(`/api/v1/posting-rules/${e}`)}async function Lb(t,e){return t.search("/api/v1/posting-rules/search",e)}async function jL(t,e){return t.post("/api/v1/posting-rules",e)}async function YL(t,e,r){return t.put(`/api/v1/posting-rules/${e}`,r)}async function HL(t,e){await t.delete(`/api/v1/posting-rules/${e}`)}var iD,oD,sD=K(()=>{"use strict";iD=["PER_EMPLOYEE","PER_VENDOR","PER_PAIR","ONE_BATCH","PER_CLAIM"],oD=["RAW","BY_CT_TP_NC","BY_CT_TP_NC_EMPLOYEE","BY_CT_TP_NC_VENDOR"]});async function Mb(t,e){return t.search("/api/v1/employees/search",e)}async function zL(t,e){return t.search("/api/v1/employees/balances/search",e)}async function GL(t,e){return t.get(`/api/v1/employees/${e}`)}async function VL(t,e){return t.post("/api/v1/employees",e)}async function JL(t,e,r){return t.put(`/api/v1/employees/${e}`,r)}async function WL(t,e){return t.delete(`/api/v1/employees/${e}`)}async function ZL(t,e,r){return t.post(`/api/v1/employees/${e}/bind-user`,{userResourceId:r})}async function XL(t,e){return t.post("/api/v1/employees/import/preprocess",e)}async function KL(t,e){if((e.create?.length??0)+(e.update?.length??0)+(e.delete?.length??0)===0)throw new Error("import requires at least one create / update / delete row.");for(let[n,i]of Object.entries(e))if(Array.isArray(i)&&i.length>100)throw new Error(`max 100 ${n} rows per import. Split into batches.`);return t.post("/api/v1/employees/import",e)}var _A,aD=K(()=>{"use strict";_A=["FULL_TIME","PART_TIME","CONTRACTOR","INTERN","TEMPORARY","CONSULTANT"]});async function cD(t,e){return e?((await cc(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(n=>n.name===e):void 0}async function eM(t,e){return e?((await Bb(t,{filter:{itemCode:{eq:e}},limit:5}))?.data??[]).find(n=>n.itemCode===e):void 0}function Pb(t){if(typeof t!="string")return String(t??"");let e=t.trim();return $Ut[e.toLowerCase()]??e}async function WOe(t,e){if(!e?.trim())return;let r=e.trim().toLowerCase();return((await Tb(t,{filter:{title:{contains:e.trim()}},limit:20}))?.data??[]).find(i=>i.title?.trim().toLowerCase()===r)}async function tM(t,e){return e?((await Ub(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(n=>n.name===e):void 0}async function rM(t,e){return e?((await Nb(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(n=>n.name===e):void 0}async function nM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Fb(t,{limit:500}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function iM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Ob(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function oM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Qb(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function sM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Lb(t,{filter:{name:{eq:e}},limit:5}))?.data??[]).find(i=>i.name.toLowerCase().trim()===r)}async function aM(t,e){if(!e)return;let r=e.toLowerCase().trim();return((await Mb(t,{filter:{email:{eq:e}},limit:5}))?.data??[]).find(i=>i.email?.toLowerCase().trim()===r)}function ZOe(t,e,r){if(!qUt.test(t))throw new Error(`${e} must be a valid UUID (got "${t}"). ${r}`)}function hl(t,e={}){if(!(e.assumeFinalize===!0||t.saveAsDraft===!1))return;let n=t.lineItems;if(!Array.isArray(n)||n.length===0)return;let i=[];for(let a=0;a<n.length;a++){let c=n[a];if(!c||typeof c!="object")continue;let u=c.accountResourceId;(typeof u!="string"||u.trim().length===0)&&i.push(a)}if(i.length===0)return;let o=i.slice(0,5).join(", "),s=i.length>5?` (and ${i.length-5} more)`:"";return{error:`lineItems[${o}]${s}: accountResourceId is required when finalizing.`,status:422,hint:"Pre-flight guard \u2014 request never hit Clio. Search for the right GL account first, then retry with the resourceId on each line item.",repair:{tool:"search_accounts",arguments:{},reason:"Line item missing accountResourceId on a finalize call. Search for the GL account (by name or accountType) and attach the resourceId to each line item."}}}var $Ut,qUt,uc=K(()=>{"use strict";Wf();mL();$b();Z_();X_();BL();OL();nD();sD();aD();$Ut={"current assets":"Current Asset","current asset":"Current Asset","fixed assets":"Fixed Asset","fixed asset":"Fixed Asset","bank account":"Bank Accounts","bank accounts":"Bank Accounts",bank:"Bank Accounts","current liabilities":"Current Liability","current liability":"Current Liability","non-current liabilities":"Non-current Liability","non-current liability":"Non-current Liability",equity:"Shareholders Equity","shareholders equity":"Shareholders Equity","shareholders' equity":"Shareholders Equity","shareholder's equity":"Shareholders Equity",revenue:"Operating Revenue","operating revenue":"Operating Revenue","other revenue":"Other Revenue","other income":"Other Revenue",expense:"Operating Expense","operating expense":"Operating Expense",expenses:"Operating Expense","direct costs":"Direct Costs","cost of goods sold":"Direct Costs",cogs:"Direct Costs",cash:"Cash",inventory:"Inventory","discontinued expense":"Discontinued Expense","discontinued income":"Discontinued Income","finance cost":"Finance Cost","finance costs":"Finance Cost","financing income":"Financing Income",goodwill:"Goodwill","income tax expense":"Income Tax Expense","income tax":"Income Tax Expense","tax expense":"Income Tax Expense","investing expense":"Investing Expense","investing income":"Investing Income",investment:"Investment",investments:"Investment"};qUt=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i});async function Id(t,e){return t.list("/api/v1/chart-of-accounts",e)}async function Ub(t,e){return t.search("/api/v1/chart-of-accounts/search",e)}async function XOe(t,e){return t.get(`/api/v1/chart-of-accounts/${e}`)}async function lD(t,e){return t.post("/api/v1/chart-of-accounts",e)}async function KOe(t,e,r){return t.put(`/api/v1/chart-of-accounts/${e}`,r)}function cM(t){let e={};for(let r of jUt){let n=t[r];n!=null&&(r==="accountType"&&typeof n=="string"?e.accountType=Pb(n):e[r]=n)}return e}async function lM(t,e){return t.post("/api/v1/chart-of-accounts/bulk-upsert",{accounts:e})}async function uM(t,e){await t.delete(`/api/v1/chart-of-accounts/${e}`)}async function e1e(t,e){return t.list("/api/v1/account-classifications",e)}var jUt,$b=K(()=>{"use strict";uc();jUt=["resourceId","code","name","accountType","currencyCode","description","status"]});function qb(t,e,r={}){let n=r.threshold??.4,i=r.limit??5,o=t.toLowerCase().trim(),s=e.find(c=>c.code?.toLowerCase()===o);if(s)return[{item:s,score:1}];let a=e.find(c=>c.name.toLowerCase()===o);return a?[{item:a,score:1}]:uA(t,e,c=>c.name,{threshold:n,limit:i})}function dM(t,e){let r=qb(t,e,{threshold:.45,limit:1});return r.length>0?r[0].item:null}function t1e(t){return t.filter(e=>e.status==="ACTIVE"&&!e.controlFlag&&e.accountType!=="Bank Accounts"&&e.accountType!=="Cash")}function r1e(t){return t.filter(e=>e.status==="ACTIVE"&&(e.accountType==="Bank Accounts"||e.accountType==="Cash"))}var R7=K(()=>{"use strict";cb()});function fM(t,e,r={}){let n=r.threshold??.4,i=r.limit??5;return e.map(s=>{let a=[s.billingName,s.name].filter(Boolean),c=Math.max(...a.map(u=>_W(t,u)));return{item:s,score:c}}).filter(s=>s.score>=n).sort((s,a)=>a.score-s.score).slice(0,i)}var B7=K(()=>{"use strict";cb()});var o1e={};Hc(o1e,{collectValue:()=>x7,parseCustomFields:()=>an,parseJournalEntries:()=>dc,parseJsonArray:()=>pu,parseJsonObject:()=>k7,parseLineItems:()=>Un,parseMoney:()=>ar,parseNonNegativeInt:()=>et,parseOrderTerms:()=>SA,parsePositiveInt:()=>be,parseRate:()=>wd,parseTemplateOverrides:()=>T7,readBodyInput:()=>ve,requireFields:()=>Qe,splitCsv:()=>Co,todayLocal:()=>N7});import{readFileSync as i1e}from"node:fs";function be(t){let e=Number.parseInt(t,10);return(!Number.isFinite(e)||e<=0)&&(console.error(oe(`Error: invalid positive integer: ${t}`)),process.exit(1)),e}function et(t){let e=Number.parseInt(t,10);return(!Number.isFinite(e)||e<0)&&(console.error(oe(`Error: invalid non-negative integer: ${t}`)),process.exit(1)),e}function SA(t){let e=Number.parseInt(t,10);return(!Number.isFinite(e)||![0,7,15,30,45,60].includes(e))&&(console.error(oe(`Error: terms must be one of 0, 7, 15, 30, 45, 60 (got: ${t})`)),process.exit(1)),e}function ar(t){return/^-?\d+(\.\d{1,2})?$/.test(t)||(console.error(oe(`Error: invalid amount: ${t} (max 2 decimal places)`)),process.exit(1)),Math.round(Number(t)*100)/100}function wd(t){let e=Number(t);return(!Number.isFinite(e)||e<=0)&&(console.error(oe(`Error: invalid exchange rate: ${t}`)),process.exit(1)),e}function Un(t){try{let e=JSON.parse(t);if(!Array.isArray(e))throw new Error("Line items must be a JSON array");return e}catch{console.error(oe("Error: --lines must be valid JSON array")),console.error(G(`Example: --lines '[{"name":"Service","quantity":1,"unitPrice":100,"accountResourceId":"..."}]'`)),console.error(G("Tip: pipe the full request body via stdin, or use --input <file>")),process.exit(1)}}function dc(t){try{let e=JSON.parse(t);if(!Array.isArray(e))throw new Error("Entries must be a JSON array");return e}catch{console.error(oe("Error: --entries must be valid JSON array")),console.error(G(`Example: --entries '[{"accountResourceId":"...","amount":100,"type":"DEBIT"},...]'`)),console.error(G("Tip: pipe the full request body via stdin, or use --input <file>")),process.exit(1)}}function an(t){try{let e=JSON.parse(t);if(!Array.isArray(e))throw new Error("Must be a JSON array");return e}catch{console.error(oe("Error: --custom-fields must be valid JSON array")),console.error(G(`Example: --custom-fields '[{"customFieldName":"PO Number","actualValue":"PO-123"}]'`)),process.exit(1)}}function x7(t,e=[]){return e.push(t),e}function T7(t){return t.map(e=>{let r=e.indexOf("=");r===-1&&(console.error(oe(`Error: --template-override must be "slotKey=template" (got "${e}")`)),console.error(G("Example: --template-override capsule.title='Loan {{loanReference}}'")),process.exit(1));let n=e.slice(0,r).trim(),i=e.slice(r+1);return n||(console.error(oe("Error: --template-override slotKey must be non-empty (slotKey=template)")),process.exit(1)),{slotKey:n,template:i}})}function k7(t,e="--inputs"){try{let r=JSON.parse(t);if(typeof r!="object"||r===null||Array.isArray(r))throw new Error("not an object");return r}catch{return console.error(oe(`Error: ${e} must be a valid JSON object`)),process.exit(1),{}}}function ve(t){if(t.input){let e;try{e=i1e(t.input,"utf-8")}catch{console.error(oe(`Error: cannot read file: ${t.input}`)),process.exit(1)}try{let r=JSON.parse(e);return(typeof r!="object"||r===null||Array.isArray(r))&&(console.error(oe("Error: --input file must contain a JSON object")),process.exit(1)),r}catch{console.error(oe("Error: --input file contains invalid JSON")),process.exit(1)}}if(!process.stdin.isTTY)try{let e=i1e(0,"utf-8").trim();if(e){let r=JSON.parse(e);return(typeof r!="object"||r===null||Array.isArray(r))&&(console.error(oe("Error: stdin must contain a JSON object")),process.exit(1)),r}}catch(e){e.message?.includes("JSON")&&(console.error(oe("Error: stdin contains invalid JSON")),process.exit(1))}return null}function Qe(t,e){let r=e.filter(n=>t[n.key]===void 0);if(r.length>0){let n=r.map(i=>i.flag).join(", ");console.error(oe(`Error: missing required option(s): ${n}`)),console.error(G("Provide flags, or pipe JSON via stdin, or use --input <file>")),process.exit(1)}}function Co(t){if(t!==void 0)return t.split(",").map(e=>e.trim()).filter(Boolean)}function pu(t,e){let r;try{r=JSON.parse(t)}catch{throw new Error(`Invalid JSON for ${e}: ${t.slice(0,80)}`)}if(!Array.isArray(r))throw new Error(`${e} must be a JSON array (got ${typeof r}).`);return r}function N7(){let t=new Date,e=t.getFullYear(),r=String(t.getMonth()+1).padStart(2,"0"),n=String(t.getDate()).padStart(2,"0");return`${e}-${r}-${n}`}var Tt=K(()=>{"use strict";Fe()});function M1e(t){return L1e[t]??L1e.jaz}var L1e,P1e=K(()=>{"use strict";L1e={jaz:{displayName:"Jaz",supportEmail:"support@jaz.ai",domain:"jaz.ai",agentInboxDomain:"jaz.email",dashboardUrl:"https://app.jaz.ai"},juan:{displayName:"Juan",supportEmail:"help@juan.ac",domain:"juan.ac",agentInboxDomain:"sendjuan.com",dashboardUrl:"https://app.juan.ac"}}});import{readFileSync as D$t}from"node:fs";import{dirname as S$t,join as R$t}from"node:path";import{fileURLToPath as B$t}from"node:url";function j1e(t,e,{dashboardUrl:r,orgResourceId:n}){let i=q1e(),o=i.screenByKey.get(t);if(o){if(e)throw new Error(`Destination '${t}' is a screen, not a record view \u2014 omit resourceId. To open a specific record, use a "<resource>.modal.view-*" destination instead.`);return{url:U1e(`${r}${o.path}`,n),kind:"screen",label:o.label}}let s=i.modalByKey.get(t);if(s){if(s.requiresId&&!e)throw new Error(`Destination '${t}' opens a specific record \u2014 pass the record's resourceId. For a create/blank modal, use a "new-*"/"create-*" destination instead.`);let u=s.requiresId?s.urlTemplate.replace(x$t,encodeURIComponent(e)):s.urlTemplate;return{url:U1e(`${r}${s.mountPath}${u}`,n),kind:"modal",label:s.label}}let a=k$t(i,t),c=a.length?` Did you mean: ${a.join(", ")}?`:"";throw new Error(`Unknown dashboard destination '${t}'.${c} Call find_dashboard_destinations to find a valid key.`)}function Y1e({query:t,resource:e,kind:r}){let{manifest:n}=q1e(),i=t?.trim().toLowerCase(),o=[...r==="modal"?[]:n.screens.filter(c=>!e||O$t(c.path)===e).map(c=>({key:c.key,label:c.label,kind:"screen"})),...r==="screen"?[]:n.modals.filter(c=>!e||c.resource===e).map(c=>({key:c.key,label:c.label,kind:"modal"}))],s=i?F$t(i):[],a=i?o.filter(c=>s.some(u=>c.key.toLowerCase().includes(u)||c.label.toLowerCase().includes(u))):o;return{results:a.slice(0,$1e),total:a.length,truncated:a.length>$1e}}var x$t,T$t,V7,q1e,k$t,U1e,$1e,N$t,F$t,O$t,H1e=K(()=>{"use strict";x$t="{id}",T$t=S$t(B$t(import.meta.url)),V7=null,q1e=()=>{if(!V7){let t=JSON.parse(D$t(R$t(T$t,"dashboard-routes-manifest.json"),"utf8"));V7={manifest:t,screenByKey:new Map(t.screens.map(e=>[e.key,e])),modalByKey:new Map(t.modals.map(e=>[e.key,e]))}}return V7},k$t=(t,e,r=5)=>{let n=e.toLowerCase(),i=[],o=[...t.screenByKey.keys(),...t.modalByKey.keys()];for(let s of o)if(s.toLowerCase().includes(n)&&(i.push(s),i.length>=r))break;return i},U1e=(t,e)=>e?`${t}${t.includes("?")?"&":"?"}org=${encodeURIComponent(e)}`:t;$1e=60,N$t=[["credit note","credit"],["invoice","sale"],["bill","purchase"]],F$t=t=>{let e=[t];for(let[r,n]of N$t)t.includes(r)&&e.push(t.split(r).join(n));return e},O$t=t=>t.split("/")[1]??""});var Vb,RA,BA,z1e,EM,_d,mD=K(()=>{"use strict";Vb=["ORGANIZATION","USER_MANAGEMENT","BILLING","ACCOUNTING","SALES","PURCHASES","REPORTS","FIXED_ASSET"],RA=["ADMIN","PREPARER","MEMBER","NO_ACCESS"],BA=["ADMIN","CUSTOM_USER"],z1e=["trial-balance","balance-sheet","profit-and-loss","general-ledger","cashflow","cash-balance","ar-report","ap-report","sales-summary","sales-payments-summary","purchase-summary","purchase-payments-summary","customer-revenue-summary","product-sales-summary","periodic-revenue-summary","supplier-expense-summary","product-purchase-summary","periodic-expense-summary","credit-note-summary","sales-cost-margin","sale-inventory-movement","purchase-inventory-movement","analysis-anomalous-invoices","analysis-anomalous-bills","analysis-cashflow-anomalies","analysis-gl-journal-audit","analysis-receivables-customer-risk","analysis-cash-expense-health","analysis-exchange-rate-audit","statement-of-account-export","tax-ledger","equity-movement","bank-closing-balance","bank-reconciliation-summary","bank-reconciliation-details","fixed-assets-register","fixed-assets-reconciliation-summary","journal-summary"],EM=["MAGIC_MATCH","MAGIC_RECONCILE_WITH_CASH_TRANSFER","MAGIC_RECONCILE_WITH_BANK_RULE","MAGIC_QUICK_RECONCILE","MAGIC_RECONCILE_WITH_CASH_IN_OUT"],_d=["INVOICE","BILL","CUSTOMER_CREDIT_NOTE","SUPPLIER_CREDIT_NOTE","SALE_PAYMENT","PURCHASE_PAYMENT","BATCH_PAYMENT","CONTACT","ITEM","CAPSULE","SCHEDULED_TRANSACTION","JOURNAL","BANK_RECORD","CASHFLOW_TRANSACTION","FIXED_ASSET","CHART_OF_ACCOUNT","TAX_PROFILE"]});var G1e,V1e,J1e,W1e,Z1e,bM,X1e,K1e,eQe,CM,tQe,J7,AD,rQe,nQe,iQe,oQe,sQe,aQe,cQe,lQe,uQe,dQe,fQe,pQe,hQe,mQe,AQe,Vs=K(()=>{"use strict";G1e=["DRAFT","UNPAID","PARTIALLY_PAID","PAID","VOID"],V1e=["DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED","VOID"],J1e=["DRAFT","ACTIVE","VOID"],W1e=["JOURNAL_MANUAL","JOURNAL_DIRECT_CASH_IN","JOURNAL_DIRECT_CASH_OUT","JOURNAL_CASHFLOW","JOURNAL_CASH_TRANSFER","JOURNAL_TRANSFER_BALANCE","JOURNAL_CASHFLOW_BANK_RECON","JOURNAL_CASHFLOW_ADJUSTMENT"],Z1e=["CASH_TRANSFER","DIRECT_CASH_IN","DIRECT_CASH_OUT"],bM=["ACTIVE","INACTIVE"],X1e=["ACTIVE","INACTIVE"],K1e=["ACTIVE","INACTIVE"],eQe=["INVENTORY","NON_INVENTORY"],CM=["PENDING","APPROVED"],tQe=["RECONCILED","UNRECONCILED","ARCHIVED","POSSIBLE_DUPLICATE"],J7=["PAYIN","PAYOUT"],AD=["SALE","PURCHASE","SALE_CREDIT_NOTE","PURCHASE_CREDIT_NOTE","JOURNAL_MANUAL","JOURNAL_DIRECT_CASH_IN","JOURNAL_DIRECT_CASH_OUT","JOURNAL_CASHFLOW","JOURNAL_CASH_TRANSFER","JOURNAL_CASHFLOW_BANK_RECON","JOURNAL_CASHFLOW_ADJUSTMENT","PAYMENT_SALE","PAYMENT_PURCHASE","PAYMENT_SALE_CREDIT_NOTE","PAYMENT_PURCHASE_CREDIT_NOTE","BATCH_SALE","BATCH_PURCHASE","FIXED_ASSETS"],rQe=["ACTIVE","UNPAID","PARTIALLY_PAID","PAID","VOID","DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED"],nQe=["ACTIVE","DRAFT","DISPOSED","SOLD","DISCARDED","COMPLETED","ONGOING"],iQe=["TANGIBLE","INTANGIBLE"],oQe=["ACTIVE","INACTIVE"],sQe=["ACTIVE","CANCELLED","INACTIVE"],aQe=["ONE_TIME","DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"],cQe=["DRAFT","CREATED","ACCEPTED","CONFIRMED","VOID"],lQe=["DRAFT","ACTIVE","ACCEPTED","CONFIRMED","VOID"],uQe=["Asset","Liability","Equity","Revenue","Expense"],dQe=["Bank Accounts","Cash and Cash Equivalents","Current Assets","Non-Current Assets","Current Liabilities","Non-Current Liabilities","Equity","Revenue","Cost of Goods Sold","Operating Expenses","Other Income","Other Expenses"],fQe=["TEXT","NUMBER","BOOLEAN","DATE","LINK"],pQe=["ADMIN","CUSTOM_USER"],hQe=["ACTIVE","INACTIVE"],mQe=["QUEUED","DISPATCHING","PROCESSING","SUCCESS","FAILED","PARTIAL_SUCCESS"],AQe=["CASH","CREDIT_CARD","BANK_TRANSFER","E_WALLET","CHEQUE","WITHHOLDING_TAX_CERTIFICATE","CLEARING_SETTLEMENT","DEBT_WRITE_OFF","INTER_COMPANY","OTHER","PAYMENT_GATEWAY"]});function up(t,e,r){let n=e.split("."),i=t;for(let s=0;s<n.length-1;s++)(!i[n[s]]||typeof i[n[s]]!="object")&&(i[n[s]]={}),i=i[n[s]];let o=n[n.length-1];i[o]&&typeof i[o]=="object"?Object.assign(i[o],r):i[o]=r}function Q$t(t){return t.split(",").map(e=>e.trim()).filter(Boolean)}function gD(t,e,r){let n={};for(let[o,s]of Object.entries(e)){let a=t[o];if(!(a==null||a===""))switch(s.op){case"contains":up(n,s.path,{contains:String(a)});break;case"eq":up(n,s.path,{eq:a});break;case"gte":{let c=s.type==="number"?yQe(a):a;c!==void 0&&up(n,s.path,{gte:c});break}case"lte":{let c=s.type==="number"?yQe(a):a;c!==void 0&&up(n,s.path,{lte:c});break}case"boolean":up(n,s.path,{eq:!!a});break;case"multi":{let c=Q$t(String(a));c.length>1?up(n,s.path,{in:c}):c.length===1&&up(n,s.path,{eq:c[0]});break}case"array":up(n,s.path,a);break}}let i=Object.keys(n).length>0?n:void 0;if(!(!r&&!i))return r?i?L$t(r,i):r:i}function L$t(t,e){let r={...t};for(let[n,i]of Object.entries(e)){let o=r[n];gQe(o)&&gQe(i)?r[n]={...o,...i}:r[n]=i}return r}function gQe(t){return!t||typeof t!="object"||Array.isArray(t)?!1:Object.values(t).some(e=>e!==null&&typeof e=="object"&&!Array.isArray(e))}function yQe(t){let e=typeof t=="number"?t:Number(t);return Number.isFinite(e)?e:void 0}var vM=K(()=>{"use strict"});async function yD(t,e,r,n){return t(r??0,e??n)}var W7=K(()=>{"use strict"});function EQe(t,e=!1){let r={};for(let[n,i]of Object.entries(t)){let o={type:i.type,description:i.description};i.enum&&(o.enum=[...i.enum]),i.type==="array"&&i.items&&(o.items=i.items),r[n]=o}return e&&(r.query=j$t),r.filter=M$t,r.sortBy=P$t,r.sortOrder=U$t,r.limit=$$t,r.offset=q$t,r}function Z7(t){let e=[];for(let[r,n]of Object.entries(t)){let i=n.cliFlag??Y$t(r,n.type),o=n.cliFlag&&n.type!=="boolean"&&!i.includes("<")?`${i} <${i.replace(/^--/,"").split("-").pop()}>`:i;e.push([o,n.description,n.enum,r])}return e}function Y$t(t,e){let r=t.replace(/([A-Z])/g,"-$1").toLowerCase();return e==="boolean"?`--${r}`:`--${r} <${r.split("-").pop()}>`}function Vt(t){let e=EQe(t.fields,t.defaults.supportsQuery);t.pathParam&&(e[t.pathParam]={type:"string",description:t.pathParamDescription??`${t.pathParam} (required)`}),t.extraParams&&Object.assign(e,t.extraParams),e.view={type:"string",enum:["lean","full"],description:"Payload tier: 'lean' (default) = summary row (id + key scalars); 'full' = whole entity per row (heavier). Search lean, then drill in with get_*."};let r=[...t.pathParam?[t.pathParam]:[],...t.extraRequired??[]];return{name:t.name,description:t.description,params:e,required:r,group:t.group,readOnly:!0,isConcurrencySafe:!0,maxResultSizeChars:5e4,...t.searchHint?{searchHint:t.searchHint}:{},execute:async(n,i)=>{let o=i.limit,s=i.offset,a=i.sortBy??t.defaults.sortBy,c=i.sortOrder??t.defaults.sortOrder,u=i.query,d=i.view==="full"?"full":"lean",f=i.filter,p=t.baseFilter?f?{...t.baseFilter,...f}:t.baseFilter:f,h=gD(i,t.fields,p),m={sortBy:[a],order:c},A=t.pathParam?(y,C)=>t.fetcher(n.client,i[t.pathParam],{filter:h,sort:m,limit:C,offset:y,query:u,view:d}):(y,C)=>t.fetcher(n.client,{filter:h,sort:m,limit:C,offset:y,query:u,view:d}),g=d==="lean"&&t.defaults.leanDefaultLimit?t.defaults.leanDefaultLimit:t.defaults.defaultLimit;return yD(A,o,s,g)}}}var M$t,P$t,U$t,$$t,q$t,j$t,X7=K(()=>{"use strict";W7();vM();M$t={type:"object",description:"Raw API filter JSON. Merged with named params (named win). Operators: eq, neq, contains, in, gt, gte, lt, lte, between, isNull, reg. Nested paths supported (e.g. contact.name)."},P$t={type:"string",description:"Sort field (default varies by entity)"},U$t={type:"string",description:"Sort direction",enum:["ASC","DESC"]},$$t={type:"number",description:"Max per page (\u22641000)"},q$t={type:"number",description:"Page (0-indexed). Requires sort."},j$t={type:"string",description:'Jaz search expression. Merged with named params (named win). Examples: "status:unpaid AND $500+", "customer:acme AND date:-30d". Supports amounts ($500+, $100-500), dates (date:this month, due:overdue), enums, string fields (customer:, supplier:, ref:, tag:), boolean (hasattachment:yes), AND/OR/NOT, inline sort (sort:amount:desc).'}});async function H$t(){if(!K7){let[t,e,r,n]=await Promise.all([Promise.resolve().then(()=>(Et(),JOe)),Promise.resolve().then(()=>(Er(),LOe)),Promise.resolve().then(()=>(Ut(),$Oe)),Promise.resolve().then(()=>(Tt(),o1e))]);K7=t.apiAction,bQe=e.paginatedFetch,CQe=r.outputList,eZ=n.parsePositiveInt,vQe=n.parseNonNegativeInt}}function Ge(t){let e=t.commandName??"search",r=t.positionalArg?` <${t.positionalArg}>`:"",n=t.parent.command(`${e}${r}`).description(`Search ${t.label.replace("Searching ","")}`),i=new Map,o=Z7(t.fields);for(let[a,c,u,d]of o){let f=new Vn(a,c),p=t.fields[d];u&&p?.op!=="multi"&&f.choices(u),n.addOption(f);let h=z$t(a);h!==d&&i.set(h,d)}if(t.defaults.supportsQuery&&n.option("--query <expression>",'Jaz search expression (e.g. "status:unpaid AND $500+", "customer:acme AND date:-30d"). Merged with --filter; --filter fields win on conflict.'),n.option("--filter <json>","Raw API filter JSON (merged with flags; flags win on conflict)").addOption(new Vn("--sort <field>","Sort field name")).addOption(new Vn("--order <direction>","Sort direction").choices(["ASC","DESC"])).option("--limit <n>",`Max results (default ${t.defaults.defaultLimit})`).option("--offset <n>","Page number offset (0-indexed)").option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)").option("--format <type>","Output format: table, json, csv, yaml").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON"),t.leanView&&n.addOption(new Vn("--view <tier>","Payload tier: 'lean' = summary rows; 'full' (default) = complete records").choices(["lean","full"])),t.pathParam&&t.pathParam!==t.positionalArg){let a=t.pathParam.replace(/([A-Z])/g,"-$1").toLowerCase();n.requiredOption(`--${a} <id>`,t.pathParamDescription??`${t.pathParam} (required)`)}let s=async(...a)=>{let c=t.positionalArg?a[0]:void 0,u=t.positionalArg?a[1]:a[0];c&&t.positionalArg&&(u[t.positionalArg]=c),await H$t(),await K7(async d=>{t.preProcess&&await t.preProcess(d,u),typeof u.limit=="string"&&(u.limit=eZ(u.limit)),typeof u.offset=="string"&&(u.offset=vQe(u.offset)),typeof u.maxRows=="string"&&(u.maxRows=eZ(u.maxRows));let f={...u};for(let[I,k]of i)f[I]!==void 0&&(f[k]=f[I]);let p;if(typeof u.filter=="string")try{p=JSON.parse(u.filter)}catch{throw new Error(`Invalid --filter JSON: ${u.filter}`)}let h=t.baseFilter?p?{...t.baseFilter,...p}:t.baseFilter:p,m=gD(f,t.fields,h),A;if(c&&t.positionalFilter){let I=t.positionalFilter(c);A=m?{...I,...m}:I}else A=m;let g={sortBy:[u.sort??t.defaults.sortBy],order:u.order??t.defaults.sortOrder},y=t.defaults.supportsQuery?u.query:void 0,C=t.leanView?u.view:void 0,E=t.pathParam?({limit:I,offset:k})=>t.fetcher(d,u[t.pathParam],{filter:A,sort:g,limit:I,offset:k,query:y,view:C}):({limit:I,offset:k})=>t.fetcher(d,{filter:A,sort:g,limit:I,offset:k,query:y,view:C}),v=await bQe(u,E,{label:t.label,defaultLimit:t.defaults.defaultLimit});CQe(v,t.columns,u,t.label.replace("Searching ",""))})(u)};return n.action(s),n}function z$t(t){return t.replace(/^--/,"").split(/[\s<]/)[0].replace(/-([a-z])/g,(r,n)=>n.toUpperCase())}var K7,bQe,CQe,eZ,vQe,IQe=K(()=>{"use strict";Ga();X7();vM()});var Jb,Wb,ED,bD,wQe=K(()=>{"use strict";Vs();Jb={reference:{path:"reference",op:"contains",type:"string",description:"Invoice reference number"},status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:G1e},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact/customer name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (e.g., SGD, USD)"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Approval status",enum:CM},startDate:{path:"valueDate",op:"gte",type:"string",description:"On/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On/before (YYYY-MM-DD)",cliFlag:"--to <date>"},dueDateFrom:{path:"dueDate",op:"gte",type:"string",description:"Due date from (YYYY-MM-DD)"},dueDateTo:{path:"dueDate",op:"lte",type:"string",description:"Due date to (YYYY-MM-DD)"},minAmount:{path:"totalAmount",op:"gte",type:"number",description:"Minimum total amount"},maxAmount:{path:"totalAmount",op:"lte",type:"number",description:"Maximum total amount"}},Wb={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0},ED=Jb,bD=Wb});var _Qe,CD,vD,Zb,ID,dp,fp,DQe=K(()=>{"use strict";Vs();_Qe={reference:{path:"reference",op:"contains",type:"string",description:"Order reference number"},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact (customer/supplier) name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (e.g., SGD, USD)"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On/before (YYYY-MM-DD)",cliFlag:"--to <date>"},dueDateFrom:{path:"dueDate",op:"gte",type:"string",description:"Due date from (YYYY-MM-DD)"},dueDateTo:{path:"dueDate",op:"lte",type:"string",description:"Due date to (YYYY-MM-DD)"},minAmount:{path:"totalAmount",op:"gte",type:"number",description:"Minimum total amount"},maxAmount:{path:"totalAmount",op:"lte",type:"number",description:"Maximum total amount"}},CD={status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:cQe},..._Qe},vD={status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:lQe},..._Qe},Zb={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0},ID=Zb,dp={name:{path:"name",op:"contains",type:"string",description:"Line item text/description"},reference:{path:"reference",op:"contains",type:"string",description:"Parent order reference"},orderId:{path:"btResourceId",op:"eq",type:"string",description:"Parent order resourceId"},contactName:{path:"contactName",op:"contains",type:"string",description:"Contact (customer/supplier) name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (e.g., SGD, USD)"},status:{path:"status",op:"eq",type:"string",description:"Line item status"},account:{path:"organizationAccountName",op:"contains",type:"string",description:"Chart-of-account name on the line"},taxProfile:{path:"taxProfileName",op:"contains",type:"string",description:"Tax profile name on the line"},isOpen:{path:"isOpen",op:"boolean",type:"boolean",description:"Only open (unfulfilled) lines"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On/before (YYYY-MM-DD)",cliFlag:"--to <date>"},minAmount:{path:"totalItemAmount",op:"gte",type:"number",description:"Minimum line amount"},maxAmount:{path:"totalItemAmount",op:"lte",type:"number",description:"Maximum line amount"}},fp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0}});var pp,Xb,wD,SQe=K(()=>{"use strict";Vs();pp={reference:{path:"reference",op:"contains",type:"string",description:"Credit note reference"},status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:V1e},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Approval status",enum:CM},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"}},Xb={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0},wD=Xb});var _D,DD,RQe=K(()=>{"use strict";Vs();_D={reference:{path:"reference",op:"contains",type:"string",description:"Journal reference"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:J1e},type:{path:"type",op:"multi",type:"string",description:"Journal type",enum:W1e},templateType:{path:"templateType",op:"multi",type:"string",description:"Template type",enum:Z1e},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact name"},internalNotes:{path:"internalNotes",op:"contains",type:"string",description:"Search internal notes"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"}},DD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0}});var SD,RD,BQe=K(()=>{"use strict";Vs();SD={name:{path:"name",op:"contains",type:"string",description:"Contact name"},email:{path:"email",op:"contains",type:"string",description:"Email address"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:bM},isCustomer:{path:"customer",op:"boolean",type:"boolean",description:"Filter to customers only",cliFlag:"--customer"},isSupplier:{path:"supplier",op:"boolean",type:"boolean",description:"Filter to suppliers only",cliFlag:"--supplier"},taxId:{path:"taxId",op:"contains",type:"string",description:"Tax ID"}},RD={sortBy:"name",sortOrder:"ASC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0}});var Dd,Sd,BD,xD,xQe=K(()=>{"use strict";Vs();Dd={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Transaction type",enum:AD},direction:{path:"direction",op:"eq",type:"string",description:"Direction (PAYIN or PAYOUT)",enum:J7},status:{path:"businessTransactionStatus",op:"multi",type:"string",description:"Status",enum:rQe},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Bank account resourceId",cliFlag:"--account <id>"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"},businessTransactionType:{path:"businessTransactionType",op:"multi",type:"string",description:"(alias for type)",enum:AD}},Sd={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},BD={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Transaction type (SALE, PURCHASE, etc.)",enum:AD},direction:{path:"direction",op:"eq",type:"string",description:"Direction",enum:J7},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Account resourceId",cliFlag:"--account <id>"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"},businessTransactionType:{path:"businessTransactionType",op:"multi",type:"string",description:"(alias for type)",enum:AD},fromDate:{path:"valueDate",op:"gte",type:"string",description:"(alias for startDate)"},toDate:{path:"valueDate",op:"lte",type:"string",description:"(alias for endDate)"},accountResourceId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"(alias for accountId)"}},xD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20}});var TD,kD,TQe=K(()=>{"use strict";Vs();TD={status:{path:"status",op:"multi",type:"string",description:"Status",enum:tQe},description:{path:"description",op:"contains",type:"string",description:"Description"},payer:{path:"extContactName",op:"contains",type:"string",description:"Payer/payee name"},reference:{path:"extReference",op:"contains",type:"string",description:"Bank reference",cliFlag:"--ref <reference>"},startDate:{path:"valueDate",op:"gte",type:"string",description:"On or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"On or before this date (YYYY-MM-DD)",cliFlag:"--to <date>"},minAmount:{path:"netAmount",op:"gte",type:"number",description:"Minimum net amount"},maxAmount:{path:"netAmount",op:"lte",type:"number",description:"Maximum net amount"}},kD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0}});var ND,FD,kQe=K(()=>{"use strict";Vs();ND={status:{path:"status",op:"multi",type:"string",description:"Status",enum:X1e},itemCategory:{path:"itemCategory",op:"eq",type:"string",description:"Category",enum:eQe},appliesToSale:{path:"appliesToSale",op:"boolean",type:"boolean",description:"Filter to sale items only",cliFlag:"--sale"},appliesToPurchase:{path:"appliesToPurchase",op:"boolean",type:"boolean",description:"Filter to purchase items only",cliFlag:"--purchase"}},FD={sortBy:"internalName",sortOrder:"ASC",defaultLimit:20,leanDefaultLimit:50,supportsQuery:!0}});var OD,QD,NQe=K(()=>{"use strict";Vs();OD={name:{path:"name",op:"contains",type:"string",description:"Asset name"},reference:{path:"reference",op:"contains",type:"string",description:"Reference",cliFlag:"--ref <reference>"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:nQe},category:{path:"category",op:"eq",type:"string",description:"Category",enum:iQe},tag:{path:"tags.name",op:"eq",type:"string",description:"Tag name",cliFlag:"--tag <name>"},typeName:{path:"typeName",op:"contains",type:"string",description:"Asset type name"},startDate:{path:"purchaseDate",op:"gte",type:"string",description:"Purchase date from (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"purchaseDate",op:"lte",type:"string",description:"Purchase date to (YYYY-MM-DD)",cliFlag:"--to <date>"},minAmount:{path:"purchaseAmount",op:"gte",type:"number",description:"Minimum purchase amount"},maxAmount:{path:"purchaseAmount",op:"lte",type:"number",description:"Maximum purchase amount"}},QD={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});var LD,MD,FQe=K(()=>{"use strict";Vs();LD={type:{path:"businessTransactionType",op:"eq",type:"string",description:"Transaction type (SALE, PURCHASE, JOURNAL_MANUAL)"},status:{path:"status",op:"multi",type:"string",description:"Scheduler status",enum:oQe},subscriptionStatus:{path:"subscriptionStatus",op:"multi",type:"string",description:"Subscription status",enum:sQe},schedulerType:{path:"schedulerType",op:"eq",type:"string",description:"Scheduler type"},interval:{path:"interval",op:"eq",type:"string",description:"Interval",enum:aQe},contactName:{path:"contact.name",op:"contains",type:"string",description:"Contact name"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code"}},MD={sortBy:"nextScheduleDate",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});var PD,UD,OQe=K(()=>{"use strict";Vs();PD={id:{path:"resourceId",op:"eq",type:"string",description:"Job ID (the jobId returned from bulk operations)",cliFlag:"--id"},status:{path:"status",op:"multi",type:"string",description:"Job status",enum:mQe},type:{path:"jobType",op:"eq",type:"string",description:"Job type (e.g. UPSERT_CONTACTS, UPSERT_ITEMS, PROCESS_BANK_STATEMENT_FILES)",cliFlag:"--type"},fileName:{path:"fileName",op:"contains",type:"string",description:"File name (file-based jobs only)",cliFlag:"--file-name"},from:{path:"createdAt",op:"gte",type:"string",description:"On/after (ISO date)",cliFlag:"--from"},to:{path:"createdAt",op:"lte",type:"string",description:"On/before (ISO date)",cliFlag:"--to"}},UD={sortBy:"createdAt",sortOrder:"DESC",defaultLimit:20}});var tZ,rZ,QQe=K(()=>{"use strict";tZ={name:{path:"name",op:"contains",type:"string",description:"Purchase item name"},reference:{path:"reference",op:"contains",type:"string",description:"Reference name"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (ISO 4217)"}},rZ={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});var $D,qD,nZ,iZ,LQe=K(()=>{"use strict";$D={catalogName:{path:"catalogName",op:"contains",type:"string",description:"Catalog name"},description:{path:"description",op:"contains",type:"string",description:"Catalog item description"},status:{path:"status",op:"multi",type:"string",description:"Record status (e.g. ACTIVE, INACTIVE)"},contactGroupResourceId:{path:"contactGroupResourceId",op:"eq",type:"string",description:"Contact group resourceId"}},qD={sortBy:"catalogName",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0},nZ={reportType:{path:"reportType",op:"eq",type:"string",description:"Report type"},reportCategory:{path:"reportCategory",op:"eq",type:"string",description:"Report category"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Only default templates",cliFlag:"--default"}},iZ={sortBy:"reportType",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0}});async function IM(t,e){return t.search("/api/v1/claims/search",e)}async function wM(t,e){return t.get(`/api/v1/claims/${e}`)}async function _M(t,e){return t.post("/api/v1/claims",e)}async function DM(t,e,r){return t.put(`/api/v1/claims/${e}`,r)}async function SM(t,e){return t.delete(`/api/v1/claims/${e}`)}async function RM(t,e,r){return t.delete(`/api/v1/claims/${e}/attachments/${r}`)}async function BM(t,e){return t.post(`/api/v1/claims/${e}/submit`,{})}async function xM(t,e){return t.post(`/api/v1/claims/${e}/approve`,{})}async function TM(t,e,r){return t.post(`/api/v1/claims/${e}/reject`,{rejectionReason:r})}async function kM(t,e,r){return t.post(`/api/v1/claims/${e}/cancel`,{cancellationReason:r})}async function NM(t,e){return t.post(`/api/v1/claims/${e}/unpost`,{})}function jD(t){Kn(t,"resourceIds",500,"claims")}async function FM(t,e){return jD(e),t.post("/api/v1/claims/bulk/submit",{resourceIds:e})}async function OM(t,e){return jD(e),t.post("/api/v1/claims/bulk/approve",{resourceIds:e})}async function QM(t,e){return jD(e),t.post("/api/v1/claims/bulk/delete",{resourceIds:e})}async function LM(t,e,r){return jD(e),t.post("/api/v1/claims/bulk/reject",{resourceIds:e,rejectionReason:r})}async function MM(t,e,r){return jD(e),t.post("/api/v1/claims/bulk/cancel",{resourceIds:e,cancellationReason:r})}async function PM(t){let e=await t.get("/api/v1/claims/tracking-tags");return Array.isArray(e)?e:e?.data??[]}async function UM(t){let e=await t.get("/api/v1/claims/custom-field-values");return Array.isArray(e)?e:e?.data??[]}var MQe,$M=K(()=>{"use strict";Ra();MQe=["DRAFT","SUBMITTED","APPROVED","CONVERTED","REJECTED","CANCELLED"]});var YD,HD,G$t,V$t,zD,GD,VD,JD,WD,ZD,XD,KD,PQe=K(()=>{"use strict";nD();sD();$M();YD={status:{path:"status",op:"multi",type:"string",description:"Status (comma-separated for OR)",enum:MQe},employeeResourceId:{path:"employeeResourceId",op:"eq",type:"string",description:"Employee resourceId"},contactResourceId:{path:"contactResourceId",op:"eq",type:"string",description:"Vendor contact resourceId"},claimProfileResourceId:{path:"claimProfileResourceId",op:"eq",type:"string",description:"Claim profile resourceId"},approverUserResourceId:{path:"approverUserResourceId",op:"eq",type:"string",description:"Approver user resourceId"},reference:{path:"reference",op:"contains",type:"string",description:"Claim reference"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Currency code (ISO 4217)"},startDate:{path:"valueDate",op:"gte",type:"string",description:"Value date on/after (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"Value date on/before (YYYY-MM-DD)",cliFlag:"--to <date>"},createdFrom:{path:"createdAt",op:"gte",type:"string",description:"Created on/after (YYYY-MM-DD)"},createdTo:{path:"createdAt",op:"lte",type:"string",description:"Created on/before (YYYY-MM-DD)"},minAmount:{path:"totalAmount",op:"gte",type:"number",description:"Minimum total amount"},maxAmount:{path:"totalAmount",op:"lte",type:"number",description:"Maximum total amount"}},HD={sortBy:"createdAt",sortOrder:"DESC",defaultLimit:20,leanDefaultLimit:50},G$t=["RECORDED","COMPLETED","CANCELLED","IN_PROGRESS","ACTION_NEEDED"],V$t=["DIRECT_ENTRY","REIMBURSEMENT_PAYOUT","ADVANCE"],zD={employeeResourceId:{path:"employeeResourceId",op:"eq",type:"string",description:"Employee resourceId"},employeeName:{path:"employeeName",op:"contains",type:"string",description:"Employee name"},reference:{path:"reference",op:"contains",type:"string",description:"Payout reference"},payoutStatus:{path:"payoutStatus",op:"multi",type:"string",description:"Payout status (comma-separated)",enum:G$t},payoutType:{path:"payoutType",op:"multi",type:"string",description:"Payout type (comma-separated)",enum:V$t}},GD={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20},VD={name:{path:"name",op:"contains",type:"string",description:"Claim type name"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Org default claim type"},expenseAccountResourceId:{path:"expenseAccountResourceId",op:"eq",type:"string",description:"Default expense account resourceId"},taxProfileResourceId:{path:"taxProfileResourceId",op:"eq",type:"string",description:"Default tax profile resourceId"}},JD={sortBy:"name",sortOrder:"ASC",defaultLimit:100},WD={name:{path:"name",op:"contains",type:"string",description:"Claim profile name"},approverUserResourceId:{path:"approverUserResourceId",op:"eq",type:"string",description:"Default approver user resourceId"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Org default profile"},minClaimAmount:{path:"minClaimAmount",op:"gte",type:"number",description:"Minimum claim total (>=)"},maxClaimAmount:{path:"maxClaimAmount",op:"lte",type:"number",description:"Maximum claim total (<=)"},maxPerPeriodAmount:{path:"maxPerPeriodAmount",op:"lte",type:"number",description:"Per-period spend cap (<=)"},perPeriod:{path:"perPeriod",op:"eq",type:"string",description:"Per-period window",enum:tD},employeeBalanceAccountResourceId:{path:"employeeBalanceAccountResourceId",op:"eq",type:"string",description:"Employee balance (liability) account resourceId"}},ZD={sortBy:"name",sortOrder:"ASC",defaultLimit:100},XD={name:{path:"name",op:"contains",type:"string",description:"Posting rule name"},outerAxis:{path:"outerAxis",op:"eq",type:"string",description:"Outer grouping axis",enum:iD},innerAxis:{path:"innerAxis",op:"eq",type:"string",description:"Inner line-aggregation axis",enum:oD},defaultBankAccountResourceId:{path:"defaultBankAccountResourceId",op:"eq",type:"string",description:"Default reimbursement bank account resourceId"},defaultIncludeReimbursementPayout:{path:"defaultIncludeReimbursementPayout",op:"boolean",type:"boolean",description:"Creates reimbursement DCE by default"},isDefault:{path:"isDefault",op:"boolean",type:"boolean",description:"Org default rule"}},KD={sortBy:"name",sortOrder:"ASC",defaultLimit:100}});var eS,tS,rS,nS,UQe=K(()=>{"use strict";aD();eS={name:{path:"name",op:"contains",type:"string",description:"Employee name"},email:{path:"email",op:"contains",type:"string",description:"Work email"},phone:{path:"phone",op:"contains",type:"string",description:"Phone"},userResourceId:{path:"userResourceId",op:"eq",type:"string",description:"Bound login user resourceId"},managerEmployeeResourceId:{path:"managerEmployeeResourceId",op:"eq",type:"string",description:"Manager employee resourceId"},claimProfileResourceId:{path:"claimProfileResourceId",op:"eq",type:"string",description:"Claim profile resourceId"},currency:{path:"currency",op:"eq",type:"string",description:"Balance currency (ISO 4217)"},active:{path:"active",op:"boolean",type:"boolean",description:"Active employees only"},createdFrom:{path:"createdAt",op:"gte",type:"string",description:"Created on/after (YYYY-MM-DD)"},createdTo:{path:"createdAt",op:"lte",type:"string",description:"Created on/before (YYYY-MM-DD)"}},tS={sortBy:"name",sortOrder:"ASC",defaultLimit:50},rS={name:{path:"name",op:"contains",type:"string",description:"Employee name"},email:{path:"email",op:"contains",type:"string",description:"Work email"},phone:{path:"phone",op:"contains",type:"string",description:"Phone"},currency:{path:"currency",op:"eq",type:"string",description:"Balance currency (ISO 4217)"},employmentType:{path:"employmentType",op:"eq",type:"string",description:"Employment type",enum:_A},active:{path:"active",op:"boolean",type:"boolean",description:"Active employees only"}},nS={sortBy:"name",sortOrder:"ASC",defaultLimit:50}});var iS,oS,sS,aS,cS,lS,uS,dS,fS,pS,hS,mS,AS,gS,yS,ES,bS,CS,$Qe=K(()=>{"use strict";Vs();iS={name:{path:"name",op:"contains",type:"string",description:"Account name"},code:{path:"code",op:"contains",type:"string",description:"Account code"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:K1e},accountClass:{path:"accountClass",op:"eq",type:"string",description:"Account class",enum:uQe},accountType:{path:"accountType",op:"eq",type:"string",description:"Account type",enum:dQe},controlFlag:{path:"controlFlag",op:"boolean",type:"boolean",description:"Control flag (system accounts)"}},oS={sortBy:"code",sortOrder:"ASC",defaultLimit:100,supportsQuery:!1},sS={query:{path:"tagName",op:"contains",type:"string",description:"Tag name"}},aS={sortBy:"tagName",sortOrder:"ASC",defaultLimit:100},cS={name:{path:"name",op:"contains",type:"string",description:"Tax profile name",cliFlag:"--name <name>"},taxTypeCode:{path:"taxTypeCode",op:"contains",type:"string",description:"Tax type code"},appliesToSale:{path:"appliesToSale",op:"boolean",type:"boolean",description:"Filter to sale profiles"},appliesToPurchase:{path:"appliesToPurchase",op:"boolean",type:"boolean",description:"Filter to purchase profiles"},appliesToSaleCreditNote:{path:"appliesToSaleCreditNote",op:"boolean",type:"boolean",description:"Filter to sale CN profiles"},appliesToPurchaseCreditNote:{path:"appliesToPurchaseCreditNote",op:"boolean",type:"boolean",description:"Filter to purchase CN profiles"}},lS={sortBy:"name",sortOrder:"ASC",defaultLimit:100,supportsQuery:!0},uS={title:{path:"title",op:"contains",type:"string",description:"Capsule title"},status:{path:"status",op:"multi",type:"string",description:"Status",enum:hQe}},dS={sortBy:"title",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0},fS={query:{path:"customFieldName",op:"contains",type:"string",description:"Custom field name",cliFlag:"--name <name>"},datatypeCode:{path:"datatypeCode",op:"eq",type:"string",description:"Data type",enum:fQe,cliFlag:"--type <type>"},customFieldName:{path:"customFieldName",op:"contains",type:"string",description:"(alias for query)"}},pS={sortBy:"customFieldName",sortOrder:"ASC",defaultLimit:100},hS={query:{path:"name",op:"contains",type:"string",description:"Group name"}},mS={sortBy:"name",sortOrder:"ASC",defaultLimit:100},AS={query:{path:"name",op:"contains",type:"string",description:"User name"},email:{path:"email",op:"contains",type:"string",description:"Email"},role:{path:"role",op:"eq",type:"string",description:"Role",enum:pQe},status:{path:"status",op:"multi",type:"string",description:"Status",enum:bM}},gS={sortBy:"name",sortOrder:"ASC",defaultLimit:50},yS={query:{path:"name",op:"contains",type:"string",description:"Rule name"},account:{path:"appliesToReconciliationAccount",op:"eq",type:"string",description:"Bank account resourceId",cliFlag:"--account <id>"}},ES={sortBy:"name",sortOrder:"ASC",defaultLimit:100},bS={query:{path:"type",op:"contains",type:"string",description:"Classifier type"}},CS={sortBy:"type",sortOrder:"ASC",defaultLimit:100}});var lr=K(()=>{"use strict";Vs();vM();X7();IQe();wQe();DQe();SQe();RQe();BQe();xQe();TQe();kQe();NQe();FQe();OQe();QQe();LQe();PQe();UQe();$Qe()});async function qQe(t,e){return t.list("/api/v1/modules",e)}async function jQe(t,e){return t.get(`/api/v1/modules/${encodeURIComponent(e)}`)}var YQe=K(()=>{"use strict"});async function HQe(t,e){return t.list("/api/v1/purchase-items",e)}async function zQe(t,e){return t.get(`/api/v1/purchase-items/${encodeURIComponent(e)}`)}async function GQe(t,e){return t.search("/api/v1/purchase-items/search",e)}var VQe=K(()=>{"use strict"});async function qM(t,e){return t.list("/api/v1/invoices",e)}async function Is(t,e){let r=await t.get(`/api/v1/invoices/${e}`);return"data"in r&&typeof r.data=="object"?r:{data:r}}async function Kb(t,e){return t.search("/api/v1/invoices/search",e)}async function xA(t,e){return t.post("/api/v1/invoices",{...e,saveAsDraft:e.saveAsDraft??!0})}async function jM(t,e,r){return t.put(`/api/v1/invoices/${e}`,r)}async function YM(t,e){await t.delete(`/api/v1/invoices/${e}`)}async function vS(t,e,r){return t.post(`/api/v1/invoices/${e}/payments`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function IS(t,e){return t.post("/api/v1/scheduled/invoices",e)}async function HM(t,e,r){return t.post(`/api/v1/invoices/${e}/credits`,{credits:r})}async function wS(t,e,r){return t.put(`/api/v1/invoices/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function zM(t,e){return t.get(`/api/v1/invoices/${e}/download`)}async function GM(t,e){let r=await t.get(`/api/v1/invoices/${e}/payments`);return{data:Array.isArray(r)?r:r.data??[]}}async function VM(t,e){let r=await t.get(`/api/v1/invoices/${e}/credits`);return{data:Array.isArray(r)?r:r.data??[]}}async function JM(t,e,r){await t.delete(`/api/v1/invoices/${e}/credits/${r}`)}async function WM(t,e){return Jo(t,"/api/v1/invoices/bulk-upsert","invoices",e)}async function ZM(t,e){return Jo(t,"/api/v1/invoices/line-items/bulk-upsert","invoices",e)}var TA=K(()=>{"use strict";Ra()});async function JQe(t,e,r){return t.list(`/api/v1/${Al[e]}`,r)}async function Rd(t,e,r){return t.get(`/api/v1/${Al[e]}/${r}`)}async function XM(t,e,r){return t.search(`/api/v1/${Al[e]}/search`,r)}async function KM(t,e,r){return t.search(`/api/v1/${Al[e]}/line-items/search`,r)}async function _S(t,e){return t.post("/api/v1/sale-quotes",{...e,saveAsDraft:e.saveAsDraft??!0})}async function DS(t,e){return t.post("/api/v1/sale-orders",e)}async function eP(t,e,r,n){return t.post(`/api/v1/${Al[e]}/${r}/convert-to-invoice`,n)}async function tP(t,e,r,n){return t.put(`/api/v1/${Al[e]}/${r}`,n)}async function rP(t,e,r){await t.delete(`/api/v1/${Al[e]}/${r}`)}async function nP(t,e,r,n){return t.post(`/api/v1/${Al[e]}/${r}/void`,n?{internalNotes:n}:{})}async function iP(t,e){return t.post(`/api/v1/sale-quotes/${e}/accept`,{})}async function oP(t,e){return t.post(`/api/v1/sale-orders/${e}/confirm`,{})}async function WQe(t,e,r,n){return t.post(`/api/v1/${Al[e]}/${r}/fast-fix`,{attributes:n})}async function ZQe(t,e,r,n){return t.post(`/api/v1/${Al[e]}/bulk-void`,{resourceIds:r,...n?{internalNotes:n}:{}})}async function XQe(t,e){return t.post("/api/v1/sale-quotes/bulk-accept",{resourceIds:e})}async function KQe(t,e){return t.post("/api/v1/sale-orders/bulk-confirm",{resourceIds:e})}async function eLe(t,e,r){return t.post(`/api/v1/${Al[e]}/bulk-delete`,{resourceIds:r})}async function tLe(t,e){return t.post("/api/v1/sale-orders/line-items/bulk-upsert",{saleOrders:e})}var Al,oZ=K(()=>{"use strict";Al={SALE_QUOTE:"sale-quotes",SALE_ORDER:"sale-orders"}});async function rLe(t,e,r){return t.list(`/api/v1/${gl[e]}`,r)}async function Bd(t,e,r){return t.get(`/api/v1/${gl[e]}/${r}`)}async function sP(t,e,r){return t.search(`/api/v1/${gl[e]}/search`,r)}async function aP(t,e,r){return t.search(`/api/v1/${gl[e]}/line-items/search`,r)}async function SS(t,e){return t.post("/api/v1/purchase-requests",{...e,saveAsDraft:e.saveAsDraft??!0})}async function RS(t,e){return t.post("/api/v1/purchase-orders",{...e,saveAsDraft:e.saveAsDraft??!0})}async function cP(t,e,r,n){return t.post(`/api/v1/${gl[e]}/${r}/convert-to-bill`,n)}async function lP(t,e,r,n){return t.put(`/api/v1/${gl[e]}/${r}`,n)}async function uP(t,e,r){await t.delete(`/api/v1/${gl[e]}/${r}`)}async function dP(t,e,r,n){return t.post(`/api/v1/${gl[e]}/${r}/void`,n?{internalNotes:n}:{})}async function fP(t,e){return t.post(`/api/v1/purchase-requests/${e}/accept`,{})}async function pP(t,e){return t.post(`/api/v1/purchase-orders/${e}/confirm`,{})}async function nLe(t,e,r,n){return t.post(`/api/v1/${gl[e]}/${r}/fast-fix`,{attributes:n})}async function iLe(t,e,r,n){return t.post(`/api/v1/${gl[e]}/bulk-void`,{resourceIds:r,...n?{internalNotes:n}:{}})}async function oLe(t,e){return t.post("/api/v1/purchase-requests/bulk-accept",{resourceIds:e})}async function sLe(t,e){return t.post("/api/v1/purchase-orders/bulk-confirm",{resourceIds:e})}async function aLe(t,e,r){return t.post(`/api/v1/${gl[e]}/bulk-delete`,{resourceIds:r})}async function cLe(t,e){return t.post("/api/v1/purchase-orders/line-items/bulk-upsert",{purchaseOrders:e})}var gl,sZ=K(()=>{"use strict";gl={PURCHASE_REQUEST:"purchase-requests",PURCHASE_ORDER:"purchase-orders"}});async function hP(t,e){return t.list("/api/v1/journals",e)}async function BS(t,e){return t.search("/api/v1/journals/search",e)}async function kA(t,e){return t.post("/api/v1/journals",{...e,saveAsDraft:e.saveAsDraft??!0})}async function mP(t,e){await t.delete(`/api/v1/journals/${e}`)}async function yl(t,e){return t.get(`/api/v1/journals/${e}`)}async function eC(t,e,r){return t.put(`/api/v1/journals/${e}`,r)}async function lLe(t,e,r){return t.put(`/api/v1/journals/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function xS(t,e){return t.post("/api/v1/scheduled/journals",e)}async function AP(t,e){return Jo(t,"/api/v1/journals/bulk-upsert","journals",e)}var tC=K(()=>{"use strict";Ra()});async function gP(t,e){return t.post("/api/v1/generate-reports/trial-balance",e)}async function yP(t,e){return t.post("/api/v1/generate-reports/balance-sheet",e)}async function EP(t,e){return t.post("/api/v1/generate-reports/profit-and-loss",e)}async function bP(t,e){return t.post("/api/v1/generate-reports/cashflow",e)}async function CP(t,e){return t.post("/api/v1/generate-reports/ar-summary-report",e)}async function vP(t,e){return t.post("/api/v1/generate-reports/ap-summary-report",e)}function rC(t,e){let{root:r,rows:n}=J$t[e],i=t.data?.[r]??{},o=Array.isArray(i[n])?i[n]:[],s={current:0,lessThanOneMonth:0,oneMonth:0,twoMonths:0,threeMonths:0,older:0,total:0};for(let u of o)s.current+=u.currentIso??0,s.lessThanOneMonth+=u.lessThanOneMonthIso??0,s.oneMonth+=u.oneMonthIso??0,s.twoMonths+=u.twoMonthsIso??0,s.threeMonths+=u.threeMonthsIso??0,s.older+=u.olderIso??0,s.total+=u.balanceIso??0;let a=u=>Math.round(u*100)/100,c=i.startDate;return{reportType:e==="receivables"?"AGED_RECEIVABLES":"AGED_PAYABLES",organizationName:i.organizationName,asAt:typeof c=="number"?new Date(c).toISOString().slice(0,10):void 0,currencyCode:i.currencyCode,currencySymbol:i.currencySymbol,buckets:{current:a(s.current),lessThanOneMonth:a(s.lessThanOneMonth),oneMonth:a(s.oneMonth),twoMonths:a(s.twoMonths),threeMonths:a(s.threeMonths),older:a(s.older)},totalOutstanding:a(s.total),contactCount:o.length}}async function IP(t,e){return t.post("/api/v1/generate-reports/cash-balance",e)}async function wP(t,e){return t.post("/api/v1/generate-reports/general-ledger",e)}async function _P(t,e){return t.post("/api/v1/generate-reports/vat-ledger",e)}async function DP(t,e){return t.post("/api/v1/generate-reports/equity-movement",e)}async function SP(t,e){return t.post("/api/v1/generate-reports/bank-balance-summary",e)}async function RP(t,e){return t.post("/api/v1/generate-reports/bank-reconciliation-summary",e)}async function BP(t,e){return t.post("/api/v1/generate-reports/bank-reconciliation-details",e)}async function xP(t,e){return t.post("/api/v1/generate-reports/fixed-assets-summary",e)}async function TP(t,e){return t.post("/api/v1/generate-reports/fixed-assets-recon-summary",e)}async function kP(t,e){return t.post("/api/v1/generate-reports/ar-report",e)}async function NP(t){return t.get("/api/v1/ledger/highlights")}var J$t,aZ=K(()=>{"use strict";J$t={receivables:{root:"generateAgedReceivablesReportGroupByContact",rows:"customerSummary"},payables:{root:"generateAgedPayablesReportGroupByContact",rows:"supplierSummary"}}});async function FP(t,e){return t.list("/api/v1/catalogs",e)}async function OP(t,e){return t.get(`/api/v1/catalogs/${encodeURIComponent(e)}`)}async function QP(t,e){return t.search("/api/v1/catalogs/search",e)}async function LP(t,e){return t.post("/api/v1/catalogs",e)}async function MP(t,e,r){return t.put(`/api/v1/catalogs/${encodeURIComponent(e)}`,r)}async function PP(t,e){await t.delete(`/api/v1/catalogs/${encodeURIComponent(e)}`)}var cZ=K(()=>{"use strict"});async function uLe(t,e){return t.list("/api/v1/organization-report-template",e)}async function dLe(t,e){return t.get(`/api/v1/organization-report-template/${encodeURIComponent(e)}`)}async function fLe(t,e){return t.search("/api/v1/organization-report-template/search",e)}var pLe=K(()=>{"use strict"});async function UP(t,e){return t.list("/api/v1/customer-credit-notes",e)}async function El(t,e){return t.get(`/api/v1/customer-credit-notes/${e}`)}async function TS(t,e){return t.search("/api/v1/customer-credit-notes/search",e)}async function kS(t,e){return t.post("/api/v1/customer-credit-notes",{...e,saveAsDraft:e.saveAsDraft??!0})}async function $P(t,e,r){return t.put(`/api/v1/customer-credit-notes/${e}`,r)}async function NS(t,e,r){return t.put(`/api/v1/customer-credit-notes/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function qP(t,e){await t.delete(`/api/v1/customer-credit-notes/${e}`)}async function FS(t,e,r){return t.post(`/api/v1/customer-credit-notes/${e}/refunds`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function jP(t,e){return t.get(`/api/v1/customer-credit-notes/${e}/refunds`)}async function YP(t,e){return t.get(`/api/v1/customer-credit-notes/${e}/download`)}async function HP(t,e){return Jo(t,"/api/v1/customer-credit-notes/bulk-upsert","customerCreditNotes",e)}var zP=K(()=>{"use strict";Ra()});async function GP(t,e){return t.list("/api/v1/supplier-credit-notes",e)}async function bl(t,e){return t.get(`/api/v1/supplier-credit-notes/${e}`)}async function OS(t,e){return t.search("/api/v1/supplier-credit-notes/search",e)}async function QS(t,e){return t.post("/api/v1/supplier-credit-notes",{...e,saveAsDraft:e.saveAsDraft??!0})}async function VP(t,e,r){return t.put(`/api/v1/supplier-credit-notes/${e}`,r)}async function LS(t,e,r){return t.put(`/api/v1/supplier-credit-notes/${e}`,{...r,resourceId:e,saveAsDraft:!1})}async function JP(t,e){await t.delete(`/api/v1/supplier-credit-notes/${e}`)}async function WP(t,e){return t.get(`/api/v1/supplier-credit-notes/${e}/download`)}async function MS(t,e,r){return t.post(`/api/v1/supplier-credit-notes/${e}/refunds`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function ZP(t,e){return t.get(`/api/v1/supplier-credit-notes/${e}/refunds`)}async function XP(t,e){return Jo(t,"/api/v1/supplier-credit-notes/bulk-upsert","supplierCreditNotes",e)}var KP=K(()=>{"use strict";Ra()});async function PS(t){return t.get("/api/v1/organization/currencies")}async function e2(t,e){return t.post("/api/v1/organization/currencies",{currencies:e})}async function t2(t,e,r){return t.list(`/api/v1/organization/currencies/${e}/rates`,r)}async function r2(t,e,r){return t.post(`/api/v1/organization/currencies/${e}/rates`,r)}async function n2(t,e,r,n){return t.put(`/api/v1/organization/currencies/${e}/rates/${r}`,n)}async function i2(t,e){return t.post("/api/v1/organization/currencies/rates/bulk-upsert",{rates:e})}var o2=K(()=>{"use strict"});var hLe=b((lZ,uZ)=>{(function(t,e){typeof define=="function"&&define.amd?define([],e):typeof uZ=="object"&&typeof lZ<"u"?uZ.exports=e():t.Papa=e()})(lZ,function t(){"use strict";var e=(function(){return typeof self<"u"?self:typeof window<"u"?window:typeof e<"u"?e:{}})();function r(){var D=e.URL||e.webkitURL||null,x=t.toString();return a.BLOB_URL||(a.BLOB_URL=D.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ","(",x,")();"],{type:"text/javascript"})))}var n=!e.document&&!!e.postMessage,i=e.IS_PAPA_WORKER||!1,o={},s=0,a={};if(a.parse=u,a.unparse=d,a.RECORD_SEP="",a.UNIT_SEP="",a.BYTE_ORDER_MARK="\uFEFF",a.BAD_DELIMITERS=["\r",`
|
|
449
449
|
`,'"',a.BYTE_ORDER_MARK],a.WORKERS_SUPPORTED=!n&&!!e.Worker,a.NODE_STREAM_INPUT=1,a.LocalChunkSize=1024*1024*10,a.RemoteChunkSize=1024*1024*5,a.DefaultDelimiter=",",a.Parser=E,a.ParserHandle=y,a.NetworkStreamer=p,a.FileStreamer=h,a.StringStreamer=m,a.ReadableStreamStreamer=A,typeof PAPA_BROWSER_CONTEXT>"u"&&(a.DuplexStreamStreamer=g),e.jQuery){var c=e.jQuery;c.fn.parse=function(D){var x=D.config||{},Q=[];return this.each(function(V){var W=c(this).prop("tagName").toUpperCase()==="INPUT"&&c(this).attr("type").toLowerCase()==="file"&&e.FileReader;if(!W||!this.files||this.files.length===0)return!0;for(var ie=0;ie<this.files.length;ie++)Q.push({file:this.files[ie],inputElem:this,instanceConfig:c.extend({},x)})}),J(),this;function J(){if(Q.length===0){q(D.complete)&&D.complete();return}var V=Q[0];if(q(D.before)){var W=D.before(V.file,V.inputElem);if(typeof W=="object")if(W.action==="abort"){T("AbortError",V.file,V.inputElem,W.reason);return}else if(W.action==="skip"){U();return}else typeof W.config=="object"&&(V.instanceConfig=c.extend(V.instanceConfig,W.config));else if(W==="skip"){U();return}}var ie=V.instanceConfig.complete;V.instanceConfig.complete=function(he){q(ie)&&ie(he,V.file,V.inputElem),U()},a.parse(V.file,V.instanceConfig)}function T(V,W,ie,he){q(D.error)&&D.error({name:V},W,ie,he)}function U(){Q.splice(0,1),J()}}}i&&(e.onmessage=F);function u(D,x){x=x||{};var Q=x.dynamicTyping||!1;if(q(Q)&&(x.dynamicTypingFunction=Q,Q={}),x.dynamicTyping=Q,x.transform=q(x.transform)?x.transform:!1,x.worker&&a.WORKERS_SUPPORTED){var J=v();J.userStep=x.step,J.userChunk=x.chunk,J.userComplete=x.complete,J.userError=x.error,x.step=q(x.step),x.chunk=q(x.chunk),x.complete=q(x.complete),x.error=q(x.error),delete x.worker,J.postMessage({input:D,config:x,workerId:J.id});return}var T=null;if(D===a.NODE_STREAM_INPUT&&typeof PAPA_BROWSER_CONTEXT>"u")return T=new g(x),T.getStream();return typeof D=="string"?(D=U(D),x.download?T=new p(x):T=new m(x)):D.readable===!0&&q(D.read)&&q(D.on)?T=new A(x):(e.File&&D instanceof File||D instanceof Object)&&(T=new h(x)),T.stream(D);function U(V){return V.charCodeAt(0)===65279?V.slice(1):V}}function d(D,x){var Q=!1,J=!0,T=",",U=`\r
|
|
450
450
|
`,V='"',W=V+V,ie=!1,he=null,_e=!1;dt();var Ce=new RegExp(C(V),"g");if(typeof D=="string"&&(D=JSON.parse(D)),Array.isArray(D)){if(!D.length||Array.isArray(D[0]))return De(null,D,ie);if(typeof D[0]=="object")return De(he||Object.keys(D[0]),D,ie)}else if(typeof D=="object")return typeof D.data=="string"&&(D.data=JSON.parse(D.data)),Array.isArray(D.data)&&(D.fields||(D.fields=D.meta&&D.meta.fields||he),D.fields||(D.fields=Array.isArray(D.data[0])?D.fields:typeof D.data[0]=="object"?Object.keys(D.data[0]):[]),!Array.isArray(D.data[0])&&typeof D.data[0]!="object"&&(D.data=[D.data])),De(D.fields||[],D.data||[],ie);throw new Error("Unable to serialize unrecognized input");function dt(){if(typeof x=="object"){if(typeof x.delimiter=="string"&&!a.BAD_DELIMITERS.filter(function(le){return x.delimiter.indexOf(le)!==-1}).length&&(T=x.delimiter),(typeof x.quotes=="boolean"||typeof x.quotes=="function"||Array.isArray(x.quotes))&&(Q=x.quotes),(typeof x.skipEmptyLines=="boolean"||typeof x.skipEmptyLines=="string")&&(ie=x.skipEmptyLines),typeof x.newline=="string"&&(U=x.newline),typeof x.quoteChar=="string"&&(V=x.quoteChar),typeof x.header=="boolean"&&(J=x.header),Array.isArray(x.columns)){if(x.columns.length===0)throw new Error("Option columns is empty");he=x.columns}x.escapeChar!==void 0&&(W=x.escapeChar+V),x.escapeFormulae instanceof RegExp?_e=x.escapeFormulae:typeof x.escapeFormulae=="boolean"&&x.escapeFormulae&&(_e=/^[=+\-@\t\r].*$/)}}function De(le,Ee,Be){var He="";typeof le=="string"&&(le=JSON.parse(le)),typeof Ee=="string"&&(Ee=JSON.parse(Ee));var Nt=Array.isArray(le)&&le.length>0,Dt=!Array.isArray(Ee[0]);if(Nt&&J){for(var nr=0;nr<le.length;nr++)nr>0&&(He+=T),He+=Oe(le[nr],nr);Ee.length>0&&(He+=U)}for(var Je=0;Je<Ee.length;Je++){var Pe=Nt?le.length:Ee[Je].length,At=!1,Le=Nt?Object.keys(Ee[Je]).length===0:Ee[Je].length===0;if(Be&&!Nt&&(At=Be==="greedy"?Ee[Je].join("").trim()==="":Ee[Je].length===1&&Ee[Je][0].length===0),Be==="greedy"&&Nt){for(var Ke=[],rt=0;rt<Pe;rt++){var tt=Dt?le[rt]:rt;Ke.push(Ee[Je][tt])}At=Ke.join("").trim()===""}if(!At){for(var ae=0;ae<Pe;ae++){ae>0&&!Le&&(He+=T);var X=Nt&&Dt?le[ae]:ae;He+=Oe(Ee[Je][X],ae)}Je<Ee.length-1&&(!Be||Pe>0&&!Le)&&(He+=U)}}return He}function Oe(le,Ee){if(typeof le>"u"||le===null)return"";if(le.constructor===Date)return JSON.stringify(le).slice(1,25);var Be=!1;_e&&typeof le=="string"&&_e.test(le)&&(le="'"+le,Be=!0);var He=le.toString().replace(Ce,W);return Be=Be||Q===!0||typeof Q=="function"&&Q(le,Ee)||Array.isArray(Q)&&Q[Ee]||fe(He,a.BAD_DELIMITERS)||He.indexOf(T)>-1||He.charAt(0)===" "||He.charAt(He.length-1)===" ",Be?V+He+V:He}function fe(le,Ee){for(var Be=0;Be<Ee.length;Be++)if(le.indexOf(Ee[Be])>-1)return!0;return!1}}function f(D){this._handle=null,this._finished=!1,this._completed=!1,this._halted=!1,this._input=null,this._baseIndex=0,this._partialLine="",this._rowCount=0,this._start=0,this._nextChunk=null,this.isFirstChunk=!0,this._completeResults={data:[],errors:[],meta:{}},x.call(this,D),this.parseChunk=function(Q,J){let T=parseInt(this._config.skipFirstNLines)||0;if(this.isFirstChunk&&T>0){let _e=this._config.newline;if(!_e){let dt=this._config.quoteChar||'"';_e=this._handle.guessLineEndings(Q,dt)}Q=[...Q.split(_e).slice(T)].join(_e)}if(this.isFirstChunk&&q(this._config.beforeFirstChunk)){var U=this._config.beforeFirstChunk(Q);U!==void 0&&(Q=U)}this.isFirstChunk=!1,this._halted=!1;var V=this._partialLine+Q;this._partialLine="";var W=this._handle.parse(V,this._baseIndex,!this._finished);if(this._handle.paused()||this._handle.aborted()){this._halted=!0;return}var ie=W.meta.cursor;this._finished||(this._partialLine=V.substring(ie-this._baseIndex),this._baseIndex=ie),W&&W.data&&(this._rowCount+=W.data.length);var he=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(i)e.postMessage({results:W,workerId:a.WORKER_ID,finished:he});else if(q(this._config.chunk)&&!J){if(this._config.chunk(W,this._handle),this._handle.paused()||this._handle.aborted()){this._halted=!0;return}W=void 0,this._completeResults=void 0}return!this._config.step&&!this._config.chunk&&(this._completeResults.data=this._completeResults.data.concat(W.data),this._completeResults.errors=this._completeResults.errors.concat(W.errors),this._completeResults.meta=W.meta),!this._completed&&he&&q(this._config.complete)&&(!W||!W.meta.aborted)&&(this._config.complete(this._completeResults,this._input),this._completed=!0),!he&&(!W||!W.meta.paused)&&this._nextChunk(),W},this._sendError=function(Q){q(this._config.error)?this._config.error(Q):i&&this._config.error&&e.postMessage({workerId:a.WORKER_ID,error:Q,finished:!1})};function x(Q){var J=N(Q);J.chunkSize=parseInt(J.chunkSize),!Q.step&&!Q.chunk&&(J.chunkSize=null),this._handle=new y(J),this._handle.streamer=this,this._config=J}}function p(D){D=D||{},D.chunkSize||(D.chunkSize=a.RemoteChunkSize),f.call(this,D);var x;n?this._nextChunk=function(){this._readChunk(),this._chunkLoaded()}:this._nextChunk=function(){this._readChunk()},this.stream=function(J){this._input=J,this._nextChunk()},this._readChunk=function(){if(this._finished){this._chunkLoaded();return}if(x=new XMLHttpRequest,this._config.withCredentials&&(x.withCredentials=this._config.withCredentials),n||(x.onload=H(this._chunkLoaded,this),x.onerror=H(this._chunkError,this)),x.open(this._config.downloadRequestBody?"POST":"GET",this._input,!n),this._config.downloadRequestHeaders){var J=this._config.downloadRequestHeaders;for(var T in J)x.setRequestHeader(T,J[T])}if(this._config.chunkSize){var U=this._start+this._config.chunkSize-1;x.setRequestHeader("Range","bytes="+this._start+"-"+U)}try{x.send(this._config.downloadRequestBody)}catch(V){this._chunkError(V.message)}n&&x.status===0&&this._chunkError()},this._chunkLoaded=function(){if(x.readyState===4){if(x.status<200||x.status>=400){this._chunkError();return}this._start+=this._config.chunkSize?this._config.chunkSize:x.responseText.length,this._finished=!this._config.chunkSize||this._start>=Q(x),this.parseChunk(x.responseText)}},this._chunkError=function(J){var T=x.statusText||J;this._sendError(new Error(T))};function Q(J){var T=J.getResponseHeader("Content-Range");return T===null?-1:parseInt(T.substring(T.lastIndexOf("/")+1))}}p.prototype=Object.create(f.prototype),p.prototype.constructor=p;function h(D){D=D||{},D.chunkSize||(D.chunkSize=a.LocalChunkSize),f.call(this,D);var x,Q,J=typeof FileReader<"u";this.stream=function(T){this._input=T,Q=T.slice||T.webkitSlice||T.mozSlice,J?(x=new FileReader,x.onload=H(this._chunkLoaded,this),x.onerror=H(this._chunkError,this)):x=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){!this._finished&&(!this._config.preview||this._rowCount<this._config.preview)&&this._readChunk()},this._readChunk=function(){var T=this._input;if(this._config.chunkSize){var U=Math.min(this._start+this._config.chunkSize,this._input.size);T=Q.call(T,this._start,U)}var V=x.readAsText(T,this._config.encoding);J||this._chunkLoaded({target:{result:V}})},this._chunkLoaded=function(T){this._start+=this._config.chunkSize,this._finished=!this._config.chunkSize||this._start>=this._input.size,this.parseChunk(T.target.result)},this._chunkError=function(){this._sendError(x.error)}}h.prototype=Object.create(f.prototype),h.prototype.constructor=h;function m(D){D=D||{},f.call(this,D);var x;this.stream=function(Q){return x=Q,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var Q=this._config.chunkSize,J;return Q?(J=x.substring(0,Q),x=x.substring(Q)):(J=x,x=""),this._finished=!x,this.parseChunk(J)}}}m.prototype=Object.create(m.prototype),m.prototype.constructor=m;function A(D){D=D||{},f.call(this,D);var x=[],Q=!0,J=!1;this.pause=function(){f.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){f.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(T){this._input=T,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){J&&x.length===1&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),x.length?this.parseChunk(x.shift()):Q=!0},this._streamData=H(function(T){try{x.push(typeof T=="string"?T:T.toString(this._config.encoding)),Q&&(Q=!1,this._checkIsFinished(),this.parseChunk(x.shift()))}catch(U){this._streamError(U)}},this),this._streamError=H(function(T){this._streamCleanUp(),this._sendError(T)},this),this._streamEnd=H(function(){this._streamCleanUp(),J=!0,this._streamData("")},this),this._streamCleanUp=H(function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)},this)}A.prototype=Object.create(f.prototype),A.prototype.constructor=A;function g(D){var x=P("stream").Duplex,Q=N(D),J=!0,T=!1,U=[],V=null;this._onCsvData=function(W){var ie=W.data;!V.push(ie)&&!this._handle.paused()&&this._handle.pause()},this._onCsvComplete=function(){V.push(null)},Q.step=H(this._onCsvData,this),Q.complete=H(this._onCsvComplete,this),f.call(this,Q),this._nextChunk=function(){T&&U.length===1&&(this._finished=!0),U.length?U.shift()():J=!0},this._addToParseQueue=function(W,ie){U.push(H(function(){if(this.parseChunk(typeof W=="string"?W:W.toString(Q.encoding)),q(ie))return ie()},this)),J&&(J=!1,this._nextChunk())},this._onRead=function(){this._handle.paused()&&this._handle.resume()},this._onWrite=function(W,ie,he){this._addToParseQueue(W,he)},this._onWriteComplete=function(){T=!0,this._addToParseQueue("")},this.getStream=function(){return V},V=new x({readableObjectMode:!0,decodeStrings:!1,read:H(this._onRead,this),write:H(this._onWrite,this)}),V.once("finish",H(this._onWriteComplete,this))}typeof PAPA_BROWSER_CONTEXT>"u"&&(g.prototype=Object.create(f.prototype),g.prototype.constructor=g);function y(D){var x=Math.pow(2,53),Q=-x,J=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,T=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,U=this,V=0,W=0,ie,he,_e=!1,Ce=!1,dt,De=[],Oe={data:[],errors:[],meta:{}};if(q(D.step)){var fe=D.step;D.step=function(Le){if(Oe=Le,He())Be();else{if(Be(),Oe.data.length===0)return;V+=Le.data.length,D.preview&&V>D.preview?he.abort():(Oe.data=Oe.data[0],fe(Oe,U))}}}this.parse=function(Le,Ke,rt){var tt=D.quoteChar||'"';if(D.newline||(D.newline=this.guessLineEndings(Le,tt)),dt=!1,D.delimiter)q(D.delimiter)&&(D.delimiter=D.delimiter(Le),Oe.meta.delimiter=D.delimiter);else{var ae=Pe(Le,D.newline,D.skipEmptyLines,D.comments,D.delimitersToGuess);ae.successful?D.delimiter=ae.bestDelimiter:(dt=!0,D.delimiter=a.DefaultDelimiter),Oe.meta.delimiter=D.delimiter}var X=N(D);return D.preview&&D.header&&X.preview++,ie=Le,he=new E(X),Oe=he.parse(ie,Ke,rt),Be(),_e?{meta:{paused:!0}}:Oe||{meta:{paused:!1}}},this.paused=function(){return _e},this.pause=function(){_e=!0,he.abort(),ie=q(D.chunk)?"":ie.substring(he.getCharIndex())},this.resume=function(){U.streamer._halted?(_e=!1,U.streamer.parseChunk(ie,!0)):setTimeout(U.resume,3)},this.aborted=function(){return Ce},this.abort=function(){Ce=!0,he.abort(),Oe.meta.aborted=!0,q(D.complete)&&D.complete(Oe),ie=""},this.guessLineEndings=function(Le,Ke){Le=Le.substring(0,1024*1024);var rt=new RegExp(C(Ke)+"([^]*?)"+C(Ke),"gm");Le=Le.replace(rt,"");var tt=Le.split("\r"),ae=Le.split(`
|
|
451
451
|
`),X=ae.length>1&&ae[0].length<tt[0].length;if(tt.length===1||X)return`
|
|
@@ -825,7 +825,7 @@ accountResourceId + taxProfileResourceId apply to ALL line items (immutable). in
|
|
|
825
825
|
|
|
826
826
|
Dynamic strings (reference/lineItem name/notes): ${zx} \u2014 relative to transaction date.`,params:{interval:{type:"string",enum:["WEEKLY","MONTHLY","QUARTERLY","YEARLY"],description:"Billing interval"},startDate:{type:"string",description:"Start date (YYYY-MM-DD)"},endDate:{type:"string",description:"End date (YYYY-MM-DD, optional for ongoing)"},contactResourceId:{type:"string",description:"Customer contact resourceId"},reference:{type:"string",description:"Invoice reference (REQUIRED). Supports dynamic strings: {{Month}}, {{Year}}, etc."},valueDate:{type:"string",description:"Invoice date (YYYY-MM-DD)"},dueDate:{type:"string",description:"Due date (YYYY-MM-DD)"},accountResourceId:{type:"string",description:"Revenue account resourceId (applied to ALL line items \u2014 must be same)"},taxProfileResourceId:{type:"string",description:"Tax profile resourceId (applied to ALL line items \u2014 must be same)"},lineItems:{type:"array",items:{type:"object",properties:{name:{type:"string"},unitPrice:{type:"number"},quantity:{type:"number"}},required:["name","unitPrice","quantity"]},description:"Line items (name, unitPrice, quantity only \u2014 account/tax set at top level)"},proratedConfig:{type:"object",description:"Optional prorated-period customization. All fields optional.",properties:{proratedStartDate:{type:"string",description:"Prorated window start (YYYY-MM-DD). Defaults to subscription startDate."},proratedAdjustmentLineText:{type:"string",description:'Adjustment line label on the prorated invoice (default "Prorated adjustment").'},itemResourceId:{type:"string",description:"Non-inventory item resourceId (UUIDv4) for the prorated adjustment line. Defaults to the subscription's first line item."},includeNextPeriod:{type:"boolean",description:"If true: bundle the next full period at 2x quantity AND advance nextScheduleDate by one extra interval. Response carries bundledPeriodEndDate + bundledAmount."}}}},required:["interval","startDate","contactResourceId","lineItems","accountResourceId","valueDate","dueDate","reference"],group:"subscriptions",readOnly:!1,searchHint:"create new recurring subscription billing schedule with proration",execute:async(t,e)=>{let{interval:r,startDate:n,endDate:i,contactResourceId:o,reference:s,valueDate:a,dueDate:c,accountResourceId:u,taxProfileResourceId:d,lineItems:f,proratedConfig:p}=e,h=f.map(A=>({...A,accountResourceId:u,...d?{taxProfileResourceId:d}:{}})),m={repeat:r,startDate:n,status:"ACTIVE",proratedConfig:{proratedAdjustmentLineText:"Prorated adjustment",...p??{}},invoice:{contactResourceId:o,reference:s||`SUB-${Date.now()}`,valueDate:a,dueDate:c,lineItems:h,saveAsDraft:!1}};return i&&(m.endDate=i),zH(t.client,m)}},{name:"update_subscription",description:"Update an existing subscription (interval, end date, transaction template, or proratedConfig). When the user asks to update a subscription, use this tool directly. NOTE: accountResourceId and taxProfileResourceId on line items are immutable after creation \u2014 to change them, cancel and recreate. proratedConfig fields can be amended on update (proratedStartDate, proratedAdjustmentLineText, itemResourceId, includeNextPeriod).",params:{resourceId:{type:"string",description:"Subscription resourceId"},interval:{type:"string",enum:["WEEKLY","MONTHLY","QUARTERLY","YEARLY"]},endDate:{type:"string",description:"New end date (YYYY-MM-DD)"},proratedConfig:{type:"object",description:"Amend the prorated-period customization. All fields optional.",properties:{proratedStartDate:{type:"string",description:"YYYY-MM-DD"},proratedAdjustmentLineText:{type:"string"},itemResourceId:{type:"string",description:"UUIDv4"},includeNextPeriod:{type:"boolean"}}},data:{type:"object",description:"Updated transaction template"}},required:["resourceId"],group:"subscriptions",readOnly:!1,searchHint:"update subscription schedule amount details proration",execute:async(t,e)=>{let{resourceId:r,...n}=e;return GH(t.client,r,n)}},xi("delete_subscription","Delete a subscription. Removes the recurring schedule.","subscriptions",(t,e)=>VH(t,e),"permanently delete a subscription schedule"),{name:"cancel_subscription",description:"Cancel an active subscription. Prorates remaining period and stops future billing. Safe to call \u2014 subscriptions can be reactivated after cancellation. Always use this tool when the user asks to cancel a subscription. Must cancel before delete.",params:{resourceId:{type:"string",description:"Subscription resourceId"},cancelDateType:{type:"string",enum:["END_OF_CURRENT_PERIOD","END_OF_LAST_PERIOD","CUSTOM_DATE"],description:"When to end (default: END_OF_CURRENT_PERIOD)"},endDate:{type:"string",description:"Custom cancel date YYYY-MM-DD (only with CUSTOM_DATE)"},proratedAdjustmentLineText:{type:"string",description:'Label for proration line item (default: "Prorated adjustment")'}},required:["resourceId"],group:"subscriptions",readOnly:!1,searchHint:"cancel stop a recurring subscription",isDestructive:!0,execute:async(t,e)=>JH(t.client,e.resourceId,{cancelDateType:e.cancelDateType,endDate:e.endDate,proratedAdjustmentLineText:e.proratedAdjustmentLineText})},Vt({name:"search_scheduled_transactions",description:"Search scheduled transactions (subscriptions / recurring invoices / journals / cash entries).",group:"subscriptions",fields:LD,defaults:MD,fetcher:WH,searchHint:"find scheduled recurring transactions subscriptions schedulers by type status interval contact"}),{name:"generate_vat_ledger",description:"Generate VAT/GST ledger report showing all tax transactions for the period.",params:{startDate:{type:"string",description:"Start date (YYYY-MM-DD)"},endDate:{type:"string",description:"End date (YYYY-MM-DD)"}},required:["startDate","endDate"],group:"financial_reports",readOnly:!0,searchHint:"generate VAT GST tax ledger report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>_P(t.client,{startDate:e.startDate,endDate:e.endDate})},{name:"generate_equity_movement",description:"Generate equity movement report (statement of changes in equity).",params:{primarySnapshotStartDate:{type:"string",description:"Period start date (YYYY-MM-DD)"},primarySnapshotEndDate:{type:"string",description:"Period end date (YYYY-MM-DD)"},currencyCode:{type:"string",description:'Currency code (e.g., "SGD")'},compareWith:{type:"string",description:'Compare with period (e.g., "PREVIOUS_YEAR")'},compareCount:{type:"number",description:"Number of comparison periods"}},required:["primarySnapshotStartDate","primarySnapshotEndDate"],group:"financial_reports",readOnly:!0,searchHint:"generate equity movement statement report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>DP(t.client,e)},{name:"generate_bank_balance_summary",description:"Generate bank balance summary report \u2014 snapshot of all bank account balances at a point in time.",params:{primarySnapshotDate:{type:"string",description:"Snapshot date (YYYY-MM-DD)"},currencyCode:{type:"string",description:'Currency code (e.g., "SGD")'}},required:["primarySnapshotDate"],group:"operational_reports",readOnly:!0,searchHint:"generate bank account balance summary report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>SP(t.client,{primarySnapshotDate:e.primarySnapshotDate,currencyCode:e.currencyCode})},{name:"generate_bank_recon_summary",description:"Generate bank reconciliation summary for a specific bank account. Essential for month-end close \u2014 call this for each in-scope bank account for the current entity and reporting period. Use for bank recon status, unreconciled items count, or reconciliation summaries.",params:{bankAccountResourceId:{type:"string",description:"Bank account resourceId"},primarySnapshotStartDate:{type:"string",description:"Period start date (YYYY-MM-DD)"},primarySnapshotEndDate:{type:"string",description:"Period end date (YYYY-MM-DD)"},currencyCode:{type:"string",description:"Currency code"},tags:{type:"array",items:{type:"string"},description:"Filter by tags"}},required:["bankAccountResourceId","primarySnapshotStartDate","primarySnapshotEndDate"],group:"operational_reports",readOnly:!0,searchHint:"generate bank reconciliation summary report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>RP(t.client,e)},{name:"generate_bank_recon_details",description:"Generate detailed bank reconciliation report showing matched/unmatched items.",params:{bankAccountResourceId:{type:"string",description:"Bank account resourceId"},primarySnapshotStartDate:{type:"string",description:"Period start date (YYYY-MM-DD)"},primarySnapshotEndDate:{type:"string",description:"Period end date (YYYY-MM-DD)"},filter:{type:"object",description:'Filter criteria (e.g., { status: "UNMATCHED" })'},currencyCode:{type:"string",description:"Currency code"}},required:["bankAccountResourceId","primarySnapshotStartDate","primarySnapshotEndDate","filter"],group:"operational_reports",readOnly:!0,searchHint:"generate bank reconciliation detailed report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>BP(t.client,e)},{name:"generate_fa_summary",description:"Generate fixed assets summary report grouped by account, type, category, or status.",params:{primarySnapshotStartDate:{type:"string",description:"Period start date (YYYY-MM-DD)"},primarySnapshotEndDate:{type:"string",description:"Period end date (YYYY-MM-DD)"},groupBy:{type:"string",enum:["ACCOUNT","TYPE","CATEGORY","STATUS"],description:"Grouping dimension"},currencyCode:{type:"string",description:"Currency code"}},required:["primarySnapshotStartDate","primarySnapshotEndDate","groupBy"],group:"operational_reports",readOnly:!0,searchHint:"generate fixed asset summary depreciation report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>xP(t.client,e)},{name:"generate_fa_recon_summary",description:"Generate fixed assets reconciliation summary \u2014 reconciles asset register with general ledger.",params:{primarySnapshotStartDate:{type:"string",description:"Period start date (YYYY-MM-DD)"},primarySnapshotEndDate:{type:"string",description:"Period end date (YYYY-MM-DD)"},accountResourceIds:{type:"array",items:{type:"string"},description:"Filter by specific asset account IDs"},currencyCode:{type:"string",description:"Currency code"}},required:["primarySnapshotStartDate","primarySnapshotEndDate"],group:"operational_reports",readOnly:!0,searchHint:"generate fixed asset reconciliation report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>TP(t.client,e)},{name:"generate_ar_report",description:"Generate accounts receivable aging report. Shows outstanding invoices grouped by aging buckets. Use this when discussing customer payment allocation, credit control, or AR status \u2014 generate the report to show the full picture.",params:{endDate:{type:"string",description:"Report date (YYYY-MM-DD) \u2014 point-in-time snapshot"}},required:["endDate"],group:"operational_reports",readOnly:!0,searchHint:"generate detailed accounts receivable report",isConcurrencySafe:!0,maxResultSizeChars:1e5,execute:async(t,e)=>kP(t.client,{endDate:e.endDate})},{name:"get_ledger_highlights",description:"Get ledger highlights \u2014 summary metadata about the org general ledger: transaction counts by type, date range, active accounts, active currencies, and cross-currency detection. No parameters needed.",params:{},required:[],group:"operational_reports",readOnly:!0,searchHint:"get ledger highlights key metrics for period",isConcurrencySafe:!0,maxResultSizeChars:2e4,execute:async t=>NP(t.client)},dr("list_contact_groups","List contact groups with their associated contacts. Used to segment customers/suppliers.","contact_groups",(t,e,r)=>ZH(t,{limit:r,offset:e}),"list contact groups customer supplier categories"),wi("get_contact_group","Get contact group details including all associated contacts.","contact_groups",(t,e)=>XH(t,e),"get contact group details members"),Vt({name:"search_contact_groups",description:"Search contact groups.",group:"contact_groups",fields:hS,defaults:mS,fetcher:KH,searchHint:"find contact groups segments categories by name"}),{name:"create_contact_group",description:'Create a new contact group for segmenting contacts (e.g., "VIP Customers", "Government", "Overdue > 90 Days").',params:{name:{type:"string",description:"Group name"},contactResourceIds:{type:"array",items:{type:"string"},description:"Contact IDs to add to the group"}},required:["name"],group:"contact_groups",readOnly:!1,searchHint:"create new contact group category",execute:async(t,e)=>ez(t.client,{name:e.name,contactResourceIds:e.contactResourceIds})},{name:"update_contact_group",description:"Update a contact group name or members. NOTE: Update endpoint has a known 500 bug on some orgs \u2014 retry or recreate if it fails.",params:{resourceId:{type:"string",description:"Contact group resourceId"},name:{type:"string",description:"New group name"},contactResourceIds:{type:"array",items:{type:"string"},description:"Contact IDs to set as group members (replaces existing)"}},required:["resourceId"],group:"contact_groups",readOnly:!1,searchHint:"update contact group name details",execute:async(t,e)=>tz(t.client,e.resourceId,{name:e.name,contactResourceIds:e.contactResourceIds})},xi("delete_contact_group","Delete a contact group. Does not delete the contacts themselves.","contact_groups",(t,e)=>rz(t,e),"permanently delete a contact group"),dr("list_custom_fields","List custom fields defined for the organization. Custom fields add extra data to invoices, bills, credit notes, and payments.","custom_fields",(t,e,r)=>sz(t,{limit:r,offset:e}),"list custom fields metadata on transactions"),{name:"get_custom_field",description:"Get a custom field by resourceId. Returns full definition including appliesTo flags and list options.",params:{resourceId:{type:"string",description:"Custom field resourceId"}},required:["resourceId"],group:"custom_fields",readOnly:!0,searchHint:"get custom field definition details",isConcurrencySafe:!0,maxResultSizeChars:2e4,execute:async(t,e)=>az(t.client,e.resourceId)},Vt({name:"search_custom_fields",description:"Search custom fields.",group:"custom_fields",fields:fS,defaults:pS,fetcher:cz,searchHint:"find custom fields user-defined attributes by name data type"}),{name:"create_custom_field",description:`Create a new custom field. Custom fields appear on transactions (invoices, bills, credit notes, payments).
|
|
827
827
|
- Use appliesTo to control which transaction types show this field.
|
|
828
|
-
- printOnDocuments controls whether the field appears on PDFs.`,params:{name:{type:"string",description:'Field name (e.g., "PO Number", "Cost Center")'},description:{type:"string",description:"Field description"},printOnDocuments:{type:"boolean",description:"Show on PDF documents (default false)"},appliesTo:{type:"object",description:"Which transaction types: { invoices: true, bills: true, customerCredits: true, supplierCredits: true, payments: true }"},fieldType:{type:"string",description:'Field type (e.g., "TEXT", "NUMBER", "DATE") \u2014 legacy param'},entityType:{type:"string",description:"Entity type \u2014 legacy param"}},required:["name"],group:"custom_fields",readOnly:!1,searchHint:"create new custom field for transactions",execute:async(t,e)=>lz(t.client,e)},{name:"update_custom_field",description:"Update a custom field definition. Can change name, description, printOnDocuments, and appliesTo flags.",params:{resourceId:{type:"string",description:"Custom field resourceId"},name:{type:"string",description:"New field name"},description:{type:"string",description:"New description"},printOnDocuments:{type:"boolean",description:"Show on PDF documents"},appliesTo:{type:"object",description:"Which transaction types: { invoices, bills, customerCredits, supplierCredits, payments }"}},required:["resourceId"],group:"custom_fields",readOnly:!1,searchHint:"update custom field name type settings",execute:async(t,e)=>{let{resourceId:r,...n}=e;return uz(t.client,r,n)}},xi("delete_custom_field","Delete a custom field. Removes it from all future transactions.","custom_fields",(t,e)=>dz(t,e),"permanently delete a custom field definition"),{name:"list_withholding_tax_codes",description:"List withholding tax codes (industry classification codes for PH/SG compliance). Returns full list (no pagination).",params:{},required:[],group:"tax_profiles",readOnly:!0,searchHint:"list withholding tax WHT codes",isConcurrencySafe:!0,maxResultSizeChars:5e4,execute:async t=>wL(t.client)},Vt({name:"search_tax_profiles",description:"Search tax profiles. Use appliesToSale / appliesToPurchase filters to scope by transaction type.",group:"tax_profiles",fields:cS,defaults:lS,fetcher:Nb,searchHint:"find tax profiles GST VAT WHT by name tax type code applicability sale purchase"}),wi("get_tax_profile","Get full tax profile details including tax rate, type code, and status.","tax_profiles",(t,e)=>vL(t,e),"get tax profile details rate code"),{name:"update_tax_profile",description:"Update an existing tax profile (name, rate, or status).",params:{resourceId:{type:"string",description:"Tax profile resourceId"},name:Rue,taxRate:{type:"number"},status:{type:"string",enum:["ACTIVE","INACTIVE"],description:"Status (ACTIVE or INACTIVE)"}},required:["resourceId"],group:"tax_profiles",readOnly:!1,searchHint:"update tax profile name rate details",execute:async(t,e)=>IL(t.client,e.resourceId,{name:e.name,taxRate:e.taxRate,status:e.status})},{name:"create_claim_type",description:"Create a claim type (expense category for employee claims). Dedups by name.",params:{name:{type:"string",description:"Claim type name (unique per org)"},expenseAccountResourceId:{type:"string",description:"Default expense CoA resourceId"},taxProfileResourceId:{type:"string",description:"Default tax profile resourceId"},classifierConfig:{type:"string",description:"Magic OCR classifier defaults (JSON string)"},isDefault:{type:"boolean",description:"Make org default (sweeps prior default)"}},required:["name"],group:"claim_types",readOnly:!1,searchHint:"create claim type expense category",execute:async(t,e)=>{let r=e.name,n=await iM(t.client,r);return n?{_guard:"duplicate_skipped",message:`Claim type "${r}" already exists.`,existing:n}:kL(t.client,{name:r,expenseAccountResourceId:e.expenseAccountResourceId,taxProfileResourceId:e.taxProfileResourceId,classifierConfig:e.classifierConfig,isDefault:e.isDefault})}},{name:"update_claim_type",description:"Update a claim type. Omitted fields unchanged; clearFields NULLs optional fields.",params:{resourceId:{type:"string",description:"Claim type resourceId"},name:{type:"string",description:"New name"},expenseAccountResourceId:{type:"string",description:"Default expense CoA resourceId"},taxProfileResourceId:{type:"string",description:"Default tax profile resourceId"},classifierConfig:{type:"string",description:"Classifier defaults (JSON string)"},isDefault:{type:"boolean",description:"Make org default"},clearFields:{type:"array",items:{type:"string",enum:[...eD]},description:"Optional fields to NULL (clear)"}},required:["resourceId"],group:"claim_types",readOnly:!1,searchHint:"update claim type",execute:async(t,e)=>NL(t.client,e.resourceId,{name:e.name,expenseAccountResourceId:e.expenseAccountResourceId,taxProfileResourceId:e.taxProfileResourceId,classifierConfig:e.classifierConfig,isDefault:e.isDefault,...ty(e.clearFields,eD)})},Vt({name:"search_claim_types",description:"Search claim types.",group:"claim_types",fields:VD,defaults:JD,fetcher:Ob,searchHint:"find claim types by name default expense account tax profile"}),dr("list_claim_types","List claim types (alphabetical).","claim_types",(t,e,r)=>xL(t,{offset:e,limit:r}),"list claim types"),wi("get_claim_type","Get a claim type incl. nested expense account + tax profile.","claim_types",(t,e)=>TL(t,e),"get claim type details"),xi("delete_claim_type","Soft-delete a claim type (name becomes reusable).","claim_types",(t,e)=>FL(t,e),"delete claim type"),{name:"create_claim_profile",description:"Create a claim profile (per-employee policy bundle: approver, limits, visible types, balance account). Dedups by name. taxMode EXCLUSIVE is rejected.",params:{name:{type:"string",description:"Profile name (unique per org)"},approverUserResourceId:{type:"string",description:"Default approver user resourceId"},visibleClaimTypeIds:{type:"array",items:{type:"string"},description:"Allowed claim type IDs"},visibleTaxProfileIds:{type:"array",items:{type:"string"},description:"Allowed tax profile IDs"},visibleClassifierIds:{type:"array",items:{type:"string"},description:"Allowed classifier IDs"},visibleVendorResourceIds:{type:"array",items:{type:"string"},description:"Allowed vendor contact IDs (free-text vendors always allowed)"},allowedCurrencies:{type:"array",items:{type:"string"},description:"Allowed ISO currency codes (null = no restriction)"},minClaimAmount:{type:"number",description:"Min claim total (<= max)"},maxClaimAmount:{type:"number",description:"Max claim total"},maxPerPeriodAmount:{type:"number",description:"Per-period spend cap (requires perPeriod)"},perPeriod:{type:"string",enum:[...tD],description:"Per-period window"},employeeBalanceAccountResourceId:{type:"string",description:"Per-employee liability (CURRENT_LIABILITY) CoA resourceId; required for reimbursement conversion"},digestEmailEnabled:{type:"boolean",description:"Enable digest email for employees on this profile"},taxMode:{type:"string",enum:[...S7],description:"Tax policy (NO_TAX or INCLUSIVE)"},isDefault:{type:"boolean",description:"Make org default"}},required:["name"],group:"claim_profiles",readOnly:!1,searchHint:"create claim profile policy approver limits",execute:async(t,e)=>{let r=e.name,n=await oM(t.client,r);return n?{_guard:"duplicate_skipped",message:`Claim profile "${r}" already exists.`,existing:n}:ML(t.client,{name:r,approverUserResourceId:e.approverUserResourceId,visibleClaimTypeIds:e.visibleClaimTypeIds,visibleTaxProfileIds:e.visibleTaxProfileIds,visibleClassifierIds:e.visibleClassifierIds,visibleVendorResourceIds:e.visibleVendorResourceIds,allowedCurrencies:e.allowedCurrencies,minClaimAmount:e.minClaimAmount,maxClaimAmount:e.maxClaimAmount,maxPerPeriodAmount:e.maxPerPeriodAmount,perPeriod:e.perPeriod,employeeBalanceAccountResourceId:e.employeeBalanceAccountResourceId,digestEmailEnabled:e.digestEmailEnabled,taxMode:e.taxMode,isDefault:e.isDefault})}},{name:"update_claim_profile",description:"Update a claim profile. Omitted fields unchanged; clearFields NULLs optional fields. Balance account cannot change while an employee has a non-zero balance.",params:{resourceId:{type:"string",description:"Claim profile resourceId"},name:{type:"string",description:"New name"},approverUserResourceId:{type:"string",description:"Default approver user resourceId"},visibleClaimTypeIds:{type:"array",items:{type:"string"},description:"Allowed claim type IDs (replaces)"},visibleTaxProfileIds:{type:"array",items:{type:"string"},description:"Allowed tax profile IDs (replaces)"},visibleClassifierIds:{type:"array",items:{type:"string"},description:"Allowed classifier IDs (replaces)"},visibleVendorResourceIds:{type:"array",items:{type:"string"},description:"Allowed vendor contact IDs (replaces)"},allowedCurrencies:{type:"array",items:{type:"string"},description:"Allowed ISO currency codes (replaces)"},minClaimAmount:{type:"number",description:"Min claim total"},maxClaimAmount:{type:"number",description:"Max claim total"},maxPerPeriodAmount:{type:"number",description:"Per-period spend cap"},perPeriod:{type:"string",enum:[...tD],description:"Per-period window"},employeeBalanceAccountResourceId:{type:"string",description:"Employee balance CoA resourceId"},digestEmailEnabled:{type:"boolean",description:"Digest email enabled"},taxMode:{type:"string",enum:[...S7],description:"Tax policy (NO_TAX or INCLUSIVE)"},isDefault:{type:"boolean",description:"Make org default"},clearFields:{type:"array",items:{type:"string",enum:[...rD]},description:"Optional fields to NULL (clear)"}},required:["resourceId"],group:"claim_profiles",readOnly:!1,searchHint:"update claim profile policy limits",execute:async(t,e)=>PL(t.client,e.resourceId,{name:e.name,approverUserResourceId:e.approverUserResourceId,visibleClaimTypeIds:e.visibleClaimTypeIds,visibleTaxProfileIds:e.visibleTaxProfileIds,visibleClassifierIds:e.visibleClassifierIds,visibleVendorResourceIds:e.visibleVendorResourceIds,allowedCurrencies:e.allowedCurrencies,minClaimAmount:e.minClaimAmount,maxClaimAmount:e.maxClaimAmount,maxPerPeriodAmount:e.maxPerPeriodAmount,perPeriod:e.perPeriod,employeeBalanceAccountResourceId:e.employeeBalanceAccountResourceId,digestEmailEnabled:e.digestEmailEnabled,taxMode:e.taxMode,isDefault:e.isDefault,...ty(e.clearFields,rD)})},Vt({name:"search_claim_profiles",description:"Search claim profiles.",group:"claim_profiles",fields:WD,defaults:ZD,fetcher:Qb,searchHint:"find claim profiles by name approver default limits balance account"}),dr("list_claim_profiles","List claim profiles (alphabetical).","claim_profiles",(t,e,r)=>QL(t,{offset:e,limit:r}),"list claim profiles"),wi("get_claim_profile","Get a claim profile incl. nested balance account.","claim_profiles",(t,e)=>LL(t,e),"get claim profile details"),xi("delete_claim_profile","Soft-delete a claim profile.","claim_profiles",(t,e)=>UL(t,e),"delete claim profile"),{name:"create_posting_rule",description:"Create a posting rule (how approved claims group into journals at conversion). outerAxis + innerAxis + lineDescriptionTemplate required. Dedups by name.",params:{name:{type:"string",description:"Rule name (unique per org)"},outerAxis:{type:"string",enum:[...iD],description:"Outer grouping axis"},innerAxis:{type:"string",enum:[...oD],description:"Inner line-aggregation axis"},lineDescriptionTemplate:{type:"string",description:'Handlebars line template, e.g. "{employeeName} - {claimType}"'},journalReferenceTemplate:{type:"string",description:"Optional Handlebars journal-header reference template"},defaultBankAccountResourceId:{type:"string",description:"Default reimbursement bank (Cash/Bank) account resourceId"},defaultIncludeReimbursementPayout:{type:"boolean",description:"Create reimbursement DCE by default"},isDefault:{type:"boolean",description:"Make org default rule"}},required:["name","outerAxis","innerAxis","lineDescriptionTemplate"],group:"posting_rules",readOnly:!1,searchHint:"create posting rule claim conversion grouping",execute:async(t,e)=>{let r=e.name,n=await sM(t.client,r);return n?{_guard:"duplicate_skipped",message:`Posting rule "${r}" already exists.`,existing:n}:jL(t.client,{name:r,outerAxis:e.outerAxis,innerAxis:e.innerAxis,lineDescriptionTemplate:e.lineDescriptionTemplate,journalReferenceTemplate:e.journalReferenceTemplate,defaultBankAccountResourceId:e.defaultBankAccountResourceId,defaultIncludeReimbursementPayout:e.defaultIncludeReimbursementPayout,isDefault:e.isDefault})}},{name:"update_posting_rule",description:"Update a posting rule. Omitted fields unchanged.",params:{resourceId:{type:"string",description:"Posting rule resourceId"},name:{type:"string",description:"New name"},outerAxis:{type:"string",enum:[...iD],description:"Outer grouping axis"},innerAxis:{type:"string",enum:[...oD],description:"Inner line-aggregation axis"},lineDescriptionTemplate:{type:"string",description:"Handlebars line template"},journalReferenceTemplate:{type:"string",description:"Journal-header reference template"},defaultBankAccountResourceId:{type:"string",description:"Default reimbursement bank account resourceId"},defaultIncludeReimbursementPayout:{type:"boolean",description:"Create reimbursement DCE by default"},isDefault:{type:"boolean",description:"Make org default rule"}},required:["resourceId"],group:"posting_rules",readOnly:!1,searchHint:"update posting rule",execute:async(t,e)=>YL(t.client,e.resourceId,{name:e.name,outerAxis:e.outerAxis,innerAxis:e.innerAxis,lineDescriptionTemplate:e.lineDescriptionTemplate,journalReferenceTemplate:e.journalReferenceTemplate,defaultBankAccountResourceId:e.defaultBankAccountResourceId,defaultIncludeReimbursementPayout:e.defaultIncludeReimbursementPayout,isDefault:e.isDefault})},Vt({name:"search_posting_rules",description:"Search posting rules.",group:"posting_rules",fields:XD,defaults:KD,fetcher:Lb,searchHint:"find posting rules by name axis default bank reimbursement"}),dr("list_posting_rules","List posting rules (alphabetical).","posting_rules",(t,e,r)=>$L(t,{offset:e,limit:r}),"list posting rules"),wi("get_posting_rule","Get a posting rule.","posting_rules",(t,e)=>qL(t,e),"get posting rule details"),xi("delete_posting_rule","Delete a posting rule. The org default cannot be deleted while default (set another default first).","posting_rules",(t,e)=>HL(t,e),"delete posting rule"),Vt({name:"search_claims",description:'Search/list employee-expense claims. Status: DRAFT|SUBMITTED|APPROVED|CONVERTED|REJECTED|CANCELLED (CONVERTED = "Processed"). Claims are born via create_claim, attachment, or conversion (no bare list \u2014 use search).',group:"claims",fields:YD,defaults:HD,fetcher:IM,searchHint:"find employee expense claims by status employee contact reference date amount"}),wi("get_claim","Get a claim incl. line items, employee, amounts, status.","claims",(t,e)=>wM(t,e),"get claim details line items"),{name:"create_claim",description:"Create an employee-expense claim directly (bare create, no attachment). Vendor is EITHER contactResourceId OR vendorName, never both. saveAsDraft defaults to true (lands DRAFT with relaxed line validation); set false to validate + submit in one call (lands SUBMITTED).",params:{valueDate:{type:"string",description:"Business-transaction date (YYYY-MM-DD)"},currencyCode:{type:"string",description:"Claim currency (ISO 4217)"},saveAsDraft:{type:"boolean",description:"true (default) creates DRAFT; false validates + submits"},employeeResourceId:{type:"string",description:"Employee resourceId the claim is filed for"},contactResourceId:{type:"string",description:"Vendor contact resourceId (mutually exclusive with vendorName)"},vendorName:{type:"string",description:"Free-text vendor name (mutually exclusive with contactResourceId)"},reference:{type:"string",description:"User reference"},currencySymbol:{type:"string",description:"Currency symbol override"},taxInclusion:{type:"boolean",description:"Line amounts are tax-inclusive"},tags:{type:"array",items:{type:"string"},description:"Header-level tags"},internalNotes:{type:"string",description:"Internal notes (max 1000)"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId (defaults to org default)"},approverUserResourceId:{type:"string",description:"Approver user resourceId"},customFields:Bi,claimItems:Qrt},required:["valueDate","currencyCode"],group:"claims",readOnly:!1,searchHint:"create new employee expense claim draft vendor employee line items submit",execute:async(t,e)=>_M(t.client,{valueDate:e.valueDate,currencyCode:e.currencyCode,saveAsDraft:e.saveAsDraft,employeeResourceId:e.employeeResourceId,contactResourceId:e.contactResourceId,vendorName:e.vendorName,reference:e.reference,currencySymbol:e.currencySymbol,taxInclusion:e.taxInclusion,tags:e.tags,internalNotes:e.internalNotes,claimProfileResourceId:e.claimProfileResourceId,approverUserResourceId:e.approverUserResourceId,customFields:e.customFields,claimItems:e.claimItems})},{name:"update_claim",description:"Update a DRAFT claim (partial \u2014 omitted fields unchanged). claimItems non-empty REPLACES all lines, [] clears. Set saveAsDraft=false to validate + submit in one call. Only DRAFT claims are editable.",params:{resourceId:{type:"string",description:"Claim resourceId"},saveAsDraft:{type:"boolean",description:"true (default) keeps editing; false validates + submits"},employeeResourceId:{type:"string",description:"Employee resourceId"},contactResourceId:{type:"string",description:"Vendor contact resourceId (mutually exclusive with vendorName)"},vendorName:{type:"string",description:"Free-text vendor name (mutually exclusive with contactResourceId)"},valueDate:{type:"string",description:"Business-transaction date (YYYY-MM-DD)"},reference:{type:"string",description:"User reference"},currencyCode:{type:"string",description:"Claim currency (ISO 4217)"},taxInclusion:{type:"boolean",description:"Line amounts are tax-inclusive"},tags:{type:"array",items:{type:"string"},description:"Header-level tags"},internalNotes:{type:"string",description:"Internal notes (max 1000)"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId"},approverUserResourceId:{type:"string",description:"Approver user resourceId"},customFields:Bi,claimItems:Qrt},required:["resourceId"],group:"claims",readOnly:!1,searchHint:"edit draft claim line items employee reference submit",execute:async(t,e)=>DM(t.client,e.resourceId,{saveAsDraft:e.saveAsDraft,employeeResourceId:e.employeeResourceId,contactResourceId:e.contactResourceId,vendorName:e.vendorName,valueDate:e.valueDate,reference:e.reference,currencyCode:e.currencyCode,taxInclusion:e.taxInclusion,tags:e.tags,internalNotes:e.internalNotes,claimProfileResourceId:e.claimProfileResourceId,approverUserResourceId:e.approverUserResourceId,customFields:e.customFields,claimItems:e.claimItems})},xi("delete_claim","Delete a claim. Only DRAFT / REJECTED / CANCELLED claims are deletable (else 422).","claims",(t,e)=>SM(t,e),"delete remove claim record"),{name:"delete_claim_attachment",description:"Remove one attachment (receipt) from a claim. Returns the updated claim.",params:{resourceId:{type:"string",description:"Claim resourceId"},attachmentResourceId:{type:"string",description:"Attachment resourceId"}},required:["resourceId","attachmentResourceId"],group:"claims",readOnly:!1,isDestructive:!0,searchHint:"remove delete claim attachment receipt",execute:async(t,e)=>RM(t.client,e.resourceId,e.attachmentResourceId)},xue("submit_claim","Submit a DRAFT claim for approval (DRAFT \u2192 SUBMITTED). Server enforces the transition.","claims",(t,e)=>BM(t,e),{searchHint:"submit draft claim for approval"}),xue("approve_claim","Approve a SUBMITTED claim (SUBMITTED \u2192 APPROVED). Approved claims become convertible to journals.","claims",(t,e)=>xM(t,e),{searchHint:"approve submitted claim"}),{name:"reject_claim",description:"Reject a SUBMITTED/APPROVED claim with a reason (\u2192 REJECTED).",params:{resourceId:{type:"string",description:"Claim resourceId"},rejectionReason:{type:"string",description:"Rejection reason (1-1000 chars)"}},required:["resourceId","rejectionReason"],group:"claims",readOnly:!1,isDestructive:!0,searchHint:"reject claim with reason",execute:async(t,e)=>TM(t.client,e.resourceId,e.rejectionReason)},{name:"cancel_claim",description:"Cancel a DRAFT/SUBMITTED claim with a reason (\u2192 CANCELLED).",params:{resourceId:{type:"string",description:"Claim resourceId"},cancellationReason:{type:"string",description:"Cancellation reason (1-1000 chars)"}},required:["resourceId","cancellationReason"],group:"claims",readOnly:!1,isDestructive:!0,searchHint:"cancel claim with reason",execute:async(t,e)=>kM(t.client,e.resourceId,e.cancellationReason)},xue("unpost_claim","Unpost a CONVERTED claim \u2014 reverses the journal conversion back to APPROVED.","claims",(t,e)=>NM(t,e),{destructive:!0,searchHint:"unpost reverse converted claim conversion"}),{name:"bulk_submit_claims",description:"Bulk-submit DRAFT claims (ASYNC). Returns a job handle {jobId,...}; poll search_background_jobs by jobId for per-item results. Max 500 ids.",params:{resourceIds:Gx},required:["resourceIds"],group:"claim_processing",readOnly:!1,searchHint:"bulk submit many claims async job",execute:async(t,e)=>FM(t.client,e.resourceIds)},{name:"bulk_approve_claims",description:"Bulk-approve SUBMITTED claims (ASYNC). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx},required:["resourceIds"],group:"claim_processing",readOnly:!1,searchHint:"bulk approve many claims async job",execute:async(t,e)=>OM(t.client,e.resourceIds)},{name:"bulk_reject_claims",description:"Bulk-reject claims with one shared reason (ASYNC). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx,rejectionReason:{type:"string",description:"Reason applied to the whole batch (1-1000 chars)"}},required:["resourceIds","rejectionReason"],group:"claim_processing",readOnly:!1,isDestructive:!0,searchHint:"bulk reject many claims async job reason",execute:async(t,e)=>LM(t.client,e.resourceIds,e.rejectionReason)},{name:"bulk_cancel_claims",description:"Bulk-cancel claims with one shared reason (ASYNC). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx,cancellationReason:{type:"string",description:"Reason applied to the whole batch (1-1000 chars)"}},required:["resourceIds","cancellationReason"],group:"claim_processing",readOnly:!1,isDestructive:!0,searchHint:"bulk cancel many claims async job reason",execute:async(t,e)=>MM(t.client,e.resourceIds,e.cancellationReason)},{name:"bulk_delete_claims",description:"Bulk-delete claims (ASYNC; only DRAFT/REJECTED/CANCELLED are deletable). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx},required:["resourceIds"],group:"claim_processing",readOnly:!1,isDestructive:!0,searchHint:"bulk delete many claims async job",execute:async(t,e)=>QM(t.client,e.resourceIds)},{name:"get_claim_tracking_tags",description:"List the tracking-tag values available across claims (picker; returns a bare array).",params:{},required:[],group:"claim_processing",readOnly:!0,isConcurrencySafe:!0,searchHint:"list claim tracking tags picker",execute:async t=>PM(t.client)},{name:"get_claim_custom_field_values",description:"List the custom-field values available across claims (picker; returns a bare array).",params:{},required:[],group:"claim_processing",readOnly:!0,isConcurrencySafe:!0,searchHint:"list claim custom field values picker",execute:async t=>UM(t.client)},{name:"preview_claims_conversion",description:"Preview the journals an APPROVED claim batch would produce at conversion \u2014 no write. Returns expenseSubTotal, previewJournals, and reimbursement DCE counts; non-APPROVED claims come back under erroredClaims (check it is empty before converting). Needs a default posting rule or an explicit postingRuleResourceId.",params:{claimResourceIds:{type:"array",items:{type:"string"},description:"APPROVED claim resourceIds (1-500)"},postingRuleResourceId:{type:"string",description:"Posting rule resourceId (null \u2192 org default rule)"},payoutFlow:{type:"string",enum:[...Qx],description:"POST (journals only) or POST_AND_RECORD (+ books-only reimbursement DCE)"},includeReimbursementPayout:{type:"boolean",description:"Include per-employee reimbursement DCE lines"},bankAccountResourceId:{type:"string",description:"Reimbursement bank account for preview validation"}},required:["claimResourceIds"],group:"claim_processing",readOnly:!0,isConcurrencySafe:!0,searchHint:"preview claim conversion journals before posting",execute:async(t,e)=>_H(t.client,{claimResourceIds:e.claimResourceIds,postingRuleResourceId:e.postingRuleResourceId,payoutFlow:e.payoutFlow,includeReimbursementPayout:e.includeReimbursementPayout,bankAccountResourceId:e.bankAccountResourceId})},{name:"convert_claims_to_journal",description:"Convert an APPROVED claim batch into journals (atomic write). valueDate (YYYY-MM-DD) required. Preview first and confirm erroredClaims is empty. idempotencyKey is auto-generated for safe retries (pass your own to dedup across calls). includeReimbursementPayout adds a books-only reimbursement DCE \u2014 real-money disburse is intentionally not exposed.",params:{claimResourceIds:{type:"array",items:{type:"string"},description:"APPROVED claim resourceIds (1-500)"},valueDate:{type:"string",description:"Journal value date (YYYY-MM-DD)"},postingRuleResourceId:{type:"string",description:"Posting rule resourceId (null \u2192 org default rule)"},includeReimbursementPayout:{type:"boolean",description:"Create books-only reimbursement DCEs"},bankAccountResourceIdOverride:{type:"string",description:"Override the rule default reimbursement bank account"},contactResourceId:{type:"string",description:"Clearing contact for the reimbursement DCE cash-out"},idempotencyKey:{type:"string",description:"Optional retry-dedup token (must not start with CONV: / CONV-); auto-generated if omitted"}},required:["claimResourceIds","valueDate"],group:"claim_processing",readOnly:!1,searchHint:"convert post approved claims to journal entries",execute:async(t,e)=>DH(t.client,{claimResourceIds:e.claimResourceIds,valueDate:e.valueDate,postingRuleResourceId:e.postingRuleResourceId,includeReimbursementPayout:e.includeReimbursementPayout,bankAccountResourceIdOverride:e.bankAccountResourceIdOverride,contactResourceId:e.contactResourceId,idempotencyKey:e.idempotencyKey||mbr()})},{name:"record_employee_payout",description:"Record a books-only employee payout (reimbursement or advance) \u2014 a DCE, no real-money transfer. amount, paymentAccountResourceId and valueDate are required; reference auto-generated if omitted.",params:{employeeResourceId:{type:"string",description:"Employee resourceId"},amount:{type:"number",description:"Payout amount (> 0)"},paymentAccountResourceId:{type:"string",description:"Bank/cash account the DCE credits"},valueDate:{type:"string",description:"Value date (YYYY-MM-DD)"},payoutFor:{type:"string",enum:[...urt],description:"Classification (null \u2192 ADVANCE)"},currencyCode:{type:"string",description:"Settle currency (ISO 4217; omit \u2192 payment account currency)"},reference:{type:"string",description:"Payout reference (auto-generated if omitted)"},description:{type:"string",description:"Line description on the DCE"},internalNotes:{type:"string",description:"Internal notes"}},required:["employeeResourceId","amount","paymentAccountResourceId","valueDate"],group:"claim_processing",readOnly:!1,searchHint:"record employee reimbursement advance payout books-only DCE",execute:async(t,e)=>SH(t.client,{employeeResourceId:e.employeeResourceId,amount:e.amount,paymentAccountResourceId:e.paymentAccountResourceId,valueDate:e.valueDate,payoutFor:e.payoutFor,currencyCode:e.currencyCode,reference:e.reference||Pa("EP"),description:e.description,internalNotes:e.internalNotes})},Vt({name:"search_employee_payouts",description:"Search recorded employee payouts (reimbursements + advances).",group:"claim_processing",fields:zD,defaults:GD,fetcher:RH,searchHint:"find employee payouts reimbursements advances by employee reference status type"}),{name:"add_employee",description:"Create an employee (expense-claim member). The server requires userResourceId (a login user to bind \u2014 binding is PERMANENT) and a claim profile (the org default applies if omitted). Dedups by email.",params:{name:{type:"string",description:"Employee display name"},userResourceId:{type:"string",description:"Login user to bind (UUID) \u2014 required; permanent once set"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId (defaults to org default if omitted)"},email:{type:"string",description:"Work email (per-org unique)"},phone:{type:"string",description:"Phone (per-org unique)"},managerEmployeeResourceId:{type:"string",description:"Manager employee resourceId"},defaultApproverUserResourceId:{type:"string",description:"Default approver user resourceId"},active:{type:"boolean",description:"Active flag (default true)"},employmentType:{type:"string",enum:[..._A],description:"Employment classification"}},required:["name","userResourceId"],group:"employees",readOnly:!1,searchHint:"create add employee claim member bind user",execute:async(t,e)=>{let r=e.email;if(r){let n=await aM(t.client,r);if(n)return{_guard:"duplicate_skipped",message:`Employee with email "${r}" already exists.`,existing:n}}return VL(t.client,{name:e.name,userResourceId:e.userResourceId,claimProfileResourceId:e.claimProfileResourceId,email:r,phone:e.phone,managerEmployeeResourceId:e.managerEmployeeResourceId,defaultApproverUserResourceId:e.defaultApproverUserResourceId,active:e.active,employmentType:e.employmentType})}},{name:"update_employee",description:"Update an employee (partial; omit = no change). To ARCHIVE, set active=false (reversible \u2014 prefer over delete_employee). userResourceId is NOT editable here \u2014 use bind_employee_user. Set clearEmploymentType to unset the classification.",params:{resourceId:{type:"string",description:"Employee resourceId"},name:{type:"string",description:"New name"},email:{type:"string",description:'Work email ("" clears it)'},phone:{type:"string",description:"Phone"},managerEmployeeResourceId:{type:"string",description:"Manager employee resourceId"},defaultApproverUserResourceId:{type:"string",description:"Default approver user resourceId"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId"},active:{type:"boolean",description:"Active flag \u2014 set false to archive"},employmentType:{type:"string",enum:[..._A],description:"Employment classification"},clearEmploymentType:{type:"boolean",description:"Clear the classification back to unclassified"}},required:["resourceId"],group:"employees",readOnly:!1,searchHint:"update edit archive employee active claim profile",execute:async(t,e)=>JL(t.client,e.resourceId,{name:e.name,email:e.email,phone:e.phone,managerEmployeeResourceId:e.managerEmployeeResourceId,defaultApproverUserResourceId:e.defaultApproverUserResourceId,claimProfileResourceId:e.claimProfileResourceId,active:e.active,employmentType:e.employmentType,clearEmploymentType:e.clearEmploymentType})},Vt({name:"search_employees",description:"Search employees by name, email, phone, manager, claim profile, active, currency.",group:"employees",fields:eS,defaults:tS,fetcher:Mb,searchHint:"find employees claim members by name email manager profile active"}),Vt({name:"search_employee_balances",description:"Search the employee-balance directory (per-currency reimbursement balances owed).",group:"employees",fields:rS,defaults:nS,fetcher:zL,searchHint:"employee reimbursement balances owed by currency employment type"}),wi("get_employee","Get an employee incl. claim profile + user binding.","employees",(t,e)=>GL(t,e),"get employee details binding balance"),xi("delete_employee","Delete an employee (server validates they are settled). Prefer update_employee active=false to archive reversibly.","employees",(t,e)=>WL(t,e),"delete remove employee"),{name:"bind_employee_user",description:"Bind a login user to an employee. ONE-WAY and PERMANENT once set \u2014 cannot be changed later.",params:{resourceId:{type:"string",description:"Employee resourceId"},userResourceId:{type:"string",description:"Login user resourceId to bind"}},required:["resourceId","userResourceId"],group:"employees",readOnly:!1,isDestructive:!0,searchHint:"bind link login user to employee",execute:async(t,e)=>ZL(t.client,e.resourceId,e.userResourceId)},{name:"preprocess_employees_file",description:"Preprocess an uploaded employee import sheet (CSV/XLSX) \u2014 returns a parsed row preview to review before import_employees. Provide the sheet fileUrl.",params:{fileUrl:{type:"string",description:"URL of the uploaded employee sheet"},fileName:{type:"string",description:"Display file name"},fileType:{type:"string",enum:["CSV","EML","HEIC","JPEG","JPG","PDF","PNG","TEXT","XLS","XLSX"],description:"File type (use CSV / XLS / XLSX for employee sheets)"}},required:["fileUrl"],group:"employees",readOnly:!0,isConcurrencySafe:!0,searchHint:"preprocess preview employee import sheet csv xlsx",execute:async(t,e)=>XL(t.client,{fileUrl:e.fileUrl,fileName:e.fileName,fileType:e.fileType})},{name:"import_employees",description:"Bulk create/update/delete employees from resolved rows (max 100 per array). Server validates rows synchronously (422 with row errors) then queues an async job \u2014 poll search_background_jobs by jobId. Create rows need a bound user + claim profile.",params:{create:{type:"array",description:"Create rows",items:{type:"object",properties:{name:{type:"string"},email:{type:"string"},userResourceId:{type:"string"},claimProfileResourceId:{type:"string"},employmentType:{type:"string",enum:[..._A]},managerEmployeeResourceId:{type:"string"},active:{type:"boolean"}}}},update:{type:"array",description:"Update rows (each needs employeeResourceId)",items:{type:"object",properties:{employeeResourceId:{type:"string"},name:{type:"string"},email:{type:"string"},employmentType:{type:"string",enum:[..._A]},active:{type:"boolean"}}}},delete:{type:"array",description:"Delete rows (each needs employeeResourceId)",items:{type:"object",properties:{employeeResourceId:{type:"string"}}}}},required:[],group:"employees",readOnly:!1,isDestructive:!0,searchHint:"bulk import employees create update delete sheet async",execute:async(t,e)=>KL(t.client,{create:e.create,update:e.update,delete:e.delete})},dr("list_inventory_items","List inventory-tracked items with stock details, COGS accounts, and purchase/sale accounts.","inventory",(t,e,r)=>nz(t,{limit:r,offset:e}),"list inventory items stock levels quantities"),{name:"get_inventory_balance",description:"Get current inventory balance for a specific item \u2014 quantity on hand, average cost, base unit.",params:{itemResourceId:{type:"string",description:"Item resourceId"}},required:["itemResourceId"],group:"inventory",readOnly:!0,searchHint:"get inventory balance stock level for item",isConcurrencySafe:!0,maxResultSizeChars:2e4,execute:async(t,e)=>oz(t.client,e.itemResourceId)},{name:"create_inventory_item",description:"Create a new inventory-tracked item. Requires itemCode, name, costingMethod (FIXED or WAC), cogsResourceId, and account links. Use --input for full JSON body.",params:{itemCode:{type:"string",description:"Unique item code (SKU)"},name:{type:"string",description:"Item name"},unit:{type:"string",description:'Unit of measure (e.g., "pcs", "kg")'},costingMethod:{type:"string",enum:["FIXED","WAC"],description:"Costing method: FIXED or WAC"},cogsResourceId:{type:"string",description:"COGS account resourceId (required)"},purchaseAccountResourceId:{type:"string",description:"Purchase account resourceId (required if cogsResourceId set)"},saleAccountResourceId:{type:"string",description:"Sale account resourceId (required if cogsResourceId set)"},appliesToSale:{type:"boolean",description:"Whether item applies to sales (required if cogsResourceId set)"},appliesToPurchase:{type:"boolean",description:"Whether item applies to purchases (required if cogsResourceId set)"},blockInsufficientDeductions:{type:"boolean",description:"Block transactions when insufficient stock (default: false)"}},required:["itemCode","name","costingMethod","cogsResourceId"],group:"inventory",readOnly:!1,searchHint:"create new inventory tracked stock item",execute:async(t,e)=>{let r={itemCode:e.itemCode,name:e.name,costingMethod:e.costingMethod,cogsResourceId:e.cogsResourceId,blockInsufficientDeductions:e.blockInsufficientDeductions??!1};return e.unit&&(r.unit=e.unit),e.purchaseAccountResourceId&&(r.purchaseAccountResourceId=e.purchaseAccountResourceId),e.saleAccountResourceId&&(r.saleAccountResourceId=e.saleAccountResourceId),e.appliesToSale!==void 0&&(r.appliesToSale=e.appliesToSale),e.appliesToPurchase!==void 0&&(r.appliesToPurchase=e.appliesToPurchase),iz(t.client,r)}},xi("delete_contact","Delete a contact. Cannot delete contacts with existing transactions.","contacts",(t,e)=>K1(t,e),"permanently delete a customer supplier contact"),xi("delete_account","Delete a chart of accounts entry. Cannot delete accounts with existing transactions.","accounts",(t,e)=>uM(t,e),"permanently delete a chart of accounts entry"),wi("get_cash_transfer","Get full cash transfer details by resourceId.","cash_transfers",(t,e)=>UY(t,e),"get cash transfer details between accounts"),{name:"download_credit_note_pdf",description:"Download a customer credit note as PDF. Returns a file URL.",params:{resourceId:{type:"string",description:"Customer credit note resourceId"}},required:["resourceId"],group:"customer_credit_notes",readOnly:!0,searchHint:"download customer credit note as PDF file",isConcurrencySafe:!0,execute:async(t,e)=>YP(t.client,e.resourceId)},{name:"get_transaction_summary",description:`Get a complete summary of any transaction \u2014 fetches the transaction, its attachments, and payment history in one call.
|
|
828
|
+
- printOnDocuments controls whether the field appears on PDFs.`,params:{name:{type:"string",description:'Field name (e.g., "PO Number", "Cost Center")'},description:{type:"string",description:"Field description"},printOnDocuments:{type:"boolean",description:"Show on PDF documents (default false)"},appliesTo:{type:"object",description:"Which transaction types: { invoices: true, bills: true, customerCredits: true, supplierCredits: true, payments: true }"},fieldType:{type:"string",description:'Field type (e.g., "TEXT", "NUMBER", "DATE") \u2014 legacy param'},entityType:{type:"string",description:"Entity type \u2014 legacy param"}},required:["name"],group:"custom_fields",readOnly:!1,searchHint:"create new custom field for transactions",execute:async(t,e)=>lz(t.client,e)},{name:"update_custom_field",description:"Update a custom field definition. Can change name, description, printOnDocuments, and appliesTo flags.",params:{resourceId:{type:"string",description:"Custom field resourceId"},name:{type:"string",description:"New field name"},description:{type:"string",description:"New description"},printOnDocuments:{type:"boolean",description:"Show on PDF documents"},appliesTo:{type:"object",description:"Which transaction types: { invoices, bills, customerCredits, supplierCredits, payments }"}},required:["resourceId"],group:"custom_fields",readOnly:!1,searchHint:"update custom field name type settings",execute:async(t,e)=>{let{resourceId:r,...n}=e;return uz(t.client,r,n)}},xi("delete_custom_field","Delete a custom field. Removes it from all future transactions.","custom_fields",(t,e)=>dz(t,e),"permanently delete a custom field definition"),{name:"list_withholding_tax_codes",description:"List withholding tax codes (industry classification codes for PH/SG compliance). Returns full list (no pagination).",params:{},required:[],group:"tax_profiles",readOnly:!0,searchHint:"list withholding tax WHT codes",isConcurrencySafe:!0,maxResultSizeChars:5e4,execute:async t=>wL(t.client)},Vt({name:"search_tax_profiles",description:"Search tax profiles. Use appliesToSale / appliesToPurchase filters to scope by transaction type.",group:"tax_profiles",fields:cS,defaults:lS,fetcher:Nb,searchHint:"find tax profiles GST VAT WHT by name tax type code applicability sale purchase"}),wi("get_tax_profile","Get full tax profile details including tax rate, type code, and status.","tax_profiles",(t,e)=>vL(t,e),"get tax profile details rate code"),{name:"update_tax_profile",description:"Update an existing tax profile (name, rate, or status).",params:{resourceId:{type:"string",description:"Tax profile resourceId"},name:Rue,taxRate:{type:"number"},status:{type:"string",enum:["ACTIVE","INACTIVE"],description:"Status (ACTIVE or INACTIVE)"}},required:["resourceId"],group:"tax_profiles",readOnly:!1,searchHint:"update tax profile name rate details",execute:async(t,e)=>IL(t.client,e.resourceId,{name:e.name,taxRate:e.taxRate,status:e.status})},{name:"create_claim_type",description:"Create a claim type (expense category for employee claims). Dedups by name.",params:{name:{type:"string",description:"Claim type name (unique per org)"},expenseAccountResourceId:{type:"string",description:"Default expense CoA resourceId"},taxProfileResourceId:{type:"string",description:"Default tax profile resourceId"},classifierConfig:{type:"string",description:"Magic OCR classifier defaults (JSON string)"},isDefault:{type:"boolean",description:"Make org default (sweeps prior default)"}},required:["name"],group:"claim_types",readOnly:!1,searchHint:"create claim type expense category",execute:async(t,e)=>{let r=e.name,n=await iM(t.client,r);return n?{_guard:"duplicate_skipped",message:`Claim type "${r}" already exists.`,existing:n}:kL(t.client,{name:r,expenseAccountResourceId:e.expenseAccountResourceId,taxProfileResourceId:e.taxProfileResourceId,classifierConfig:e.classifierConfig,isDefault:e.isDefault})}},{name:"update_claim_type",description:"Update a claim type. Omitted fields unchanged; clearFields NULLs optional fields.",params:{resourceId:{type:"string",description:"Claim type resourceId"},name:{type:"string",description:"New name"},expenseAccountResourceId:{type:"string",description:"Default expense CoA resourceId"},taxProfileResourceId:{type:"string",description:"Default tax profile resourceId"},classifierConfig:{type:"string",description:"Classifier defaults (JSON string)"},isDefault:{type:"boolean",description:"Make org default"},clearFields:{type:"array",items:{type:"string",enum:[...eD]},description:"Optional fields to NULL (clear)"}},required:["resourceId"],group:"claim_types",readOnly:!1,searchHint:"update claim type",execute:async(t,e)=>NL(t.client,e.resourceId,{name:e.name,expenseAccountResourceId:e.expenseAccountResourceId,taxProfileResourceId:e.taxProfileResourceId,classifierConfig:e.classifierConfig,isDefault:e.isDefault,...ty(e.clearFields,eD)})},Vt({name:"search_claim_types",description:"Search claim types.",group:"claim_types",fields:VD,defaults:JD,fetcher:Ob,searchHint:"find claim types by name default expense account tax profile"}),dr("list_claim_types","List claim types (alphabetical).","claim_types",(t,e,r)=>xL(t,{offset:e,limit:r}),"list claim types"),wi("get_claim_type","Get a claim type incl. nested expense account + tax profile.","claim_types",(t,e)=>TL(t,e),"get claim type details"),xi("delete_claim_type","Soft-delete a claim type (name becomes reusable).","claim_types",(t,e)=>FL(t,e),"delete claim type"),{name:"create_claim_profile",description:"Create a claim profile (per-employee policy bundle: approver, limits, visible types, balance account). Dedups by name. taxMode EXCLUSIVE is rejected.",params:{name:{type:"string",description:"Profile name (unique per org)"},approverUserResourceId:{type:"string",description:"Default approver user resourceId"},visibleClaimTypeIds:{type:"array",items:{type:"string"},description:"Allowed claim type IDs"},visibleTaxProfileIds:{type:"array",items:{type:"string"},description:"Allowed tax profile IDs"},visibleClassifierIds:{type:"array",items:{type:"string"},description:"Allowed classifier IDs"},visibleVendorResourceIds:{type:"array",items:{type:"string"},description:"Allowed vendor contact IDs (free-text vendors always allowed)"},allowedCurrencies:{type:"array",items:{type:"string"},description:"Allowed ISO currency codes (null = no restriction)"},minClaimAmount:{type:"number",description:"Min claim total (<= max)"},maxClaimAmount:{type:"number",description:"Max claim total"},maxPerPeriodAmount:{type:"number",description:"Per-period spend cap (requires perPeriod)"},perPeriod:{type:"string",enum:[...tD],description:"Per-period window"},employeeBalanceAccountResourceId:{type:"string",description:"Per-employee liability (CURRENT_LIABILITY) CoA resourceId; required for reimbursement conversion"},taxMode:{type:"string",enum:[...S7],description:"Tax policy (NO_TAX or INCLUSIVE)"},isDefault:{type:"boolean",description:"Make org default"}},required:["name"],group:"claim_profiles",readOnly:!1,searchHint:"create claim profile policy approver limits",execute:async(t,e)=>{let r=e.name,n=await oM(t.client,r);return n?{_guard:"duplicate_skipped",message:`Claim profile "${r}" already exists.`,existing:n}:ML(t.client,{name:r,approverUserResourceId:e.approverUserResourceId,visibleClaimTypeIds:e.visibleClaimTypeIds,visibleTaxProfileIds:e.visibleTaxProfileIds,visibleClassifierIds:e.visibleClassifierIds,visibleVendorResourceIds:e.visibleVendorResourceIds,allowedCurrencies:e.allowedCurrencies,minClaimAmount:e.minClaimAmount,maxClaimAmount:e.maxClaimAmount,maxPerPeriodAmount:e.maxPerPeriodAmount,perPeriod:e.perPeriod,employeeBalanceAccountResourceId:e.employeeBalanceAccountResourceId,taxMode:e.taxMode,isDefault:e.isDefault})}},{name:"update_claim_profile",description:"Update a claim profile. Omitted fields unchanged; clearFields NULLs optional fields. Balance account cannot change while an employee has a non-zero balance.",params:{resourceId:{type:"string",description:"Claim profile resourceId"},name:{type:"string",description:"New name"},approverUserResourceId:{type:"string",description:"Default approver user resourceId"},visibleClaimTypeIds:{type:"array",items:{type:"string"},description:"Allowed claim type IDs (replaces)"},visibleTaxProfileIds:{type:"array",items:{type:"string"},description:"Allowed tax profile IDs (replaces)"},visibleClassifierIds:{type:"array",items:{type:"string"},description:"Allowed classifier IDs (replaces)"},visibleVendorResourceIds:{type:"array",items:{type:"string"},description:"Allowed vendor contact IDs (replaces)"},allowedCurrencies:{type:"array",items:{type:"string"},description:"Allowed ISO currency codes (replaces)"},minClaimAmount:{type:"number",description:"Min claim total"},maxClaimAmount:{type:"number",description:"Max claim total"},maxPerPeriodAmount:{type:"number",description:"Per-period spend cap"},perPeriod:{type:"string",enum:[...tD],description:"Per-period window"},employeeBalanceAccountResourceId:{type:"string",description:"Employee balance CoA resourceId"},taxMode:{type:"string",enum:[...S7],description:"Tax policy (NO_TAX or INCLUSIVE)"},isDefault:{type:"boolean",description:"Make org default"},clearFields:{type:"array",items:{type:"string",enum:[...rD]},description:"Optional fields to NULL (clear)"}},required:["resourceId"],group:"claim_profiles",readOnly:!1,searchHint:"update claim profile policy limits",execute:async(t,e)=>PL(t.client,e.resourceId,{name:e.name,approverUserResourceId:e.approverUserResourceId,visibleClaimTypeIds:e.visibleClaimTypeIds,visibleTaxProfileIds:e.visibleTaxProfileIds,visibleClassifierIds:e.visibleClassifierIds,visibleVendorResourceIds:e.visibleVendorResourceIds,allowedCurrencies:e.allowedCurrencies,minClaimAmount:e.minClaimAmount,maxClaimAmount:e.maxClaimAmount,maxPerPeriodAmount:e.maxPerPeriodAmount,perPeriod:e.perPeriod,employeeBalanceAccountResourceId:e.employeeBalanceAccountResourceId,taxMode:e.taxMode,isDefault:e.isDefault,...ty(e.clearFields,rD)})},Vt({name:"search_claim_profiles",description:"Search claim profiles.",group:"claim_profiles",fields:WD,defaults:ZD,fetcher:Qb,searchHint:"find claim profiles by name approver default limits balance account"}),dr("list_claim_profiles","List claim profiles (alphabetical).","claim_profiles",(t,e,r)=>QL(t,{offset:e,limit:r}),"list claim profiles"),wi("get_claim_profile","Get a claim profile incl. nested balance account.","claim_profiles",(t,e)=>LL(t,e),"get claim profile details"),xi("delete_claim_profile","Soft-delete a claim profile.","claim_profiles",(t,e)=>UL(t,e),"delete claim profile"),{name:"create_posting_rule",description:"Create a posting rule (how approved claims group into journals at conversion). outerAxis + innerAxis + lineDescriptionTemplate required. Dedups by name.",params:{name:{type:"string",description:"Rule name (unique per org)"},outerAxis:{type:"string",enum:[...iD],description:"Outer grouping axis"},innerAxis:{type:"string",enum:[...oD],description:"Inner line-aggregation axis"},lineDescriptionTemplate:{type:"string",description:'Handlebars line template, e.g. "{employeeName} - {claimType}"'},journalReferenceTemplate:{type:"string",description:"Optional Handlebars journal-header reference template"},defaultBankAccountResourceId:{type:"string",description:"Default reimbursement bank (Cash/Bank) account resourceId"},defaultIncludeReimbursementPayout:{type:"boolean",description:"Create reimbursement DCE by default"},isDefault:{type:"boolean",description:"Make org default rule"}},required:["name","outerAxis","innerAxis","lineDescriptionTemplate"],group:"posting_rules",readOnly:!1,searchHint:"create posting rule claim conversion grouping",execute:async(t,e)=>{let r=e.name,n=await sM(t.client,r);return n?{_guard:"duplicate_skipped",message:`Posting rule "${r}" already exists.`,existing:n}:jL(t.client,{name:r,outerAxis:e.outerAxis,innerAxis:e.innerAxis,lineDescriptionTemplate:e.lineDescriptionTemplate,journalReferenceTemplate:e.journalReferenceTemplate,defaultBankAccountResourceId:e.defaultBankAccountResourceId,defaultIncludeReimbursementPayout:e.defaultIncludeReimbursementPayout,isDefault:e.isDefault})}},{name:"update_posting_rule",description:"Update a posting rule. Omitted fields unchanged.",params:{resourceId:{type:"string",description:"Posting rule resourceId"},name:{type:"string",description:"New name"},outerAxis:{type:"string",enum:[...iD],description:"Outer grouping axis"},innerAxis:{type:"string",enum:[...oD],description:"Inner line-aggregation axis"},lineDescriptionTemplate:{type:"string",description:"Handlebars line template"},journalReferenceTemplate:{type:"string",description:"Journal-header reference template"},defaultBankAccountResourceId:{type:"string",description:"Default reimbursement bank account resourceId"},defaultIncludeReimbursementPayout:{type:"boolean",description:"Create reimbursement DCE by default"},isDefault:{type:"boolean",description:"Make org default rule"}},required:["resourceId"],group:"posting_rules",readOnly:!1,searchHint:"update posting rule",execute:async(t,e)=>YL(t.client,e.resourceId,{name:e.name,outerAxis:e.outerAxis,innerAxis:e.innerAxis,lineDescriptionTemplate:e.lineDescriptionTemplate,journalReferenceTemplate:e.journalReferenceTemplate,defaultBankAccountResourceId:e.defaultBankAccountResourceId,defaultIncludeReimbursementPayout:e.defaultIncludeReimbursementPayout,isDefault:e.isDefault})},Vt({name:"search_posting_rules",description:"Search posting rules.",group:"posting_rules",fields:XD,defaults:KD,fetcher:Lb,searchHint:"find posting rules by name axis default bank reimbursement"}),dr("list_posting_rules","List posting rules (alphabetical).","posting_rules",(t,e,r)=>$L(t,{offset:e,limit:r}),"list posting rules"),wi("get_posting_rule","Get a posting rule.","posting_rules",(t,e)=>qL(t,e),"get posting rule details"),xi("delete_posting_rule","Delete a posting rule. The org default cannot be deleted while default (set another default first).","posting_rules",(t,e)=>HL(t,e),"delete posting rule"),Vt({name:"search_claims",description:'Search/list employee-expense claims. Status: DRAFT|SUBMITTED|APPROVED|CONVERTED|REJECTED|CANCELLED (CONVERTED = "Processed"). Claims are born via create_claim, attachment, or conversion (no bare list \u2014 use search).',group:"claims",fields:YD,defaults:HD,fetcher:IM,searchHint:"find employee expense claims by status employee contact reference date amount"}),wi("get_claim","Get a claim incl. line items, employee, amounts, status.","claims",(t,e)=>wM(t,e),"get claim details line items"),{name:"create_claim",description:"Create an employee-expense claim directly (bare create, no attachment). Vendor is EITHER contactResourceId OR vendorName, never both. saveAsDraft defaults to true (lands DRAFT with relaxed line validation); set false to validate + submit in one call (lands SUBMITTED).",params:{valueDate:{type:"string",description:"Business-transaction date (YYYY-MM-DD)"},currencyCode:{type:"string",description:"Claim currency (ISO 4217)"},saveAsDraft:{type:"boolean",description:"true (default) creates DRAFT; false validates + submits"},employeeResourceId:{type:"string",description:"Employee resourceId the claim is filed for"},contactResourceId:{type:"string",description:"Vendor contact resourceId (mutually exclusive with vendorName)"},vendorName:{type:"string",description:"Free-text vendor name (mutually exclusive with contactResourceId)"},reference:{type:"string",description:"User reference"},currencySymbol:{type:"string",description:"Currency symbol override"},taxInclusion:{type:"boolean",description:"Line amounts are tax-inclusive"},tags:{type:"array",items:{type:"string"},description:"Header-level tags"},internalNotes:{type:"string",description:"Internal notes (max 1000)"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId (defaults to org default)"},approverUserResourceId:{type:"string",description:"Approver user resourceId"},customFields:Bi,claimItems:Qrt},required:["valueDate","currencyCode"],group:"claims",readOnly:!1,searchHint:"create new employee expense claim draft vendor employee line items submit",execute:async(t,e)=>_M(t.client,{valueDate:e.valueDate,currencyCode:e.currencyCode,saveAsDraft:e.saveAsDraft,employeeResourceId:e.employeeResourceId,contactResourceId:e.contactResourceId,vendorName:e.vendorName,reference:e.reference,currencySymbol:e.currencySymbol,taxInclusion:e.taxInclusion,tags:e.tags,internalNotes:e.internalNotes,claimProfileResourceId:e.claimProfileResourceId,approverUserResourceId:e.approverUserResourceId,customFields:e.customFields,claimItems:e.claimItems})},{name:"update_claim",description:"Update a DRAFT claim (partial \u2014 omitted fields unchanged). claimItems non-empty REPLACES all lines, [] clears. Set saveAsDraft=false to validate + submit in one call. Only DRAFT claims are editable.",params:{resourceId:{type:"string",description:"Claim resourceId"},saveAsDraft:{type:"boolean",description:"true (default) keeps editing; false validates + submits"},employeeResourceId:{type:"string",description:"Employee resourceId"},contactResourceId:{type:"string",description:"Vendor contact resourceId (mutually exclusive with vendorName)"},vendorName:{type:"string",description:"Free-text vendor name (mutually exclusive with contactResourceId)"},valueDate:{type:"string",description:"Business-transaction date (YYYY-MM-DD)"},reference:{type:"string",description:"User reference"},currencyCode:{type:"string",description:"Claim currency (ISO 4217)"},taxInclusion:{type:"boolean",description:"Line amounts are tax-inclusive"},tags:{type:"array",items:{type:"string"},description:"Header-level tags"},internalNotes:{type:"string",description:"Internal notes (max 1000)"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId"},approverUserResourceId:{type:"string",description:"Approver user resourceId"},customFields:Bi,claimItems:Qrt},required:["resourceId"],group:"claims",readOnly:!1,searchHint:"edit draft claim line items employee reference submit",execute:async(t,e)=>DM(t.client,e.resourceId,{saveAsDraft:e.saveAsDraft,employeeResourceId:e.employeeResourceId,contactResourceId:e.contactResourceId,vendorName:e.vendorName,valueDate:e.valueDate,reference:e.reference,currencyCode:e.currencyCode,taxInclusion:e.taxInclusion,tags:e.tags,internalNotes:e.internalNotes,claimProfileResourceId:e.claimProfileResourceId,approverUserResourceId:e.approverUserResourceId,customFields:e.customFields,claimItems:e.claimItems})},xi("delete_claim","Delete a claim. Only DRAFT / REJECTED / CANCELLED claims are deletable (else 422).","claims",(t,e)=>SM(t,e),"delete remove claim record"),{name:"delete_claim_attachment",description:"Remove one attachment (receipt) from a claim. Returns the updated claim.",params:{resourceId:{type:"string",description:"Claim resourceId"},attachmentResourceId:{type:"string",description:"Attachment resourceId"}},required:["resourceId","attachmentResourceId"],group:"claims",readOnly:!1,isDestructive:!0,searchHint:"remove delete claim attachment receipt",execute:async(t,e)=>RM(t.client,e.resourceId,e.attachmentResourceId)},xue("submit_claim","Submit a DRAFT claim for approval (DRAFT \u2192 SUBMITTED). Server enforces the transition.","claims",(t,e)=>BM(t,e),{searchHint:"submit draft claim for approval"}),xue("approve_claim","Approve a SUBMITTED claim (SUBMITTED \u2192 APPROVED). Approved claims become convertible to journals.","claims",(t,e)=>xM(t,e),{searchHint:"approve submitted claim"}),{name:"reject_claim",description:"Reject a SUBMITTED/APPROVED claim with a reason (\u2192 REJECTED).",params:{resourceId:{type:"string",description:"Claim resourceId"},rejectionReason:{type:"string",description:"Rejection reason (1-1000 chars)"}},required:["resourceId","rejectionReason"],group:"claims",readOnly:!1,isDestructive:!0,searchHint:"reject claim with reason",execute:async(t,e)=>TM(t.client,e.resourceId,e.rejectionReason)},{name:"cancel_claim",description:"Cancel a DRAFT/SUBMITTED claim with a reason (\u2192 CANCELLED).",params:{resourceId:{type:"string",description:"Claim resourceId"},cancellationReason:{type:"string",description:"Cancellation reason (1-1000 chars)"}},required:["resourceId","cancellationReason"],group:"claims",readOnly:!1,isDestructive:!0,searchHint:"cancel claim with reason",execute:async(t,e)=>kM(t.client,e.resourceId,e.cancellationReason)},xue("unpost_claim","Unpost a CONVERTED claim \u2014 reverses the journal conversion back to APPROVED.","claims",(t,e)=>NM(t,e),{destructive:!0,searchHint:"unpost reverse converted claim conversion"}),{name:"bulk_submit_claims",description:"Bulk-submit DRAFT claims (ASYNC). Returns a job handle {jobId,...}; poll search_background_jobs by jobId for per-item results. Max 500 ids.",params:{resourceIds:Gx},required:["resourceIds"],group:"claim_processing",readOnly:!1,searchHint:"bulk submit many claims async job",execute:async(t,e)=>FM(t.client,e.resourceIds)},{name:"bulk_approve_claims",description:"Bulk-approve SUBMITTED claims (ASYNC). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx},required:["resourceIds"],group:"claim_processing",readOnly:!1,searchHint:"bulk approve many claims async job",execute:async(t,e)=>OM(t.client,e.resourceIds)},{name:"bulk_reject_claims",description:"Bulk-reject claims with one shared reason (ASYNC). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx,rejectionReason:{type:"string",description:"Reason applied to the whole batch (1-1000 chars)"}},required:["resourceIds","rejectionReason"],group:"claim_processing",readOnly:!1,isDestructive:!0,searchHint:"bulk reject many claims async job reason",execute:async(t,e)=>LM(t.client,e.resourceIds,e.rejectionReason)},{name:"bulk_cancel_claims",description:"Bulk-cancel claims with one shared reason (ASYNC). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx,cancellationReason:{type:"string",description:"Reason applied to the whole batch (1-1000 chars)"}},required:["resourceIds","cancellationReason"],group:"claim_processing",readOnly:!1,isDestructive:!0,searchHint:"bulk cancel many claims async job reason",execute:async(t,e)=>MM(t.client,e.resourceIds,e.cancellationReason)},{name:"bulk_delete_claims",description:"Bulk-delete claims (ASYNC; only DRAFT/REJECTED/CANCELLED are deletable). Returns a job handle; poll search_background_jobs by jobId. Max 500 ids.",params:{resourceIds:Gx},required:["resourceIds"],group:"claim_processing",readOnly:!1,isDestructive:!0,searchHint:"bulk delete many claims async job",execute:async(t,e)=>QM(t.client,e.resourceIds)},{name:"get_claim_tracking_tags",description:"List the tracking-tag values available across claims (picker; returns a bare array).",params:{},required:[],group:"claim_processing",readOnly:!0,isConcurrencySafe:!0,searchHint:"list claim tracking tags picker",execute:async t=>PM(t.client)},{name:"get_claim_custom_field_values",description:"List the custom-field values available across claims (picker; returns a bare array).",params:{},required:[],group:"claim_processing",readOnly:!0,isConcurrencySafe:!0,searchHint:"list claim custom field values picker",execute:async t=>UM(t.client)},{name:"preview_claims_conversion",description:"Preview the journals an APPROVED claim batch would produce at conversion \u2014 no write. Returns expenseSubTotal, previewJournals, and reimbursement DCE counts; non-APPROVED claims come back under erroredClaims (check it is empty before converting). Needs a default posting rule or an explicit postingRuleResourceId.",params:{claimResourceIds:{type:"array",items:{type:"string"},description:"APPROVED claim resourceIds (1-500)"},postingRuleResourceId:{type:"string",description:"Posting rule resourceId (null \u2192 org default rule)"},payoutFlow:{type:"string",enum:[...Qx],description:"POST (journals only) or POST_AND_RECORD (+ books-only reimbursement DCE)"},includeReimbursementPayout:{type:"boolean",description:"Include per-employee reimbursement DCE lines"},bankAccountResourceId:{type:"string",description:"Reimbursement bank account for preview validation"}},required:["claimResourceIds"],group:"claim_processing",readOnly:!0,isConcurrencySafe:!0,searchHint:"preview claim conversion journals before posting",execute:async(t,e)=>_H(t.client,{claimResourceIds:e.claimResourceIds,postingRuleResourceId:e.postingRuleResourceId,payoutFlow:e.payoutFlow,includeReimbursementPayout:e.includeReimbursementPayout,bankAccountResourceId:e.bankAccountResourceId})},{name:"convert_claims_to_journal",description:"Convert an APPROVED claim batch into journals (atomic write). valueDate (YYYY-MM-DD) required. Preview first and confirm erroredClaims is empty. idempotencyKey is auto-generated for safe retries (pass your own to dedup across calls). includeReimbursementPayout adds a books-only reimbursement DCE \u2014 real-money disburse is intentionally not exposed.",params:{claimResourceIds:{type:"array",items:{type:"string"},description:"APPROVED claim resourceIds (1-500)"},valueDate:{type:"string",description:"Journal value date (YYYY-MM-DD)"},postingRuleResourceId:{type:"string",description:"Posting rule resourceId (null \u2192 org default rule)"},includeReimbursementPayout:{type:"boolean",description:"Create books-only reimbursement DCEs"},bankAccountResourceIdOverride:{type:"string",description:"Override the rule default reimbursement bank account"},contactResourceId:{type:"string",description:"Clearing contact for the reimbursement DCE cash-out"},idempotencyKey:{type:"string",description:"Optional retry-dedup token (must not start with CONV: / CONV-); auto-generated if omitted"}},required:["claimResourceIds","valueDate"],group:"claim_processing",readOnly:!1,searchHint:"convert post approved claims to journal entries",execute:async(t,e)=>DH(t.client,{claimResourceIds:e.claimResourceIds,valueDate:e.valueDate,postingRuleResourceId:e.postingRuleResourceId,includeReimbursementPayout:e.includeReimbursementPayout,bankAccountResourceIdOverride:e.bankAccountResourceIdOverride,contactResourceId:e.contactResourceId,idempotencyKey:e.idempotencyKey||mbr()})},{name:"record_employee_payout",description:"Record a books-only employee payout (reimbursement or advance) \u2014 a DCE, no real-money transfer. amount, paymentAccountResourceId and valueDate are required; reference auto-generated if omitted.",params:{employeeResourceId:{type:"string",description:"Employee resourceId"},amount:{type:"number",description:"Payout amount (> 0)"},paymentAccountResourceId:{type:"string",description:"Bank/cash account the DCE credits"},valueDate:{type:"string",description:"Value date (YYYY-MM-DD)"},payoutFor:{type:"string",enum:[...urt],description:"Classification (null \u2192 ADVANCE)"},currencyCode:{type:"string",description:"Settle currency (ISO 4217; omit \u2192 payment account currency)"},reference:{type:"string",description:"Payout reference (auto-generated if omitted)"},description:{type:"string",description:"Line description on the DCE"},internalNotes:{type:"string",description:"Internal notes"}},required:["employeeResourceId","amount","paymentAccountResourceId","valueDate"],group:"claim_processing",readOnly:!1,searchHint:"record employee reimbursement advance payout books-only DCE",execute:async(t,e)=>SH(t.client,{employeeResourceId:e.employeeResourceId,amount:e.amount,paymentAccountResourceId:e.paymentAccountResourceId,valueDate:e.valueDate,payoutFor:e.payoutFor,currencyCode:e.currencyCode,reference:e.reference||Pa("EP"),description:e.description,internalNotes:e.internalNotes})},Vt({name:"search_employee_payouts",description:"Search recorded employee payouts (reimbursements + advances).",group:"claim_processing",fields:zD,defaults:GD,fetcher:RH,searchHint:"find employee payouts reimbursements advances by employee reference status type"}),{name:"add_employee",description:"Create an employee (expense-claim member). The server requires userResourceId (a login user to bind \u2014 binding is PERMANENT) and a claim profile (the org default applies if omitted). Dedups by email.",params:{name:{type:"string",description:"Employee display name"},userResourceId:{type:"string",description:"Login user to bind (UUID) \u2014 required; permanent once set"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId (defaults to org default if omitted)"},email:{type:"string",description:"Work email (per-org unique)"},phone:{type:"string",description:"Phone (per-org unique)"},managerEmployeeResourceId:{type:"string",description:"Manager employee resourceId"},defaultApproverUserResourceId:{type:"string",description:"Default approver user resourceId"},active:{type:"boolean",description:"Active flag (default true)"},employmentType:{type:"string",enum:[..._A],description:"Employment classification"}},required:["name","userResourceId"],group:"employees",readOnly:!1,searchHint:"create add employee claim member bind user",execute:async(t,e)=>{let r=e.email;if(r){let n=await aM(t.client,r);if(n)return{_guard:"duplicate_skipped",message:`Employee with email "${r}" already exists.`,existing:n}}return VL(t.client,{name:e.name,userResourceId:e.userResourceId,claimProfileResourceId:e.claimProfileResourceId,email:r,phone:e.phone,managerEmployeeResourceId:e.managerEmployeeResourceId,defaultApproverUserResourceId:e.defaultApproverUserResourceId,active:e.active,employmentType:e.employmentType})}},{name:"update_employee",description:"Update an employee (partial; omit = no change). To ARCHIVE, set active=false (reversible \u2014 prefer over delete_employee). userResourceId is NOT editable here \u2014 use bind_employee_user. Set clearEmploymentType to unset the classification.",params:{resourceId:{type:"string",description:"Employee resourceId"},name:{type:"string",description:"New name"},email:{type:"string",description:'Work email ("" clears it)'},phone:{type:"string",description:"Phone"},managerEmployeeResourceId:{type:"string",description:"Manager employee resourceId"},defaultApproverUserResourceId:{type:"string",description:"Default approver user resourceId"},claimProfileResourceId:{type:"string",description:"Claim profile resourceId"},active:{type:"boolean",description:"Active flag \u2014 set false to archive"},employmentType:{type:"string",enum:[..._A],description:"Employment classification"},clearEmploymentType:{type:"boolean",description:"Clear the classification back to unclassified"}},required:["resourceId"],group:"employees",readOnly:!1,searchHint:"update edit archive employee active claim profile",execute:async(t,e)=>JL(t.client,e.resourceId,{name:e.name,email:e.email,phone:e.phone,managerEmployeeResourceId:e.managerEmployeeResourceId,defaultApproverUserResourceId:e.defaultApproverUserResourceId,claimProfileResourceId:e.claimProfileResourceId,active:e.active,employmentType:e.employmentType,clearEmploymentType:e.clearEmploymentType})},Vt({name:"search_employees",description:"Search employees by name, email, phone, manager, claim profile, active, currency.",group:"employees",fields:eS,defaults:tS,fetcher:Mb,searchHint:"find employees claim members by name email manager profile active"}),Vt({name:"search_employee_balances",description:"Search the employee-balance directory (per-currency reimbursement balances owed).",group:"employees",fields:rS,defaults:nS,fetcher:zL,searchHint:"employee reimbursement balances owed by currency employment type"}),wi("get_employee","Get an employee incl. claim profile + user binding.","employees",(t,e)=>GL(t,e),"get employee details binding balance"),xi("delete_employee","Delete an employee (server validates they are settled). Prefer update_employee active=false to archive reversibly.","employees",(t,e)=>WL(t,e),"delete remove employee"),{name:"bind_employee_user",description:"Bind a login user to an employee. ONE-WAY and PERMANENT once set \u2014 cannot be changed later.",params:{resourceId:{type:"string",description:"Employee resourceId"},userResourceId:{type:"string",description:"Login user resourceId to bind"}},required:["resourceId","userResourceId"],group:"employees",readOnly:!1,isDestructive:!0,searchHint:"bind link login user to employee",execute:async(t,e)=>ZL(t.client,e.resourceId,e.userResourceId)},{name:"preprocess_employees_file",description:"Preprocess an uploaded employee import sheet (CSV/XLSX) \u2014 returns a parsed row preview to review before import_employees. Provide the sheet fileUrl.",params:{fileUrl:{type:"string",description:"URL of the uploaded employee sheet"},fileName:{type:"string",description:"Display file name"},fileType:{type:"string",enum:["CSV","EML","HEIC","JPEG","JPG","PDF","PNG","TEXT","XLS","XLSX"],description:"File type (use CSV / XLS / XLSX for employee sheets)"}},required:["fileUrl"],group:"employees",readOnly:!0,isConcurrencySafe:!0,searchHint:"preprocess preview employee import sheet csv xlsx",execute:async(t,e)=>XL(t.client,{fileUrl:e.fileUrl,fileName:e.fileName,fileType:e.fileType})},{name:"import_employees",description:"Bulk create/update/delete employees from resolved rows (max 100 per array). Server validates rows synchronously (422 with row errors) then queues an async job \u2014 poll search_background_jobs by jobId. Create rows need a bound user + claim profile.",params:{create:{type:"array",description:"Create rows",items:{type:"object",properties:{name:{type:"string"},email:{type:"string"},userResourceId:{type:"string"},claimProfileResourceId:{type:"string"},employmentType:{type:"string",enum:[..._A]},managerEmployeeResourceId:{type:"string"},active:{type:"boolean"}}}},update:{type:"array",description:"Update rows (each needs employeeResourceId)",items:{type:"object",properties:{employeeResourceId:{type:"string"},name:{type:"string"},email:{type:"string"},employmentType:{type:"string",enum:[..._A]},active:{type:"boolean"}}}},delete:{type:"array",description:"Delete rows (each needs employeeResourceId)",items:{type:"object",properties:{employeeResourceId:{type:"string"}}}}},required:[],group:"employees",readOnly:!1,isDestructive:!0,searchHint:"bulk import employees create update delete sheet async",execute:async(t,e)=>KL(t.client,{create:e.create,update:e.update,delete:e.delete})},dr("list_inventory_items","List inventory-tracked items with stock details, COGS accounts, and purchase/sale accounts.","inventory",(t,e,r)=>nz(t,{limit:r,offset:e}),"list inventory items stock levels quantities"),{name:"get_inventory_balance",description:"Get current inventory balance for a specific item \u2014 quantity on hand, average cost, base unit.",params:{itemResourceId:{type:"string",description:"Item resourceId"}},required:["itemResourceId"],group:"inventory",readOnly:!0,searchHint:"get inventory balance stock level for item",isConcurrencySafe:!0,maxResultSizeChars:2e4,execute:async(t,e)=>oz(t.client,e.itemResourceId)},{name:"create_inventory_item",description:"Create a new inventory-tracked item. Requires itemCode, name, costingMethod (FIXED or WAC), cogsResourceId, and account links. Use --input for full JSON body.",params:{itemCode:{type:"string",description:"Unique item code (SKU)"},name:{type:"string",description:"Item name"},unit:{type:"string",description:'Unit of measure (e.g., "pcs", "kg")'},costingMethod:{type:"string",enum:["FIXED","WAC"],description:"Costing method: FIXED or WAC"},cogsResourceId:{type:"string",description:"COGS account resourceId (required)"},purchaseAccountResourceId:{type:"string",description:"Purchase account resourceId (required if cogsResourceId set)"},saleAccountResourceId:{type:"string",description:"Sale account resourceId (required if cogsResourceId set)"},appliesToSale:{type:"boolean",description:"Whether item applies to sales (required if cogsResourceId set)"},appliesToPurchase:{type:"boolean",description:"Whether item applies to purchases (required if cogsResourceId set)"},blockInsufficientDeductions:{type:"boolean",description:"Block transactions when insufficient stock (default: false)"}},required:["itemCode","name","costingMethod","cogsResourceId"],group:"inventory",readOnly:!1,searchHint:"create new inventory tracked stock item",execute:async(t,e)=>{let r={itemCode:e.itemCode,name:e.name,costingMethod:e.costingMethod,cogsResourceId:e.cogsResourceId,blockInsufficientDeductions:e.blockInsufficientDeductions??!1};return e.unit&&(r.unit=e.unit),e.purchaseAccountResourceId&&(r.purchaseAccountResourceId=e.purchaseAccountResourceId),e.saleAccountResourceId&&(r.saleAccountResourceId=e.saleAccountResourceId),e.appliesToSale!==void 0&&(r.appliesToSale=e.appliesToSale),e.appliesToPurchase!==void 0&&(r.appliesToPurchase=e.appliesToPurchase),iz(t.client,r)}},xi("delete_contact","Delete a contact. Cannot delete contacts with existing transactions.","contacts",(t,e)=>K1(t,e),"permanently delete a customer supplier contact"),xi("delete_account","Delete a chart of accounts entry. Cannot delete accounts with existing transactions.","accounts",(t,e)=>uM(t,e),"permanently delete a chart of accounts entry"),wi("get_cash_transfer","Get full cash transfer details by resourceId.","cash_transfers",(t,e)=>UY(t,e),"get cash transfer details between accounts"),{name:"download_credit_note_pdf",description:"Download a customer credit note as PDF. Returns a file URL.",params:{resourceId:{type:"string",description:"Customer credit note resourceId"}},required:["resourceId"],group:"customer_credit_notes",readOnly:!0,searchHint:"download customer credit note as PDF file",isConcurrencySafe:!0,execute:async(t,e)=>YP(t.client,e.resourceId)},{name:"get_transaction_summary",description:`Get a complete summary of any transaction \u2014 fetches the transaction, its attachments, and payment history in one call.
|
|
829
829
|
Works for invoices, bills, customer credit notes, supplier credit notes, and journals.`,params:{transactionType:{type:"string",enum:["invoice","bill","customer_credit_note","supplier_credit_note","journal"],description:"Transaction type"},resourceId:{type:"string",description:"Transaction resourceId"}},required:["transactionType","resourceId"],group:"search",readOnly:!0,searchHint:"get aggregated transaction counts totals by status",isConcurrencySafe:!0,maxResultSizeChars:2e4,execute:async(t,e)=>{let r=e.transactionType,n=e.resourceId,i=r==="invoice"?Is(t.client,n):r==="bill"?bs(t.client,n):r==="customer_credit_note"?El(t.client,n):r==="supplier_credit_note"?bl(t.client,n):yl(t.client,n),o=r==="invoice"?"invoices":r==="bill"?"bills":r==="customer_credit_note"?"customer-credit-notes":r==="supplier_credit_note"?"supplier-credit-notes":"journals",[s,a]=await Promise.all([i,ii(t.client,o,n)]),c;if(r==="invoice"||r==="bill")try{c=await Ox(t.client,{filter:{businessTransactionResourceId:{eq:n}},limit:100})}catch{}let u=a.data??[];return{transaction:s.data,attachments:u,attachmentCount:u.length,...c?{payments:c.data,paymentCount:c.totalElements}:{}}}},{name:"bulk_finalize_drafts",description:"Finalize multiple draft transactions in one call. Attempts finalization for each item and returns per-item pass/fail results. Supports invoices, bills, and credit notes.",params:{items:{type:"array",items:{type:"object",properties:{type:{type:"string",enum:["invoice","bill","customer_credit_note","supplier_credit_note"],description:"Transaction type"},resourceId:{type:"string",description:"Transaction resourceId"}},required:["type","resourceId"]},description:"Array of {type, resourceId} to finalize"}},required:["items"],group:"drafts",readOnly:!1,searchHint:"bulk finalize approve multiple draft transactions",isDestructive:!0,execute:async(t,e)=>{let r=e.items,n=[];for(let i of r)try{let o=await Jx(t.client,i.type,i.resourceId,{});i.type==="invoice"?await wS(t.client,i.resourceId,o):i.type==="bill"?await s_(t.client,i.resourceId,o):i.type==="customer_credit_note"?await NS(t.client,i.resourceId,o):i.type==="supplier_credit_note"&&await LS(t.client,i.resourceId,o),n.push({...i,success:!0})}catch(o){n.push({...i,success:!1,error:o instanceof Error?o.message:String(o)})}return{total:r.length,succeeded:n.filter(i=>i.success).length,failed:n.filter(i=>!i.success).length,results:n}}},{name:"bulk_invite_org_users",description:"Invite multiple users to the organization in one call. Accepts an array of user objects. Each user follows the same contract as invite_org_user. Returns per-user pass/fail results.",params:{users:{type:"array",items:{type:"object",properties:{email:{type:"string",description:"User email"},firstName:{type:"string",description:"First name"},lastName:{type:"string",description:"Last name"},userType:{type:"string",enum:[...BA],description:"ADMIN = full access (moduleRoles ignored). CUSTOM_USER = per-module access via moduleRoles."},moduleRoles:{type:"array",items:{type:"object",properties:{moduleName:{type:"string",enum:[...Vb]},roleCode:{type:"string",enum:[...RA]}},required:["moduleName","roleCode"]},description:"Use when userType is CUSTOM_USER; ignored for ADMIN."}},required:["email","firstName","lastName","userType"]},description:"Array of users to invite"}},required:["users"],group:"org_users",readOnly:!1,searchHint:"bulk invite multiple users to organization",execute:async(t,e)=>{let r=e.users,n=[];for(let i of r)try{let o=await hv(t.client,i);n.push({email:i.email,success:!0,resourceId:o.data?.resourceId})}catch(o){n.push({email:i.email,success:!1,error:o instanceof Error?o.message:String(o)})}return{total:r.length,succeeded:n.filter(i=>i.success).length,failed:n.filter(i=>!i.success).length,results:n}}},{name:"bulk_create_contacts",description:`Create multiple contacts in one call. Deduplicates against existing contacts (exact name match).
|
|
830
830
|
Returns per-contact result: created, skipped (duplicate), or failed.`,params:{contacts:{type:"array",items:{type:"object",properties:{billingName:{type:"string",description:"Official billing name"},name:{type:"string",description:"Display name"},email:{type:"string",description:"Primary email"},customer:{type:"boolean",description:"Is a customer"},supplier:{type:"boolean",description:"Is a supplier"}},required:["billingName"]},description:"Array of contacts to create"},skipDuplicates:{type:"boolean",description:"Skip contacts that match existing names (default true)"}},required:["contacts"],group:"contacts",readOnly:!1,searchHint:"bulk create multiple customer supplier contacts",execute:async(t,e)=>{let r=e.contacts,n=e.skipDuplicates??!0,i=[];for(let o of r)try{if(n){let a=await cD(t.client,o.name??o.billingName);if(a){i.push({billingName:o.billingName,status:"skipped",resourceId:a.resourceId});continue}}let s=await lb(t.client,{billingName:o.billingName,name:o.name??o.billingName,emails:o.email?[o.email]:void 0,customer:o.customer??!0,supplier:o.supplier??!1});i.push({billingName:o.billingName,status:"created",resourceId:s.data.resourceId})}catch(s){i.push({billingName:o.billingName,status:"failed",error:s instanceof Error?s.message:String(s)})}return{total:r.length,created:i.filter(o=>o.status==="created").length,skipped:i.filter(o=>o.status==="skipped").length,failed:i.filter(o=>o.status==="failed").length,results:i}}},{name:"quick_fix_transactions",description:`Bulk-update transactions of the same type. Only included fields change; omitted fields preserved.
|
|
831
831
|
|
|
@@ -1057,7 +1057,7 @@ clio() {
|
|
|
1057
1057
|
`))}process.exit(1)}await LS(o,n,d);let y=(await bl(o,n)).data,C=f.filter(E=>E!=="saveAsDraft"&&E!=="resourceId");i.json?console.log(JSON.stringify({finalized:!0,resourceId:y.resourceId,reference:y.reference||null,status:y.status,fieldsUpdated:C},null,2)):(console.log(Y(`
|
|
1058
1058
|
\u2713 Supplier credit note finalized: ${y.reference||y.resourceId}`)),console.log(R(" Status:"),y.status),C.length>0&&console.log(R(" Updated:"),C.join(", ")))})(i)),r.command("attachments <resourceId>").description("List attachments for a supplier credit note (URLs for agent inspection)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,i)=>L(async o=>{let a=(await bl(o,n)).data,u=(await ii(o,"supplier-credit-notes",n)).data;if(i.json)console.log(JSON.stringify({creditNoteResourceId:n,creditNoteReference:a.reference||null,attachments:u},null,2));else{if(u.length===0){console.log(`No attachments for supplier credit note ${a.reference||n}.`);return}console.log(R(`Attachments for ${a.reference||n}:
|
|
1059
1059
|
`));for(let d of u)console.log(` ${Se(d.resourceId)} ${d.fileName||"(unnamed)"}`),d.fileUrl&&console.log(` ${G(d.fileUrl)}`)}})(i)),e.command("bulk-upsert").description("Create or update supplier credit notes in bulk (max 500). Natural key: creditNoteReference. Returns a jobId \u2014 poll with `clio background-jobs get <jobId>`.").option("--input <file>","Read JSON body from file (or pipe via stdin with --input -)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(n,i)=>{let o=ve(i);o||(console.error('Error: --input <file> is required (JSON with { "supplierCreditNotes": [...] } or a bare array)'),process.exit(1));let s=o.supplierCreditNotes??o;Array.isArray(s)||(console.error('Error: expected { "supplierCreditNotes": [...] }'),process.exit(1)),s.length===0&&(console.error("Error: supplierCreditNotes array is empty."),process.exit(1)),s.length>500&&(console.error(`Error: max 500 per call (got ${s.length}). Split into batches.`),process.exit(1));let a=await XP(n,s);i.json?console.log(JSON.stringify(a.data,null,2)):(console.log(Y(`Bulk upsert started. Job ID: ${a.data.jobId}`)),console.log(Se(` Poll progress: clio background-jobs get ${a.data.jobId}`)))}))}Fe();o2();Et();Ut();var xnt=[{key:"currencyCode",header:"Code"},{key:"currencyName",header:"Name"},{key:"currencySymbol",header:"Symbol"},{key:"baseCurrency",header:"Base"}];function Tnt(t){let e=t.command("currencies").description("Manage organization currencies");e.command("list").description("List enabled currencies for the organization").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await PS(r),o={data:i.data,totalElements:i.data.length,totalPages:1,truncated:!1};$e(o,xnt,n,"Currencies")})),e.command("add <codes...>").description("Add currencies to the organization (e.g. clio currencies add EUR GBP)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=r.map(a=>a.toUpperCase()),s=await e2(i,o);if(n.json||n.format){let a=Array.isArray(s.data)?s.data:[s.data],c={data:a,totalElements:a.length,totalPages:1,truncated:!1};$e(c,xnt,n,"Currencies")}else console.log(Y(`Added currencies: ${o.join(", ")}`))})(n))}o2();Et();Ut();Qt();Fe();Tt();Er();var Lue=[{key:"resourceId",header:"ID",format:Te},{key:"rate",header:"Rate"},{key:"rateApplicableFrom",header:"From"},{key:"rateApplicableTo",header:"To"}];function knt(t){let e=t.command("currency-rates").description("Manage currency exchange rates");e.command("list <currencyCode>").description("List exchange rates for a currency").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=r.toUpperCase(),s=await Ye(n,a=>t2(i,o,a),{label:`Fetching ${o} rates`});$e(s,Lue,n,`${o} Rates`)})(n)),e.command("add <currencyCode>").description("Add an exchange rate for a currency").option("--rate <number>","Exchange rate",parseFloat).option("--from <YYYY-MM-DD>","Rate applicable from date").option("--to <YYYY-MM-DD>","Rate applicable to date (optional)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n)=>L(async i=>{Qe(n,[{flag:"--rate",key:"rate"},{flag:"--from",key:"from"}]);let o=r.toUpperCase(),s={rate:n.rate,rateApplicableFrom:n.from};n.to&&(s.rateApplicableTo=n.to);let a=await r2(i,o,s);if(n.json||n.format){let c={data:[a.data],totalElements:1,totalPages:1,truncated:!1};$e(c,Lue,n,`${o} Rates`)}else console.log(Y(`Rate added for ${o}: ${n.rate} (from ${n.from})`))})(n)),e.command("update <currencyCode> <rateResourceId>").description("Update an exchange rate").option("--rate <number>","Exchange rate",parseFloat).option("--from <YYYY-MM-DD>","Rate applicable from date").option("--to <YYYY-MM-DD>","Rate applicable to date (optional)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action((r,n,i)=>L(async o=>{Qe(i,[{flag:"--rate",key:"rate"},{flag:"--from",key:"from"}]);let s=r.toUpperCase(),a={rate:i.rate,rateApplicableFrom:i.from};i.to&&(a.rateApplicableTo=i.to);let c=await n2(o,s,n,a);if(i.json||i.format){let u={data:[c.data],totalElements:1,totalPages:1,truncated:!1};$e(u,Lue,i,`${s} Rates`)}else console.log(Y(`Rate updated for ${s}: ${i.rate}`))})(i)),e.command("bulk-upsert").description("Create exchange rates in bulk (max 500). Auto-enables currencies not yet in the org.").option("--input <file>","Read JSON body from file (or pipe via stdin with --input -)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i=ve(n);i||(console.error('Error: --input <file> is required (JSON with { "rates": [...] })'),process.exit(1));let o=i.rates??i;Array.isArray(o)||(console.error('Error: expected { "rates": [...] } or a JSON array'),process.exit(1)),o.length>500&&(console.error(`Error: max 500 rates per call (got ${o.length}). Split into batches.`),process.exit(1));let s=await i2(r,o);if(n.json)console.log(JSON.stringify(s.data,null,2));else{let a=s.data.resourceIds??[];console.log(Y(`${a.length} rate(s) upserted.`)),a.forEach(c=>console.log(` ${c}`))}}))}Uh();Et();Ut();Qt();Fe();import{readFileSync as Rbr}from"node:fs";import{basename as Nnt,extname as Bbr,resolve as xbr}from"node:path";var Tbr=[{key:"resourceId",header:"ID",format:Te},{key:"fileName",header:"File Name"}],af=["invoices","bills","journals","scheduled_journals","customer-credit-notes","supplier-credit-notes","sale-quotes","sale-orders","purchase-requests","purchase-orders"],kbr={".pdf":"application/pdf",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".csv":"text/csv",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"};function Fnt(t){let e=t.command("attachments").description("Manage transaction attachments");e.command("list").description("List attachments for a transaction").requiredOption("--type <type>",`Transaction type (${af.join(", ")})`).requiredOption("--id <resourceId>","Transaction resourceId").option("--api-key <key>","API key").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=n.type;af.includes(i)||(console.error(oe(`Invalid type. Use one of: ${af.join(", ")}`)),process.exit(1));let o=await ii(r,i,n.id),s=o.data??[],a={data:s,totalElements:o.totalElements??s.length,totalPages:o.totalPages??1,truncated:o.truncated??!1};$e(a,Tbr,n,"Attachments")})),e.command("add").description("Add an attachment to a transaction (file upload or URL download)").requiredOption("--type <type>",`Transaction type (${af.join(", ")})`).requiredOption("--id <resourceId>","Transaction resourceId").option("--file <path>","Local file path (PDF, PNG, JPG, etc.)").option("--url <url>","Download file from URL and attach").option("--attachment-id <id>","Link existing attachment by ID").option("--api-key <key>","API key").option("--json","Output as JSON").action(L(async(r,n)=>{let i=n.type;af.includes(i)||(console.error(oe(`Invalid type. Use one of: ${af.join(", ")}`)),process.exit(1)),!n.attachmentId&&!n.url&&!n.file&&(console.error(oe("Provide --file, --url, or --attachment-id")),process.exit(1)),n.attachmentId&&CH.includes(i)&&(console.error(oe(`link-by-id (--attachment-id) is not supported for order documents (${i}). Use --file or --url instead.`)),process.exit(1));let o,s;if(n.file){let c=xbr(n.file),u=Bbr(c).toLowerCase(),d=kbr[u]??"application/octet-stream",f=Rbr(c);o=new Blob([f],{type:d}),s=Nnt(c)}else if(n.url){let c=await fetch(n.url);c.ok||(console.error(oe(`Failed to download: ${c.status} ${c.statusText}`)),process.exit(1));let u=await c.arrayBuffer(),d=c.headers.get("content-type")??"application/octet-stream";o=new Blob([u],{type:d});let f=new URL(n.url).pathname;s=Nnt(f)||"attachment"}let a=await vH(r,{businessTransactionType:i,businessTransactionResourceId:n.id,file:o,fileName:s,attachmentId:n.attachmentId});n.json?console.log(JSON.stringify(a,null,2)):console.log(Y("Attachment added."))})),e.command("delete").description("Delete an attachment from a transaction").requiredOption("--type <type>",`Transaction type (${af.join(", ")})`).requiredOption("--id <resourceId>","Transaction resourceId").argument("<attachmentResourceId>","Attachment resourceId to delete").option("--api-key <key>","API key").option("--json","Output as JSON").action((r,n)=>{let i=n.type;return af.includes(i)||(console.error(oe(`Invalid type. Use one of: ${af.join(", ")}`)),process.exit(1)),L(async o=>{let s=await IH(o,i,n.id,r);n.json?console.log(JSON.stringify(s,null,2)):console.log(Y("Attachment deleted."))})(n)})}Fe();X_();uc();Et();Tt();Er();Ut();Qt();lr();var Ont=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"taxRate",header:"Rate (%)"},{key:"taxTypeCode",header:"Tax Type"}],Nbr=[{key:"code",header:"Code"},{key:"name",header:"Name"}];function Qnt(t){let e=t.command("tax-profiles").description("Manage tax profiles and tax types");e.command("list").description("List tax profiles").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>kb(r,o),{label:"Fetching tax profiles"});$e(i,Ont,n,"Tax Profiles")})),e.command("types").description("List available tax types (GST, VAT, WHT, etc.)").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>bL(r,o),{label:"Fetching tax types"});$e(i,Nbr,n,"Tax Types")})),e.command("get <resourceId>").description("Get a tax profile by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await vL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Rate:"),`${s.taxRate}%`),console.log(R("Tax Type:"),s.taxTypeCode))})(n)),Ge({parent:e,fields:cS,defaults:lS,fetcher:Nb,columns:Ont,label:"Searching tax profiles"}),e.command("update <resourceId>").description("Update a tax profile").option("--name <name>","New name").option("--rate <n>","New tax rate as percentage",be).option("--tax-type-code <code>","New tax type code").option("--status <status>","New status (ACTIVE, INACTIVE)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.rate!==void 0&&(o.taxRate=n.rate),n.taxTypeCode!==void 0&&(o.taxTypeCode=n.taxTypeCode),n.status!==void 0&&(o.status=n.status);let s=await IL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Tax profile updated: ${s.data.name}`))})(n)),e.command("wht-codes").description("List withholding tax codes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await wL(r);if(n.json)console.log(JSON.stringify(i.data,null,2));else{if(i.data.length===0){console.log("No withholding tax codes found.");return}console.log(R(`Withholding Tax Codes (${i.data.length}):
|
|
1060
|
-
`));for(let o of i.data)console.log(` ${Se(o.code??o.resourceId??"?")} ${o.description??""} ${G(o.countryCode??"")}`)}})),e.command("create").description("Create a new tax profile").option("--name <name>",'Tax profile name (e.g., "GST 9%")').option("--rate <n>","Tax rate as percentage (e.g., 9)",be).option("--tax-type-code <code>","Tax type code (from tax-profiles types)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"},{flag:"--rate",key:"rate"},{flag:"--tax-type-code",key:"taxTypeCode"}]);let i=await rM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Tax profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await CL(r,{name:n.name,taxRate:n.rate,taxTypeCode:n.taxTypeCode});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Tax profile created: ${n.name} (${n.rate}%)`)),console.log(R("ID:"),o.data.resourceId))}))}Fe();OL();BY();uc();Et();Tt();Er();Ut();Qt();lr();var Lnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"expenseAccountResourceId",header:"Expense Acct",format:Te}];function Mnt(t){let e=t.command("claim-types").description("Manage employee-expense claim types (expense categories)");e.command("list").description("List claim types").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>xL(r,o),{label:"Fetching claim types"});$e(i,Lnt,n,"Claim Types")})),e.command("get <resourceId>").description("Get a claim type by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await TL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.expenseAccount&&console.log(R("Expense Account:"),`${s.expenseAccount.code} ${s.expenseAccount.name}`),s.taxProfile&&console.log(R("Tax Profile:"),s.taxProfile.name))})(n)),Ge({parent:e,fields:VD,defaults:JD,fetcher:Ob,columns:Lnt,label:"Searching claim types"}),e.command("create").description("Create a claim type").option("--name <name>","Claim type name (unique per org)").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Magic OCR classifier defaults (JSON string)").option("--default","Make org default").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"}]);let i=await iM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim type "${n.name}" already exists (${i.resourceId}).`));return}let o=await kL(r,{name:n.name,expenseAccountResourceId:n.expenseAccount,taxProfileResourceId:n.taxProfile,classifierConfig:n.classifierConfig,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim type created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a claim type").option("--name <name>","New name").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Classifier defaults (JSON string)").option("--default","Make org default").option("--clear <fields>","Comma-separated optional fields to NULL (expenseAccountResourceId,taxProfileResourceId,classifierConfig)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.expenseAccount!==void 0&&(o.expenseAccountResourceId=n.expenseAccount),n.taxProfile!==void 0&&(o.taxProfileResourceId=n.taxProfile),n.classifierConfig!==void 0&&(o.classifierConfig=n.classifierConfig),n.default!==void 0&&(o.isDefault=n.default),Object.assign(o,ty(Co(n.clear),eD));let s=await NL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim type updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim type").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await FL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim type deleted: ${r}`))})(n))}Fe();nD();BY();uc();Et();Tt();Er();Ut();Qt();lr();var Pnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"taxMode",header:"Tax Mode"},{key:"employeeBalanceAccountResourceId",header:"Balance Acct",format:Te}];function Unt(t){let e={};return t.name!==void 0&&(e.name=t.name),t.approver!==void 0&&(e.approverUserResourceId=t.approver),t.visibleClaimTypes!==void 0&&(e.visibleClaimTypeIds=Co(t.visibleClaimTypes)),t.visibleTaxProfiles!==void 0&&(e.visibleTaxProfileIds=Co(t.visibleTaxProfiles)),t.visibleClassifiers!==void 0&&(e.visibleClassifierIds=Co(t.visibleClassifiers)),t.visibleVendors!==void 0&&(e.visibleVendorResourceIds=Co(t.visibleVendors)),t.allowedCurrencies!==void 0&&(e.allowedCurrencies=Co(t.allowedCurrencies)),t.minAmount!==void 0&&(e.minClaimAmount=t.minAmount),t.maxAmount!==void 0&&(e.maxClaimAmount=t.maxAmount),t.maxPerPeriod!==void 0&&(e.maxPerPeriodAmount=t.maxPerPeriod),t.perPeriod!==void 0&&(e.perPeriod=t.perPeriod),t.balanceAccount!==void 0&&(e.employeeBalanceAccountResourceId=t.balanceAccount),t.digestEmail!==void 0&&(e.digestEmailEnabled=t.digestEmail),t.taxMode!==void 0&&(e.taxMode=t.taxMode),t.default!==void 0&&(e.isDefault=t.default),e}function $nt(t){return t.option("--approver <id>","Default approver user resourceId").option("--visible-claim-types <ids>","Allowed claim type IDs (comma-separated)").option("--visible-tax-profiles <ids>","Allowed tax profile IDs (comma-separated)").option("--visible-classifiers <ids>","Allowed classifier IDs (comma-separated)").option("--visible-vendors <ids>","Allowed vendor contact IDs (comma-separated)").option("--allowed-currencies <codes>","Allowed ISO currency codes (comma-separated)").option("--min-amount <n>","Min claim total",ar).option("--max-amount <n>","Max claim total",ar).option("--max-per-period <n>","Per-period spend cap (requires --per-period)",ar).option("--per-period <window>","DAILY | WEEKLY | MONTHLY | QUARTERLY | YEARLY").option("--balance-account <id>","Employee balance (CURRENT_LIABILITY) account resourceId").option("--digest-email","Enable digest email").option("--tax-mode <mode>","NO_TAX | INCLUSIVE (EXCLUSIVE rejected)").option("--default","Make org default")}function qnt(t){let e=t.command("claim-profiles").description("Manage employee-expense claim profiles (per-employee policy bundles)");e.command("list").description("List claim profiles").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>QL(r,o),{label:"Fetching claim profiles"});$e(i,Pnt,n,"Claim Profiles")})),e.command("get <resourceId>").description("Get a claim profile by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await LL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.taxMode&&console.log(R("Tax mode:"),s.taxMode),s.employeeBalanceAccount&&console.log(R("Balance account:"),`${s.employeeBalanceAccount.code} ${s.employeeBalanceAccount.name}`))})(n)),Ge({parent:e,fields:WD,defaults:ZD,fetcher:Qb,columns:Pnt,label:"Searching claim profiles"}),$nt(e.command("create").description("Create a claim profile").option("--name <name>","Profile name (unique per org)")).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"}]);let i=await oM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await ML(r,Unt(n));n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim profile created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),$nt(e.command("update <resourceId>").description("Update a claim profile").option("--name <name>","New name")).option("--clear <fields>","Comma-separated optional fields to NULL (e.g. approverUserResourceId,perPeriod,taxMode)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=Unt(n);Object.assign(o,ty(Co(n.clear),rD));let s=await PL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim profile updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim profile").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await UL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim profile deleted: ${r}`))})(n))}Fe();sD();uc();Et();Tt();Er();Ut();Qt();lr();var jnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"outerAxis",header:"Outer"},{key:"innerAxis",header:"Inner"},{key:"isDefault",header:"Default"}];function Ynt(t){let e=t.command("posting-rules").description("Manage claim posting rules (how approved claims group into journals at conversion)");e.command("list").description("List posting rules").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>$L(r,o),{label:"Fetching posting rules"});$e(i,jnt,n,"Posting Rules")})),e.command("get <resourceId>").description("Get a posting rule by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await qL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Outer axis:"),s.outerAxis),console.log(R("Inner axis:"),s.innerAxis),console.log(R("Line template:"),s.lineDescriptionTemplate),console.log(R("Default:"),s.isDefault))})(n)),Ge({parent:e,fields:XD,defaults:KD,fetcher:Lb,columns:jnt,label:"Searching posting rules"}),e.command("create").description("Create a posting rule").option("--name <name>","Rule name (unique per org)").option("--outer-axis <axis>","PER_EMPLOYEE | PER_VENDOR | PER_PAIR | ONE_BATCH | PER_CLAIM").option("--inner-axis <axis>","RAW | BY_CT_TP_NC | BY_CT_TP_NC_EMPLOYEE | BY_CT_TP_NC_VENDOR").option("--line-template <tpl>",'Handlebars line template, e.g. "{employeeName} - {claimType}"').option("--journal-reference-template <tpl>","Optional journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout","Create reimbursement DCE by default").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"},{flag:"--outer-axis",key:"outerAxis"},{flag:"--inner-axis",key:"innerAxis"},{flag:"--line-template",key:"lineTemplate"}]);let i=await sM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Posting rule "${n.name}" already exists (${i.resourceId}).`));return}let o=await jL(r,{name:n.name,outerAxis:n.outerAxis,innerAxis:n.innerAxis,lineDescriptionTemplate:n.lineTemplate,journalReferenceTemplate:n.journalReferenceTemplate,defaultBankAccountResourceId:n.defaultBankAccount,defaultIncludeReimbursementPayout:n.defaultIncludePayout,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Posting rule created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a posting rule").option("--name <name>","New name").option("--outer-axis <axis>","Outer grouping axis").option("--inner-axis <axis>","Inner line-aggregation axis").option("--line-template <tpl>","Handlebars line template").option("--journal-reference-template <tpl>","Journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout <bool>","Create reimbursement DCE by default (true/false)").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.outerAxis!==void 0&&(o.outerAxis=n.outerAxis),n.innerAxis!==void 0&&(o.innerAxis=n.innerAxis),n.lineTemplate!==void 0&&(o.lineDescriptionTemplate=n.lineTemplate),n.journalReferenceTemplate!==void 0&&(o.journalReferenceTemplate=n.journalReferenceTemplate),n.defaultBankAccount!==void 0&&(o.defaultBankAccountResourceId=n.defaultBankAccount),n.defaultIncludePayout!==void 0&&(o.defaultIncludeReimbursementPayout=n.defaultIncludePayout==="true"),n.default!==void 0&&(o.isDefault=n.default);let s=await YL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Posting rule updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Delete a posting rule (the org default cannot be deleted while default)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await HL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Posting rule deleted: ${r}`))})(n))}Fe();$M();aue();cue();o_();wH();Et();Tt();Qt();Df();lr();import{randomUUID as Fbr}from"node:crypto";import{readFileSync as Hnt,statSync as Obr}from"node:fs";import{basename as Qbr,extname as Lbr,resolve as znt}from"node:path";var Mbr=[{key:"resourceId",header:"ID",format:Te},{key:"reference",header:"Reference"},{key:"status",header:"Status"},{key:"employeeResourceId",header:"Employee",format:Te},{key:"totalAmount",header:"Amount"},{key:"currencyCode",header:"Ccy"}];function Gnt(t){let e=t.command("claims").description("Employee-expense claims: search, edit drafts, lifecycle, bulk actions");Ge({parent:e,fields:YD,defaults:HD,fetcher:IM,columns:Mbr,label:"Searching claims"}),e.command("get <resourceId>").description("Get a claim by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>L(async c=>{let d=(await wM(c,s)).data;a.json?console.log(JSON.stringify(d,null,2)):(console.log(R("Reference:"),d.reference??"\u2014"),console.log(R("ID:"),d.resourceId),console.log(R("Status:"),d.status),console.log(R("Total:"),`${d.totalAmount??0} ${d.currencyCode??""}`),console.log(R("Lines:"),(d.claimItems??[]).length))})(a)),e.command("create").description("Create a claim directly (bare create). Vendor is EITHER --contact OR --vendor-name. --items / --custom-fields take a JSON array string.").requiredOption("--value-date <date>","Business-transaction date (YYYY-MM-DD)").requiredOption("--currency <code>","Claim currency (ISO 4217)").option("--reference <ref>","User reference").option("--employee <id>","Employee resourceId the claim is filed for").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency-symbol <symbol>","Currency symbol override").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(s=>L(async a=>{let c={valueDate:s.valueDate,currencyCode:s.currency};s.reference!==void 0&&(c.reference=s.reference),s.employee!==void 0&&(c.employeeResourceId=s.employee),s.contact!==void 0&&(c.contactResourceId=s.contact),s.vendorName!==void 0&&(c.vendorName=s.vendorName),s.currencySymbol!==void 0&&(c.currencySymbol=s.currencySymbol),s.internalNotes!==void 0&&(c.internalNotes=s.internalNotes),s.claimProfile!==void 0&&(c.claimProfileResourceId=s.claimProfile),s.approver!==void 0&&(c.approverUserResourceId=s.approver),s.tags!==void 0&&(c.tags=Co(s.tags)??[]),s.items!==void 0&&(c.claimItems=pu(s.items,"--items")),s.customFields!==void 0&&(c.customFields=pu(s.customFields,"--custom-fields")),s.submit&&(c.saveAsDraft=!1);let u=await _M(a,c);s.json?console.log(JSON.stringify(u.data,null,2)):console.log(Y(`Claim created: ${u.data.reference??u.data.resourceId} (${u.data.status})`))})(s)),e.command("update <resourceId>").description("Update a DRAFT claim (partial). --items / --custom-fields take a JSON array string.").option("--reference <ref>","User reference").option("--value-date <date>","Business-transaction date (YYYY-MM-DD)").option("--employee <id>","Employee resourceId").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency <code>","Claim currency (ISO 4217)").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array (REPLACES all lines)").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>L(async c=>{let u={};a.reference!==void 0&&(u.reference=a.reference),a.valueDate!==void 0&&(u.valueDate=a.valueDate),a.employee!==void 0&&(u.employeeResourceId=a.employee),a.contact!==void 0&&(u.contactResourceId=a.contact),a.vendorName!==void 0&&(u.vendorName=a.vendorName),a.currency!==void 0&&(u.currencyCode=a.currency),a.internalNotes!==void 0&&(u.internalNotes=a.internalNotes),a.claimProfile!==void 0&&(u.claimProfileResourceId=a.claimProfile),a.approver!==void 0&&(u.approverUserResourceId=a.approver),a.tags!==void 0&&(u.tags=Co(a.tags)??[]),a.items!==void 0&&(u.claimItems=pu(a.items,"--items")),a.customFields!==void 0&&(u.customFields=pu(a.customFields,"--custom-fields")),a.submit&&(u.saveAsDraft=!1);let d=await DM(c,s,u);a.json?console.log(JSON.stringify(d.data,null,2)):console.log(Y(`Claim updated: ${d.data.reference??d.data.resourceId} (${d.data.status})`))})(a)),e.command("delete <resourceId>").description("Delete a claim (only DRAFT / REJECTED / CANCELLED)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>L(async c=>{await SM(c,s),a.json?console.log(JSON.stringify({deleted:!0,resourceId:s})):console.log(Y(`Claim deleted: ${s}`))})(a)),e.command("delete-attachment <resourceId> <attachmentResourceId>").description("Remove one attachment from a claim").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a,c)=>L(async u=>{await RM(u,s,a),c.json?console.log(JSON.stringify({deleted:!0,resourceId:s,attachmentResourceId:a})):console.log(Y(`Attachment removed from claim ${s}`))})(c));let r=[["submit",BM,"Submit a DRAFT claim for approval"],["approve",xM,"Approve a SUBMITTED claim"],["unpost",NM,"Unpost a CONVERTED claim (reverse conversion)"]];for(let[s,a,c]of r)e.command(`${s} <resourceId>`).description(c).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>L(async f=>{let p=await a(f,u);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let n=[["reject",TM,"Reject a SUBMITTED/APPROVED claim"],["cancel",kM,"Cancel a DRAFT/SUBMITTED claim"]];for(let[s,a,c]of n)e.command(`${s} <resourceId>`).description(c).option("--reason <text>","Reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>L(async f=>{Qe(d,[{flag:"--reason",key:"reason"}]);let p=await a(f,u,d.reason);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}ed: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let i=[["bulk-submit",FM,"Bulk-submit DRAFT claims (async)"],["bulk-approve",OM,"Bulk-approve SUBMITTED claims (async)"],["bulk-delete",QM,"Bulk-delete DRAFT/REJECTED/CANCELLED claims (async)"]];for(let[s,a,c]of i)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(u,d)=>{Qe(d,[{flag:"--ids",key:"ids"}]);let f=await a(u,Co(d.ids)??[]);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));let o=[["bulk-reject",LM,"Bulk-reject claims (async)"],["bulk-cancel",MM,"Bulk-cancel claims (async)"]];for(let[s,a,c]of o)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--reason <text>","Shared reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(u,d)=>{Qe(d,[{flag:"--ids",key:"ids"},{flag:"--reason",key:"reason"}]);let f=await a(u,Co(d.ids)??[],d.reason);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));e.command("tracking-tags").description("List claim tracking-tag values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{let c=await PM(s);if(a.json)console.log(JSON.stringify(c,null,2));else{console.log(R(`Tracking tags (${c.length}):`));for(let u of c)console.log(` ${typeof u=="string"?u:JSON.stringify(u)}`)}})),e.command("custom-field-values").description("List claim custom-field values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{let c=await UM(s);a.json?console.log(JSON.stringify(c,null,2)):console.log(ke(c.length===0?"No custom field values.":`${c.length} custom field value(s).`))})),e.command("preview-conversion").description("Preview the journals an APPROVED claim batch would produce (no write)").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--payout-flow <flow>","POST | POST_AND_RECORD").option("--include-payout","Include reimbursement DCE lines").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{if(Qe(a,[{flag:"--ids",key:"ids"}]),a.payoutFlow!==void 0&&!Qx.includes(a.payoutFlow))throw new Error(`--payout-flow must be one of: ${Qx.join(", ")}`);let c=await _H(s,{claimResourceIds:Co(a.ids)??[],postingRuleResourceId:a.postingRule,payoutFlow:a.payoutFlow,includeReimbursementPayout:a.includePayout});console.log(JSON.stringify(c.data,null,2))})),e.command("convert").description("Convert an APPROVED claim batch into journals (atomic). Preview first.").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--value-date <date>","Journal value date (YYYY-MM-DD), required").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--include-payout","Create books-only reimbursement DCEs").option("--bank-account <id>","Override reimbursement bank account").option("--idempotency-key <key>","Retry-dedup token (auto-generated if omitted)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{Qe(a,[{flag:"--ids",key:"ids"},{flag:"--value-date",key:"valueDate"}]);let c=await DH(s,{claimResourceIds:Co(a.ids)??[],valueDate:a.valueDate,postingRuleResourceId:a.postingRule,includeReimbursementPayout:a.includePayout,bankAccountResourceIdOverride:a.bankAccount,idempotencyKey:a.idempotencyKey||Fbr()});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y("Claims converted to journals."))})),e.command("record-payout").description("Record a books-only employee payout (reimbursement / advance)").option("--employee <id>","Employee resourceId").option("--amount <n>","Payout amount (> 0)",ar).option("--payment-account <id>","Bank/cash account the DCE credits").option("--value-date <date>","Value date (YYYY-MM-DD)").option("--payout-for <type>","REIMBURSEMENT | ADVANCE (default ADVANCE)").option("--currency <code>","Settle currency (ISO 4217)").option("--reference <ref>","Payout reference (auto-generated if omitted)").option("--description <text>","DCE line description").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{Qe(a,[{flag:"--employee",key:"employee"},{flag:"--amount",key:"amount"},{flag:"--payment-account",key:"paymentAccount"},{flag:"--value-date",key:"valueDate"}]);let c=await SH(s,{employeeResourceId:a.employee,amount:a.amount,paymentAccountResourceId:a.paymentAccount,valueDate:a.valueDate,payoutFor:a.payoutFor,currencyCode:a.currency,reference:a.reference||Pa("EP"),description:a.description,internalNotes:a.internalNotes});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y(`Payout recorded: ${c.data.resourceId}`))})),Ge({parent:e,commandName:"payouts",fields:zD,defaults:GD,fetcher:RH,columns:[{key:"resourceId",header:"ID",format:Te},{key:"reference",header:"Reference"},{key:"employeeResourceId",header:"Employee",format:Te},{key:"amount",header:"Amount"},{key:"payoutType",header:"Type"}],label:"Searching employee payouts"}),e.command("from-attachment").description("Create a claim DRAFT from a receipt via AI extraction \u2014 a local file (--file), a remote URL (--source-url), or raw HTML (--html)").option("--file <path>","Local receipt file (PDF / JPG / PNG / HEIC / XLS / XLSX / EML)").option("--source-url <url>","Remote receipt file URL (alternative to --file)").option("--html <value>","Raw HTML (e.g. an email body) \u2014 inline or @path to read from a file").option("--contact <id>","Vendor contact resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--currency <code>","Currency override (ISO 4217)").option("--value-date <date>","Value date override (YYYY-MM-DD)").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{if([a.file,a.sourceUrl,a.html].filter(Boolean).length!==1)throw new Error("provide exactly one of --file / --source-url / --html.");let u,d;if(a.file){let h=znt(a.file),m=Lbr(h).toLowerCase();if(!ad.has(m))throw new Error(`unsupported file type "${m}". Supported: ${[...ad].join(", ")}`);let A=25*1024*1024,g=Obr(h).size;if(g>A)throw new Error(`file too large (${(g/1048576).toFixed(1)}MB > 25MB). Compress or split the receipt.`);u=new Blob([Hnt(h)],{type:Mm(m)}),d=Qbr(h)}let f;a.html&&(a.html.startsWith("@")||console.error(ke("Warning: passing HTML inline can leak invoice data into shell history \u2014 prefer --html @path.")),f=a.html.startsWith("@")?Hnt(znt(a.html.slice(1)),"utf8"):a.html);let p=await nb(s,{sourceFile:u,sourceFileName:d,sourceURL:a.sourceUrl,html:f,contactResourceId:a.contact,claimProfileResourceId:a.claimProfile,currencyCode:a.currency,valueDate:a.valueDate,internalNotes:a.internalNotes});console.log(JSON.stringify(p,null,2))}))}Fe();aD();uc();Et();Tt();Qt();lr();var Vnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"email",header:"Email"},{key:"employmentType",header:"Type"},{key:"active",header:"Active"}];function Jnt(t){let e=t.command("employees").description("Manage employees (expense-claim members): CRUD, balances, bind-user, import");Ge({parent:e,fields:eS,defaults:tS,fetcher:Mb,columns:Vnt,label:"Searching employees"}),Ge({parent:e,commandName:"balances",fields:rS,defaults:nS,fetcher:zL,columns:Vnt,label:"Searching employee balances"}),e.command("get <resourceId>").description("Get an employee by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await GL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Email:"),s.email??"\u2014"),console.log(R("Active:"),s.active),s.userBinding&&console.log(R("Bound user:"),`${s.userBinding.name??""} (${s.userBinding.status??""})`),s.claimProfile&&console.log(R("Claim profile:"),s.claimProfile.name))})(n)),e.command("create").description("Create an employee (requires --user to bind; binding is permanent)").option("--name <name>","Employee name").option("--user <id>","Login user resourceId to bind (required)").option("--claim-profile <id>","Claim profile resourceId (defaults to org default)").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--approver <id>","Default approver user resourceId").option("--employment-type <type>","FULL_TIME | PART_TIME | CONTRACTOR | INTERN | TEMPORARY | CONSULTANT").option("--inactive","Create as inactive").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{if(Qe(n,[{flag:"--name",key:"name"},{flag:"--user",key:"user"}]),n.email){let o=await aM(r,n.email);if(o){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:o},null,2)):console.log(ke(`Employee with email "${n.email}" already exists (${o.resourceId}).`));return}}let i=await VL(r,{name:n.name,userResourceId:n.user,claimProfileResourceId:n.claimProfile,email:n.email,phone:n.phone,managerEmployeeResourceId:n.manager,defaultApproverUserResourceId:n.approver,active:n.inactive?!1:void 0,employmentType:n.employmentType});n.json?console.log(JSON.stringify(i.data,null,2)):(console.log(Y(`Employee created: ${n.name}`)),console.log(R("ID:"),i.data.resourceId))})),e.command("update <resourceId>").description("Update an employee. Use --archive to deactivate (reversible).").option("--name <name>","New name").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--approver <id>","Default approver user resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--employment-type <type>","Employment classification").option("--archive","Set active=false (archive)").option("--activate","Set active=true").option("--clear-employment-type","Unset the classification").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o={};if(n.name!==void 0&&(o.name=n.name),n.email!==void 0&&(o.email=n.email),n.phone!==void 0&&(o.phone=n.phone),n.manager!==void 0&&(o.managerEmployeeResourceId=n.manager),n.approver!==void 0&&(o.defaultApproverUserResourceId=n.approver),n.claimProfile!==void 0&&(o.claimProfileResourceId=n.claimProfile),n.employmentType!==void 0&&(o.employmentType=n.employmentType),n.archive&&n.activate)throw new Error("--archive and --activate are mutually exclusive.");n.archive&&(o.active=!1),n.activate&&(o.active=!0),n.clearEmploymentType&&(o.clearEmploymentType=!0);let s=await JL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Employee updated: ${s.data.name??r}`))})(n)),e.command("delete <resourceId>").description("Delete an employee (must be settled). Prefer update --archive.").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await WL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Employee deleted: ${r}`))})(n)),e.command("bind-user <resourceId> <userResourceId>").description("Bind a login user to an employee (PERMANENT \u2014 cannot be changed)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n,i)=>L(async o=>{let s=await ZL(o,r,n);i.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Bound user ${n} to employee ${r}`))})(i)),e.command("preprocess <fileUrl>").description("Preview an employee import sheet before importing").option("--file-name <name>","Display file name").option("--file-type <type>","CSV | XLS | XLSX").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=await XL(i,{fileUrl:r,fileName:n.fileName,fileType:n.fileType});console.log(JSON.stringify(o.data,null,2))})(n)),e.command("import").description("Bulk import employees (async). Pass --create / --update / --delete JSON arrays (max 100 each).").option("--create <json>","Create rows (JSON array)").option("--update <json>","Update rows (JSON array, each with employeeResourceId)").option("--delete <json>","Delete rows (JSON array, each with employeeResourceId)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i={};n.create!==void 0&&(i.create=pu(n.create,"--create")),n.update!==void 0&&(i.update=pu(n.update,"--update")),n.delete!==void 0&&(i.delete=pu(n.delete,"--delete"));let o=await KL(r,i);n.json?console.log(JSON.stringify(o.data,null,2)):console.log(Y(`Queued employee import \u2014 jobId ${o.data?.jobId??"?"}`))}))}eue();Et();Tt();Er();Ut();Qt();Fe();var Pbr=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"categoryCode",header:"Category"},{key:"value",header:"Value"}];function Wnt(t){let e=t.command("bookmarks").description("Manage organization bookmarks");e.command("list").description("List bookmarks").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>iH(r,o),{label:"Fetching bookmarks"});$e(i,Pbr,n,"Bookmarks")})),e.command("get <resourceId>").description("Get a bookmark by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await oH(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Category:"),s.categoryCode),console.log(R("Value:"),s.value))})(n)),e.command("create").description("Create bookmark(s)").option("--name <name>","Bookmark name").option("--value <value>","Bookmark value").option("--category <code>","Category code (GENERAL_INFORMATION, TAXATION_AND_COMPLIANCE, etc.)").option("--datatype <code>","Datatype code (default: TEXT)").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i=ve(n),o;if(i?o=await Fx(r,i.items??[i]):(Qe(n,[{flag:"--name",key:"name"},{flag:"--value",key:"value"},{flag:"--category",key:"category"}]),o=await Fx(r,[{name:n.name,value:n.value,categoryCode:n.category,datatypeCode:n.datatype??"TEXT"}])),n.json)console.log(JSON.stringify(o.data,null,2));else{console.log(Y(`Bookmark(s) created: ${o.data.length} item(s)`));for(let s of o.data)console.log(` ${Se(s.resourceId)} ${s.name}`)}})),e.command("update <resourceId>").description("Update a bookmark").option("--name <name>","New name").option("--value <value>","New value").option("--category <code>","New category code").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=ve(n),s=o||{...n.name&&{name:n.name},...n.value&&{value:n.value},...n.category&&{categoryCode:n.category}},a=await sH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`Bookmark updated: ${a.data.name}`))})(n))}tue();mD();Et();Tt();Er();Ut();Qt();Fe();lr();function Pz(t,e){return r=>{let n=r.toUpperCase();if(!t.includes(n))throw new Error(`Invalid ${e}: ${r}. Allowed: ${t.join(", ")}`);return n}}function Znt(t){return Vb.map(e=>({moduleName:e,roleCode:t}))}var Xnt=[{key:"resourceId",header:"ID",format:Te},{key:"firstName",header:"First Name"},{key:"lastName",header:"Last Name"},{key:"email",header:"Email"},{key:"moduleRoles",header:"Roles",format:t=>Array.isArray(t)?t.map(e=>`${e.moduleName}:${e.roleCode}`).join(", "):String(t??"")}];function Knt(t){let e=t.command("org-users").description("Manage organization users");e.command("list").description("List organization users").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>aH(r,o),{label:"Fetching org users"});$e(i,Xnt,n,"Org Users")})),Ge({parent:e,fields:AS,defaults:gS,fetcher:cH,columns:Xnt,label:"Searching org users",positionalArg:"name",positionalFilter:r=>({or:[{firstName:{contains:r}},{lastName:{contains:r}},{email:{contains:r}}]})}),e.command("invite").description("Invite a user to the organization").option("--first-name <name>","First name").option("--last-name <name>","Last name").option("--email <email>","Email address").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Pz(BA,"user-type")).option("--role <role>","Role code: ADMIN, PREPARER, MEMBER, NO_ACCESS (default: MEMBER). ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Pz(RA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i=ve(n),o;if(i)o=await hv(r,i);else{Qe(n,[{flag:"--first-name",key:"firstName"},{flag:"--last-name",key:"lastName"},{flag:"--email",key:"email"}]);let s=n.role??"MEMBER",a=n.userType??(s==="ADMIN"?"ADMIN":"CUSTOM_USER");o=await hv(r,{firstName:n.firstName,lastName:n.lastName,email:n.email,userType:a,...a==="CUSTOM_USER"?{moduleRoles:Znt(s)}:{}})}n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`User invited: ${n.firstName??""} ${n.lastName??""} (${n.email??""})`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a user's access tier and/or module roles").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Pz(BA,"user-type")).option("--role <role>","New role code: ADMIN, PREPARER, MEMBER, NO_ACCESS. ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Pz(RA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=ve(n),s;if(o)s=o;else{if(!n.role&&!n.userType)throw new Error("At least one of --role or --user-type is required");let c=n.role,u=n.userType??(c==="ADMIN"?"ADMIN":c?"CUSTOM_USER":void 0);s={...u?{userType:u}:{},...u==="CUSTOM_USER"&&c?{moduleRoles:Znt(c)}:{}}}let a=await lH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`User updated: ${a.data.firstName} ${a.data.lastName}`))})(n)),e.command("remove <resourceId>").description("Remove a user from the organization").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await uH(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`User ${r} removed.`))})(n))}Fe();Nx();lr();Qt();var Ubr=[{key:"resourceId",header:"ID",format:Te},{key:"transactionReference",header:"Reference",format:Pn},{key:"direction",header:"Dir",format:lL},{key:"valueDate",header:"Date",format:Sb},{key:"totalAmount",header:"Amount",align:"right"},{key:"currencyCode",header:"Ccy"},{key:"businessTransactionType",header:"Type",format:t=>G(String(t??""))}];function eit(t){let e=t.command("cashflow").description("Search cashflow transactions");Ge({parent:e,fields:Dd,defaults:Sd,fetcher:Ph,columns:Ubr,label:"Searching cashflow"})}function tit(t){t.command("serve").description("HTTP daemon (not available in bundled CLI)").action(()=>{console.error("clio serve is not available in the bundled CLI. Use the full installation from the private repo."),process.exit(1)})}Fe();Et();Tt();qo();Mle();Xle();Lle();function $a(t){return t.option("--plan","Plan mode \u2014 show required accounts and step summary (offline, no auth)").option("--input <file>","Account mapping JSON file (optional \u2014 auto-resolves from chart of accounts if omitted)").option("--bank-account <id>","Bank/cash account name or resourceId (for cash-in/cash-out steps)").option("--contact <id>","Contact name or resourceId \u2014 supplier for bills, customer for invoices").option("--existing-txn <id>","Attach to existing transaction \u2014 skip initial step, create delta only").option("--ref <prefix>","Reference prefix (generates prefix-1, prefix-2, ...)").option("--finalize","Approve transactions immediately (default: create as drafts)").option("--json","Output as JSON").option("--api-key <key>","API key override")}function qa(t,e){return async r=>{try{let n=e(r);if(r.plan){let s=pv(t,n);r.json?console.log(JSON.stringify(s,null,2)):$br(s);return}let i=Bx(n);i||(console.error(oe("Error: no blueprint generated. Provide --start-date to enable blueprint.")),process.exit(1)),await L(async(s,a,c)=>{let u=!!a.json,d,f=ve(a);if(f)d=f;else{let h=pv(t,n);u||process.stderr.write(G(` Auto-resolving accounts from chart of accounts...
|
|
1060
|
+
`));for(let o of i.data)console.log(` ${Se(o.code??o.resourceId??"?")} ${o.description??""} ${G(o.countryCode??"")}`)}})),e.command("create").description("Create a new tax profile").option("--name <name>",'Tax profile name (e.g., "GST 9%")').option("--rate <n>","Tax rate as percentage (e.g., 9)",be).option("--tax-type-code <code>","Tax type code (from tax-profiles types)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"},{flag:"--rate",key:"rate"},{flag:"--tax-type-code",key:"taxTypeCode"}]);let i=await rM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Tax profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await CL(r,{name:n.name,taxRate:n.rate,taxTypeCode:n.taxTypeCode});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Tax profile created: ${n.name} (${n.rate}%)`)),console.log(R("ID:"),o.data.resourceId))}))}Fe();OL();BY();uc();Et();Tt();Er();Ut();Qt();lr();var Lnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"expenseAccountResourceId",header:"Expense Acct",format:Te}];function Mnt(t){let e=t.command("claim-types").description("Manage employee-expense claim types (expense categories)");e.command("list").description("List claim types").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>xL(r,o),{label:"Fetching claim types"});$e(i,Lnt,n,"Claim Types")})),e.command("get <resourceId>").description("Get a claim type by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await TL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.expenseAccount&&console.log(R("Expense Account:"),`${s.expenseAccount.code} ${s.expenseAccount.name}`),s.taxProfile&&console.log(R("Tax Profile:"),s.taxProfile.name))})(n)),Ge({parent:e,fields:VD,defaults:JD,fetcher:Ob,columns:Lnt,label:"Searching claim types"}),e.command("create").description("Create a claim type").option("--name <name>","Claim type name (unique per org)").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Magic OCR classifier defaults (JSON string)").option("--default","Make org default").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"}]);let i=await iM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim type "${n.name}" already exists (${i.resourceId}).`));return}let o=await kL(r,{name:n.name,expenseAccountResourceId:n.expenseAccount,taxProfileResourceId:n.taxProfile,classifierConfig:n.classifierConfig,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim type created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a claim type").option("--name <name>","New name").option("--expense-account <id>","Default expense account resourceId").option("--tax-profile <id>","Default tax profile resourceId").option("--classifier-config <json>","Classifier defaults (JSON string)").option("--default","Make org default").option("--clear <fields>","Comma-separated optional fields to NULL (expenseAccountResourceId,taxProfileResourceId,classifierConfig)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.expenseAccount!==void 0&&(o.expenseAccountResourceId=n.expenseAccount),n.taxProfile!==void 0&&(o.taxProfileResourceId=n.taxProfile),n.classifierConfig!==void 0&&(o.classifierConfig=n.classifierConfig),n.default!==void 0&&(o.isDefault=n.default),Object.assign(o,ty(Co(n.clear),eD));let s=await NL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim type updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim type").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await FL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim type deleted: ${r}`))})(n))}Fe();nD();BY();uc();Et();Tt();Er();Ut();Qt();lr();var Pnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"isDefault",header:"Default"},{key:"taxMode",header:"Tax Mode"},{key:"employeeBalanceAccountResourceId",header:"Balance Acct",format:Te}];function Unt(t){let e={};return t.name!==void 0&&(e.name=t.name),t.approver!==void 0&&(e.approverUserResourceId=t.approver),t.visibleClaimTypes!==void 0&&(e.visibleClaimTypeIds=Co(t.visibleClaimTypes)),t.visibleTaxProfiles!==void 0&&(e.visibleTaxProfileIds=Co(t.visibleTaxProfiles)),t.visibleClassifiers!==void 0&&(e.visibleClassifierIds=Co(t.visibleClassifiers)),t.visibleVendors!==void 0&&(e.visibleVendorResourceIds=Co(t.visibleVendors)),t.allowedCurrencies!==void 0&&(e.allowedCurrencies=Co(t.allowedCurrencies)),t.minAmount!==void 0&&(e.minClaimAmount=t.minAmount),t.maxAmount!==void 0&&(e.maxClaimAmount=t.maxAmount),t.maxPerPeriod!==void 0&&(e.maxPerPeriodAmount=t.maxPerPeriod),t.perPeriod!==void 0&&(e.perPeriod=t.perPeriod),t.balanceAccount!==void 0&&(e.employeeBalanceAccountResourceId=t.balanceAccount),t.taxMode!==void 0&&(e.taxMode=t.taxMode),t.default!==void 0&&(e.isDefault=t.default),e}function $nt(t){return t.option("--approver <id>","Default approver user resourceId").option("--visible-claim-types <ids>","Allowed claim type IDs (comma-separated)").option("--visible-tax-profiles <ids>","Allowed tax profile IDs (comma-separated)").option("--visible-classifiers <ids>","Allowed classifier IDs (comma-separated)").option("--visible-vendors <ids>","Allowed vendor contact IDs (comma-separated)").option("--allowed-currencies <codes>","Allowed ISO currency codes (comma-separated)").option("--min-amount <n>","Min claim total",ar).option("--max-amount <n>","Max claim total",ar).option("--max-per-period <n>","Per-period spend cap (requires --per-period)",ar).option("--per-period <window>","DAILY | WEEKLY | MONTHLY | QUARTERLY | YEARLY").option("--balance-account <id>","Employee balance (CURRENT_LIABILITY) account resourceId").option("--tax-mode <mode>","NO_TAX | INCLUSIVE (EXCLUSIVE rejected)").option("--default","Make org default")}function qnt(t){let e=t.command("claim-profiles").description("Manage employee-expense claim profiles (per-employee policy bundles)");e.command("list").description("List claim profiles").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>QL(r,o),{label:"Fetching claim profiles"});$e(i,Pnt,n,"Claim Profiles")})),e.command("get <resourceId>").description("Get a claim profile by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await LL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Default:"),s.isDefault),s.taxMode&&console.log(R("Tax mode:"),s.taxMode),s.employeeBalanceAccount&&console.log(R("Balance account:"),`${s.employeeBalanceAccount.code} ${s.employeeBalanceAccount.name}`))})(n)),Ge({parent:e,fields:WD,defaults:ZD,fetcher:Qb,columns:Pnt,label:"Searching claim profiles"}),$nt(e.command("create").description("Create a claim profile").option("--name <name>","Profile name (unique per org)")).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"}]);let i=await oM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Claim profile "${n.name}" already exists (${i.resourceId}).`));return}let o=await ML(r,Unt(n));n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Claim profile created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),$nt(e.command("update <resourceId>").description("Update a claim profile").option("--name <name>","New name")).option("--clear <fields>","Comma-separated optional fields to NULL (e.g. approverUserResourceId,perPeriod,taxMode)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=Unt(n);Object.assign(o,ty(Co(n.clear),rD));let s=await PL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Claim profile updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Soft-delete a claim profile").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await UL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Claim profile deleted: ${r}`))})(n))}Fe();sD();uc();Et();Tt();Er();Ut();Qt();lr();var jnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"outerAxis",header:"Outer"},{key:"innerAxis",header:"Inner"},{key:"isDefault",header:"Default"}];function Ynt(t){let e=t.command("posting-rules").description("Manage claim posting rules (how approved claims group into journals at conversion)");e.command("list").description("List posting rules").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>$L(r,o),{label:"Fetching posting rules"});$e(i,jnt,n,"Posting Rules")})),e.command("get <resourceId>").description("Get a posting rule by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await qL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Outer axis:"),s.outerAxis),console.log(R("Inner axis:"),s.innerAxis),console.log(R("Line template:"),s.lineDescriptionTemplate),console.log(R("Default:"),s.isDefault))})(n)),Ge({parent:e,fields:XD,defaults:KD,fetcher:Lb,columns:jnt,label:"Searching posting rules"}),e.command("create").description("Create a posting rule").option("--name <name>","Rule name (unique per org)").option("--outer-axis <axis>","PER_EMPLOYEE | PER_VENDOR | PER_PAIR | ONE_BATCH | PER_CLAIM").option("--inner-axis <axis>","RAW | BY_CT_TP_NC | BY_CT_TP_NC_EMPLOYEE | BY_CT_TP_NC_VENDOR").option("--line-template <tpl>",'Handlebars line template, e.g. "{employeeName} - {claimType}"').option("--journal-reference-template <tpl>","Optional journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout","Create reimbursement DCE by default").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{Qe(n,[{flag:"--name",key:"name"},{flag:"--outer-axis",key:"outerAxis"},{flag:"--inner-axis",key:"innerAxis"},{flag:"--line-template",key:"lineTemplate"}]);let i=await sM(r,n.name);if(i){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:i},null,2)):console.log(ke(`Posting rule "${n.name}" already exists (${i.resourceId}).`));return}let o=await jL(r,{name:n.name,outerAxis:n.outerAxis,innerAxis:n.innerAxis,lineDescriptionTemplate:n.lineTemplate,journalReferenceTemplate:n.journalReferenceTemplate,defaultBankAccountResourceId:n.defaultBankAccount,defaultIncludeReimbursementPayout:n.defaultIncludePayout,isDefault:n.default});n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`Posting rule created: ${n.name}`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a posting rule").option("--name <name>","New name").option("--outer-axis <axis>","Outer grouping axis").option("--inner-axis <axis>","Inner line-aggregation axis").option("--line-template <tpl>","Handlebars line template").option("--journal-reference-template <tpl>","Journal-header reference template").option("--default-bank-account <id>","Default reimbursement bank account resourceId").option("--default-include-payout <bool>","Create reimbursement DCE by default (true/false)").option("--default","Make org default rule").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o={};n.name!==void 0&&(o.name=n.name),n.outerAxis!==void 0&&(o.outerAxis=n.outerAxis),n.innerAxis!==void 0&&(o.innerAxis=n.innerAxis),n.lineTemplate!==void 0&&(o.lineDescriptionTemplate=n.lineTemplate),n.journalReferenceTemplate!==void 0&&(o.journalReferenceTemplate=n.journalReferenceTemplate),n.defaultBankAccount!==void 0&&(o.defaultBankAccountResourceId=n.defaultBankAccount),n.defaultIncludePayout!==void 0&&(o.defaultIncludeReimbursementPayout=n.defaultIncludePayout==="true"),n.default!==void 0&&(o.isDefault=n.default);let s=await YL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Posting rule updated: ${s.data.name}`))})(n)),e.command("delete <resourceId>").description("Delete a posting rule (the org default cannot be deleted while default)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await HL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Posting rule deleted: ${r}`))})(n))}Fe();$M();aue();cue();o_();wH();Et();Tt();Qt();Df();lr();import{randomUUID as Fbr}from"node:crypto";import{readFileSync as Hnt,statSync as Obr}from"node:fs";import{basename as Qbr,extname as Lbr,resolve as znt}from"node:path";var Mbr=[{key:"resourceId",header:"ID",format:Te},{key:"reference",header:"Reference"},{key:"status",header:"Status"},{key:"employeeResourceId",header:"Employee",format:Te},{key:"totalAmount",header:"Amount"},{key:"currencyCode",header:"Ccy"}];function Gnt(t){let e=t.command("claims").description("Employee-expense claims: search, edit drafts, lifecycle, bulk actions");Ge({parent:e,fields:YD,defaults:HD,fetcher:IM,columns:Mbr,label:"Searching claims"}),e.command("get <resourceId>").description("Get a claim by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>L(async c=>{let d=(await wM(c,s)).data;a.json?console.log(JSON.stringify(d,null,2)):(console.log(R("Reference:"),d.reference??"\u2014"),console.log(R("ID:"),d.resourceId),console.log(R("Status:"),d.status),console.log(R("Total:"),`${d.totalAmount??0} ${d.currencyCode??""}`),console.log(R("Lines:"),(d.claimItems??[]).length))})(a)),e.command("create").description("Create a claim directly (bare create). Vendor is EITHER --contact OR --vendor-name. --items / --custom-fields take a JSON array string.").requiredOption("--value-date <date>","Business-transaction date (YYYY-MM-DD)").requiredOption("--currency <code>","Claim currency (ISO 4217)").option("--reference <ref>","User reference").option("--employee <id>","Employee resourceId the claim is filed for").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency-symbol <symbol>","Currency symbol override").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(s=>L(async a=>{let c={valueDate:s.valueDate,currencyCode:s.currency};s.reference!==void 0&&(c.reference=s.reference),s.employee!==void 0&&(c.employeeResourceId=s.employee),s.contact!==void 0&&(c.contactResourceId=s.contact),s.vendorName!==void 0&&(c.vendorName=s.vendorName),s.currencySymbol!==void 0&&(c.currencySymbol=s.currencySymbol),s.internalNotes!==void 0&&(c.internalNotes=s.internalNotes),s.claimProfile!==void 0&&(c.claimProfileResourceId=s.claimProfile),s.approver!==void 0&&(c.approverUserResourceId=s.approver),s.tags!==void 0&&(c.tags=Co(s.tags)??[]),s.items!==void 0&&(c.claimItems=pu(s.items,"--items")),s.customFields!==void 0&&(c.customFields=pu(s.customFields,"--custom-fields")),s.submit&&(c.saveAsDraft=!1);let u=await _M(a,c);s.json?console.log(JSON.stringify(u.data,null,2)):console.log(Y(`Claim created: ${u.data.reference??u.data.resourceId} (${u.data.status})`))})(s)),e.command("update <resourceId>").description("Update a DRAFT claim (partial). --items / --custom-fields take a JSON array string.").option("--reference <ref>","User reference").option("--value-date <date>","Business-transaction date (YYYY-MM-DD)").option("--employee <id>","Employee resourceId").option("--contact <id>","Vendor contact resourceId").option("--vendor-name <name>","Free-text vendor name").option("--currency <code>","Claim currency (ISO 4217)").option("--internal-notes <text>","Internal notes").option("--claim-profile <id>","Claim profile resourceId").option("--approver <id>","Approver user resourceId").option("--tags <list>","Header tags (comma-separated)").option("--items <json>","Line items as a JSON array (REPLACES all lines)").option("--custom-fields <json>","Custom field values as a JSON array").option("--submit","Validate + submit in one call (saveAsDraft=false)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>L(async c=>{let u={};a.reference!==void 0&&(u.reference=a.reference),a.valueDate!==void 0&&(u.valueDate=a.valueDate),a.employee!==void 0&&(u.employeeResourceId=a.employee),a.contact!==void 0&&(u.contactResourceId=a.contact),a.vendorName!==void 0&&(u.vendorName=a.vendorName),a.currency!==void 0&&(u.currencyCode=a.currency),a.internalNotes!==void 0&&(u.internalNotes=a.internalNotes),a.claimProfile!==void 0&&(u.claimProfileResourceId=a.claimProfile),a.approver!==void 0&&(u.approverUserResourceId=a.approver),a.tags!==void 0&&(u.tags=Co(a.tags)??[]),a.items!==void 0&&(u.claimItems=pu(a.items,"--items")),a.customFields!==void 0&&(u.customFields=pu(a.customFields,"--custom-fields")),a.submit&&(u.saveAsDraft=!1);let d=await DM(c,s,u);a.json?console.log(JSON.stringify(d.data,null,2)):console.log(Y(`Claim updated: ${d.data.reference??d.data.resourceId} (${d.data.status})`))})(a)),e.command("delete <resourceId>").description("Delete a claim (only DRAFT / REJECTED / CANCELLED)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a)=>L(async c=>{await SM(c,s),a.json?console.log(JSON.stringify({deleted:!0,resourceId:s})):console.log(Y(`Claim deleted: ${s}`))})(a)),e.command("delete-attachment <resourceId> <attachmentResourceId>").description("Remove one attachment from a claim").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((s,a,c)=>L(async u=>{await RM(u,s,a),c.json?console.log(JSON.stringify({deleted:!0,resourceId:s,attachmentResourceId:a})):console.log(Y(`Attachment removed from claim ${s}`))})(c));let r=[["submit",BM,"Submit a DRAFT claim for approval"],["approve",xM,"Approve a SUBMITTED claim"],["unpost",NM,"Unpost a CONVERTED claim (reverse conversion)"]];for(let[s,a,c]of r)e.command(`${s} <resourceId>`).description(c).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>L(async f=>{let p=await a(f,u);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let n=[["reject",TM,"Reject a SUBMITTED/APPROVED claim"],["cancel",kM,"Cancel a DRAFT/SUBMITTED claim"]];for(let[s,a,c]of n)e.command(`${s} <resourceId>`).description(c).option("--reason <text>","Reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((u,d)=>L(async f=>{Qe(d,[{flag:"--reason",key:"reason"}]);let p=await a(f,u,d.reason);d.json?console.log(JSON.stringify(p,null,2)):console.log(Y(`Claim ${s}ed: ${u}${p.data?.status?` (${p.data.status})`:""}`))})(d));let i=[["bulk-submit",FM,"Bulk-submit DRAFT claims (async)"],["bulk-approve",OM,"Bulk-approve SUBMITTED claims (async)"],["bulk-delete",QM,"Bulk-delete DRAFT/REJECTED/CANCELLED claims (async)"]];for(let[s,a,c]of i)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(u,d)=>{Qe(d,[{flag:"--ids",key:"ids"}]);let f=await a(u,Co(d.ids)??[]);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));let o=[["bulk-reject",LM,"Bulk-reject claims (async)"],["bulk-cancel",MM,"Bulk-cancel claims (async)"]];for(let[s,a,c]of o)e.command(s).description(`${c}. Poll with: clio background-jobs search`).option("--ids <list>","Claim resourceIds (comma-separated, 1-500)").option("--reason <text>","Shared reason (1-1000 chars), required").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(u,d)=>{Qe(d,[{flag:"--ids",key:"ids"},{flag:"--reason",key:"reason"}]);let f=await a(u,Co(d.ids)??[],d.reason);d.json?console.log(JSON.stringify(f,null,2)):console.log(Y(`Queued ${s} \u2014 jobId ${f.data?.jobId??"?"}`))}));e.command("tracking-tags").description("List claim tracking-tag values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{let c=await PM(s);if(a.json)console.log(JSON.stringify(c,null,2));else{console.log(R(`Tracking tags (${c.length}):`));for(let u of c)console.log(` ${typeof u=="string"?u:JSON.stringify(u)}`)}})),e.command("custom-field-values").description("List claim custom-field values (picker)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{let c=await UM(s);a.json?console.log(JSON.stringify(c,null,2)):console.log(ke(c.length===0?"No custom field values.":`${c.length} custom field value(s).`))})),e.command("preview-conversion").description("Preview the journals an APPROVED claim batch would produce (no write)").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--payout-flow <flow>","POST | POST_AND_RECORD").option("--include-payout","Include reimbursement DCE lines").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{if(Qe(a,[{flag:"--ids",key:"ids"}]),a.payoutFlow!==void 0&&!Qx.includes(a.payoutFlow))throw new Error(`--payout-flow must be one of: ${Qx.join(", ")}`);let c=await _H(s,{claimResourceIds:Co(a.ids)??[],postingRuleResourceId:a.postingRule,payoutFlow:a.payoutFlow,includeReimbursementPayout:a.includePayout});console.log(JSON.stringify(c.data,null,2))})),e.command("convert").description("Convert an APPROVED claim batch into journals (atomic). Preview first.").option("--ids <list>","APPROVED claim resourceIds (comma-separated)").option("--value-date <date>","Journal value date (YYYY-MM-DD), required").option("--posting-rule <id>","Posting rule resourceId (default: org default)").option("--include-payout","Create books-only reimbursement DCEs").option("--bank-account <id>","Override reimbursement bank account").option("--idempotency-key <key>","Retry-dedup token (auto-generated if omitted)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{Qe(a,[{flag:"--ids",key:"ids"},{flag:"--value-date",key:"valueDate"}]);let c=await DH(s,{claimResourceIds:Co(a.ids)??[],valueDate:a.valueDate,postingRuleResourceId:a.postingRule,includeReimbursementPayout:a.includePayout,bankAccountResourceIdOverride:a.bankAccount,idempotencyKey:a.idempotencyKey||Fbr()});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y("Claims converted to journals."))})),e.command("record-payout").description("Record a books-only employee payout (reimbursement / advance)").option("--employee <id>","Employee resourceId").option("--amount <n>","Payout amount (> 0)",ar).option("--payment-account <id>","Bank/cash account the DCE credits").option("--value-date <date>","Value date (YYYY-MM-DD)").option("--payout-for <type>","REIMBURSEMENT | ADVANCE (default ADVANCE)").option("--currency <code>","Settle currency (ISO 4217)").option("--reference <ref>","Payout reference (auto-generated if omitted)").option("--description <text>","DCE line description").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{Qe(a,[{flag:"--employee",key:"employee"},{flag:"--amount",key:"amount"},{flag:"--payment-account",key:"paymentAccount"},{flag:"--value-date",key:"valueDate"}]);let c=await SH(s,{employeeResourceId:a.employee,amount:a.amount,paymentAccountResourceId:a.paymentAccount,valueDate:a.valueDate,payoutFor:a.payoutFor,currencyCode:a.currency,reference:a.reference||Pa("EP"),description:a.description,internalNotes:a.internalNotes});a.json?console.log(JSON.stringify(c.data,null,2)):console.log(Y(`Payout recorded: ${c.data.resourceId}`))})),Ge({parent:e,commandName:"payouts",fields:zD,defaults:GD,fetcher:RH,columns:[{key:"resourceId",header:"ID",format:Te},{key:"reference",header:"Reference"},{key:"employeeResourceId",header:"Employee",format:Te},{key:"amount",header:"Amount"},{key:"payoutType",header:"Type"}],label:"Searching employee payouts"}),e.command("from-attachment").description("Create a claim DRAFT from a receipt via AI extraction \u2014 a local file (--file), a remote URL (--source-url), or raw HTML (--html)").option("--file <path>","Local receipt file (PDF / JPG / PNG / HEIC / XLS / XLSX / EML)").option("--source-url <url>","Remote receipt file URL (alternative to --file)").option("--html <value>","Raw HTML (e.g. an email body) \u2014 inline or @path to read from a file").option("--contact <id>","Vendor contact resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--currency <code>","Currency override (ISO 4217)").option("--value-date <date>","Value date override (YYYY-MM-DD)").option("--internal-notes <text>","Internal notes").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(s,a)=>{if([a.file,a.sourceUrl,a.html].filter(Boolean).length!==1)throw new Error("provide exactly one of --file / --source-url / --html.");let u,d;if(a.file){let h=znt(a.file),m=Lbr(h).toLowerCase();if(!ad.has(m))throw new Error(`unsupported file type "${m}". Supported: ${[...ad].join(", ")}`);let A=25*1024*1024,g=Obr(h).size;if(g>A)throw new Error(`file too large (${(g/1048576).toFixed(1)}MB > 25MB). Compress or split the receipt.`);u=new Blob([Hnt(h)],{type:Mm(m)}),d=Qbr(h)}let f;a.html&&(a.html.startsWith("@")||console.error(ke("Warning: passing HTML inline can leak invoice data into shell history \u2014 prefer --html @path.")),f=a.html.startsWith("@")?Hnt(znt(a.html.slice(1)),"utf8"):a.html);let p=await nb(s,{sourceFile:u,sourceFileName:d,sourceURL:a.sourceUrl,html:f,contactResourceId:a.contact,claimProfileResourceId:a.claimProfile,currencyCode:a.currency,valueDate:a.valueDate,internalNotes:a.internalNotes});console.log(JSON.stringify(p,null,2))}))}Fe();aD();uc();Et();Tt();Qt();lr();var Vnt=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"email",header:"Email"},{key:"employmentType",header:"Type"},{key:"active",header:"Active"}];function Jnt(t){let e=t.command("employees").description("Manage employees (expense-claim members): CRUD, balances, bind-user, import");Ge({parent:e,fields:eS,defaults:tS,fetcher:Mb,columns:Vnt,label:"Searching employees"}),Ge({parent:e,commandName:"balances",fields:rS,defaults:nS,fetcher:zL,columns:Vnt,label:"Searching employee balances"}),e.command("get <resourceId>").description("Get an employee by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await GL(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Email:"),s.email??"\u2014"),console.log(R("Active:"),s.active),s.userBinding&&console.log(R("Bound user:"),`${s.userBinding.name??""} (${s.userBinding.status??""})`),s.claimProfile&&console.log(R("Claim profile:"),s.claimProfile.name))})(n)),e.command("create").description("Create an employee (requires --user to bind; binding is permanent)").option("--name <name>","Employee name").option("--user <id>","Login user resourceId to bind (required)").option("--claim-profile <id>","Claim profile resourceId (defaults to org default)").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--approver <id>","Default approver user resourceId").option("--employment-type <type>","FULL_TIME | PART_TIME | CONTRACTOR | INTERN | TEMPORARY | CONSULTANT").option("--inactive","Create as inactive").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{if(Qe(n,[{flag:"--name",key:"name"},{flag:"--user",key:"user"}]),n.email){let o=await aM(r,n.email);if(o){n.json?console.log(JSON.stringify({_guard:"duplicate_skipped",existing:o},null,2)):console.log(ke(`Employee with email "${n.email}" already exists (${o.resourceId}).`));return}}let i=await VL(r,{name:n.name,userResourceId:n.user,claimProfileResourceId:n.claimProfile,email:n.email,phone:n.phone,managerEmployeeResourceId:n.manager,defaultApproverUserResourceId:n.approver,active:n.inactive?!1:void 0,employmentType:n.employmentType});n.json?console.log(JSON.stringify(i.data,null,2)):(console.log(Y(`Employee created: ${n.name}`)),console.log(R("ID:"),i.data.resourceId))})),e.command("update <resourceId>").description("Update an employee. Use --archive to deactivate (reversible).").option("--name <name>","New name").option("--email <email>","Work email").option("--phone <phone>","Phone").option("--manager <id>","Manager employee resourceId").option("--approver <id>","Default approver user resourceId").option("--claim-profile <id>","Claim profile resourceId").option("--employment-type <type>","Employment classification").option("--archive","Set active=false (archive)").option("--activate","Set active=true").option("--clear-employment-type","Unset the classification").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o={};if(n.name!==void 0&&(o.name=n.name),n.email!==void 0&&(o.email=n.email),n.phone!==void 0&&(o.phone=n.phone),n.manager!==void 0&&(o.managerEmployeeResourceId=n.manager),n.approver!==void 0&&(o.defaultApproverUserResourceId=n.approver),n.claimProfile!==void 0&&(o.claimProfileResourceId=n.claimProfile),n.employmentType!==void 0&&(o.employmentType=n.employmentType),n.archive&&n.activate)throw new Error("--archive and --activate are mutually exclusive.");n.archive&&(o.active=!1),n.activate&&(o.active=!0),n.clearEmploymentType&&(o.clearEmploymentType=!0);let s=await JL(i,r,o);n.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Employee updated: ${s.data.name??r}`))})(n)),e.command("delete <resourceId>").description("Delete an employee (must be settled). Prefer update --archive.").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await WL(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`Employee deleted: ${r}`))})(n)),e.command("bind-user <resourceId> <userResourceId>").description("Bind a login user to an employee (PERMANENT \u2014 cannot be changed)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n,i)=>L(async o=>{let s=await ZL(o,r,n);i.json?console.log(JSON.stringify(s.data,null,2)):console.log(Y(`Bound user ${n} to employee ${r}`))})(i)),e.command("preprocess <fileUrl>").description("Preview an employee import sheet before importing").option("--file-name <name>","Display file name").option("--file-type <type>","CSV | XLS | XLSX").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=await XL(i,{fileUrl:r,fileName:n.fileName,fileType:n.fileType});console.log(JSON.stringify(o.data,null,2))})(n)),e.command("import").description("Bulk import employees (async). Pass --create / --update / --delete JSON arrays (max 100 each).").option("--create <json>","Create rows (JSON array)").option("--update <json>","Update rows (JSON array, each with employeeResourceId)").option("--delete <json>","Delete rows (JSON array, each with employeeResourceId)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i={};n.create!==void 0&&(i.create=pu(n.create,"--create")),n.update!==void 0&&(i.update=pu(n.update,"--update")),n.delete!==void 0&&(i.delete=pu(n.delete,"--delete"));let o=await KL(r,i);n.json?console.log(JSON.stringify(o.data,null,2)):console.log(Y(`Queued employee import \u2014 jobId ${o.data?.jobId??"?"}`))}))}eue();Et();Tt();Er();Ut();Qt();Fe();var Pbr=[{key:"resourceId",header:"ID",format:Te},{key:"name",header:"Name"},{key:"categoryCode",header:"Category"},{key:"value",header:"Value"}];function Wnt(t){let e=t.command("bookmarks").description("Manage organization bookmarks");e.command("list").description("List bookmarks").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>iH(r,o),{label:"Fetching bookmarks"});$e(i,Pbr,n,"Bookmarks")})),e.command("get <resourceId>").description("Get a bookmark by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let s=(await oH(i,r)).data;n.json?console.log(JSON.stringify(s,null,2)):(console.log(R("Name:"),s.name),console.log(R("ID:"),s.resourceId),console.log(R("Category:"),s.categoryCode),console.log(R("Value:"),s.value))})(n)),e.command("create").description("Create bookmark(s)").option("--name <name>","Bookmark name").option("--value <value>","Bookmark value").option("--category <code>","Category code (GENERAL_INFORMATION, TAXATION_AND_COMPLIANCE, etc.)").option("--datatype <code>","Datatype code (default: TEXT)").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i=ve(n),o;if(i?o=await Fx(r,i.items??[i]):(Qe(n,[{flag:"--name",key:"name"},{flag:"--value",key:"value"},{flag:"--category",key:"category"}]),o=await Fx(r,[{name:n.name,value:n.value,categoryCode:n.category,datatypeCode:n.datatype??"TEXT"}])),n.json)console.log(JSON.stringify(o.data,null,2));else{console.log(Y(`Bookmark(s) created: ${o.data.length} item(s)`));for(let s of o.data)console.log(` ${Se(s.resourceId)} ${s.name}`)}})),e.command("update <resourceId>").description("Update a bookmark").option("--name <name>","New name").option("--value <value>","New value").option("--category <code>","New category code").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=ve(n),s=o||{...n.name&&{name:n.name},...n.value&&{value:n.value},...n.category&&{categoryCode:n.category}},a=await sH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`Bookmark updated: ${a.data.name}`))})(n))}tue();mD();Et();Tt();Er();Ut();Qt();Fe();lr();function Pz(t,e){return r=>{let n=r.toUpperCase();if(!t.includes(n))throw new Error(`Invalid ${e}: ${r}. Allowed: ${t.join(", ")}`);return n}}function Znt(t){return Vb.map(e=>({moduleName:e,roleCode:t}))}var Xnt=[{key:"resourceId",header:"ID",format:Te},{key:"firstName",header:"First Name"},{key:"lastName",header:"Last Name"},{key:"email",header:"Email"},{key:"moduleRoles",header:"Roles",format:t=>Array.isArray(t)?t.map(e=>`${e.moduleName}:${e.roleCode}`).join(", "):String(t??"")}];function Knt(t){let e=t.command("org-users").description("Manage organization users");e.command("list").description("List organization users").option("--limit <n>","Max results (default 100)",be).option("--offset <n>","Page number offset (0-indexed)",et).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 1000)",be).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(L(async(r,n)=>{let i=await Ye(n,o=>aH(r,o),{label:"Fetching org users"});$e(i,Xnt,n,"Org Users")})),Ge({parent:e,fields:AS,defaults:gS,fetcher:cH,columns:Xnt,label:"Searching org users",positionalArg:"name",positionalFilter:r=>({or:[{firstName:{contains:r}},{lastName:{contains:r}},{email:{contains:r}}]})}),e.command("invite").description("Invite a user to the organization").option("--first-name <name>","First name").option("--last-name <name>","Last name").option("--email <email>","Email address").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Pz(BA,"user-type")).option("--role <role>","Role code: ADMIN, PREPARER, MEMBER, NO_ACCESS (default: MEMBER). ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Pz(RA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(L(async(r,n)=>{let i=ve(n),o;if(i)o=await hv(r,i);else{Qe(n,[{flag:"--first-name",key:"firstName"},{flag:"--last-name",key:"lastName"},{flag:"--email",key:"email"}]);let s=n.role??"MEMBER",a=n.userType??(s==="ADMIN"?"ADMIN":"CUSTOM_USER");o=await hv(r,{firstName:n.firstName,lastName:n.lastName,email:n.email,userType:a,...a==="CUSTOM_USER"?{moduleRoles:Znt(s)}:{}})}n.json?console.log(JSON.stringify(o.data,null,2)):(console.log(Y(`User invited: ${n.firstName??""} ${n.lastName??""} (${n.email??""})`)),console.log(R("ID:"),o.data.resourceId))})),e.command("update <resourceId>").description("Update a user's access tier and/or module roles").option("--user-type <type>","ADMIN | CUSTOM_USER (default: derived from --role)",Pz(BA,"user-type")).option("--role <role>","New role code: ADMIN, PREPARER, MEMBER, NO_ACCESS. ADMIN \u2192 userType=ADMIN; others \u2192 userType=CUSTOM_USER with this role on every module.",Pz(RA,"role")).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{let o=ve(n),s;if(o)s=o;else{if(!n.role&&!n.userType)throw new Error("At least one of --role or --user-type is required");let c=n.role,u=n.userType??(c==="ADMIN"?"ADMIN":c?"CUSTOM_USER":void 0);s={...u?{userType:u}:{},...u==="CUSTOM_USER"&&c?{moduleRoles:Znt(c)}:{}}}let a=await lH(i,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log(Y(`User updated: ${a.data.firstName} ${a.data.lastName}`))})(n)),e.command("remove <resourceId>").description("Remove a user from the organization").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((r,n)=>L(async i=>{await uH(i,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log(Y(`User ${r} removed.`))})(n))}Fe();Nx();lr();Qt();var Ubr=[{key:"resourceId",header:"ID",format:Te},{key:"transactionReference",header:"Reference",format:Pn},{key:"direction",header:"Dir",format:lL},{key:"valueDate",header:"Date",format:Sb},{key:"totalAmount",header:"Amount",align:"right"},{key:"currencyCode",header:"Ccy"},{key:"businessTransactionType",header:"Type",format:t=>G(String(t??""))}];function eit(t){let e=t.command("cashflow").description("Search cashflow transactions");Ge({parent:e,fields:Dd,defaults:Sd,fetcher:Ph,columns:Ubr,label:"Searching cashflow"})}function tit(t){t.command("serve").description("HTTP daemon (not available in bundled CLI)").action(()=>{console.error("clio serve is not available in the bundled CLI. Use the full installation from the private repo."),process.exit(1)})}Fe();Et();Tt();qo();Mle();Xle();Lle();function $a(t){return t.option("--plan","Plan mode \u2014 show required accounts and step summary (offline, no auth)").option("--input <file>","Account mapping JSON file (optional \u2014 auto-resolves from chart of accounts if omitted)").option("--bank-account <id>","Bank/cash account name or resourceId (for cash-in/cash-out steps)").option("--contact <id>","Contact name or resourceId \u2014 supplier for bills, customer for invoices").option("--existing-txn <id>","Attach to existing transaction \u2014 skip initial step, create delta only").option("--ref <prefix>","Reference prefix (generates prefix-1, prefix-2, ...)").option("--finalize","Approve transactions immediately (default: create as drafts)").option("--json","Output as JSON").option("--api-key <key>","API key override")}function qa(t,e){return async r=>{try{let n=e(r);if(r.plan){let s=pv(t,n);r.json?console.log(JSON.stringify(s,null,2)):$br(s);return}let i=Bx(n);i||(console.error(oe("Error: no blueprint generated. Provide --start-date to enable blueprint.")),process.exit(1)),await L(async(s,a,c)=>{let u=!!a.json,d,f=ve(a);if(f)d=f;else{let h=pv(t,n);u||process.stderr.write(G(` Auto-resolving accounts from chart of accounts...
|
|
1061
1061
|
`)),d=await n1e(s,h.plan.requiredAccounts,{silent:u})}if(a.contact){let h=await mi(s,a.contact,{silent:u});a.contact=h.resourceId}if(a.bankAccount){let h=await hM(s,a.bankAccount,{silent:u});a.bankAccount=h.resourceId}let p=await rH(s,{blueprint:i,calcType:t,accountMap:d,bankAccountId:a.bankAccount,contactId:a.contact,existingTxnId:a.existingTxn,referencePrefix:a.ref,finalize:a.finalize});a.json?console.log(JSON.stringify(p,null,2)):qbr(p)})(r)}catch(n){throw(n instanceof Yt||n instanceof Error&&n.message.includes("blueprint"))&&(console.error(oe("Error: "+n.message)),process.exit(1)),n}}}function $br(t){console.log(R(`
|
|
1062
1062
|
Capsule Transaction Plan: `+t.recipe+`
|
|
1063
1063
|
`)),console.log(" Capsule Type: "+t.plan.capsuleType),console.log(" Capsule Name: "+t.plan.capsuleName),console.log(" Total Steps: "+t.plan.steps.total),console.log(" Step Breakdown:");for(let[e,r]of Object.entries(t.plan.steps.byAction))console.log(" "+e+": "+r);console.log(`
|