jaz-clio 4.55.4 → 4.55.5

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.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-api
3
- version: 4.55.4
3
+ version: 4.55.5
4
4
  description: >-
5
5
  Use this skill whenever you call, debug, or review code that touches the Jaz
6
6
  REST API. Covers field names, response shapes, 117 production gotchas, error
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-cli
3
- version: 4.55.4
3
+ version: 4.55.5
4
4
  description: >-
5
5
  Use this skill when running Clio CLI commands, building shell scripts with
6
6
  Clio, debugging auth issues, understanding --json output, paginating results,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-conversion
3
- version: 4.55.4
3
+ version: 4.55.5
4
4
  description: >-
5
5
  Use this skill when migrating accounting data into Jaz — importing from Xero,
6
6
  QuickBooks, Sage, MYOB, or Excel exports. Covers the full conversion pipeline:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-jobs
3
- version: 4.55.4
3
+ version: 4.55.5
4
4
  description: >-
5
5
  Use this skill for recurring accounting workflows — month/quarter/year-end
6
6
  close, bank reconciliation, GST/VAT filing, payment runs, credit control,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: jaz-recipes
3
- version: 4.55.4
3
+ version: 4.55.5
4
4
  description: >-
5
5
  Use this skill when modeling complex multi-step accounting transactions —
6
6
  anything that spans multiple periods, involves changing amounts, or requires
package/cli.mjs CHANGED
@@ -576,7 +576,7 @@ clio() {
576
576
  else
577
577
  "$clio_bin" "$@"
578
578
  fi
579
- }`}X();Te();function Az(e){e.command("org").description("Organization management").command("info").description("Show organization details").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(x(async(r,n)=>{let o=await kn(r);n.json?console.log(JSON.stringify(o,null,2)):(console.log(E("Organization:"),o.name),console.log(E("ID:"),o.resourceId),console.log(E("Currency:"),o.currency),console.log(E("Country:"),o.country),console.log(E("Status:"),o.status),o.lockDate&&console.log(E("Lock Date:"),o.lockDate),o.financialYearEnd!==void 0&&console.log(E("Fiscal Year End:"),`Month ${o.financialYearEnd}`))}))}Pc();async function OD(e,t){return e.list("/api/v1/items",t)}async function tp(e,t){return e.get(`/api/v1/items/${t}`)}async function uu(e,t){return e.search("/api/v1/items/search",t)}async function rp(e,t){let r={...t};return t.appliesToSale&&!r.saleItemName&&(r.saleItemName=t.internalName),t.appliesToPurchase&&!r.purchaseItemName&&(r.purchaseItemName=t.internalName),e.post("/api/v1/items",r)}async function ND(e,t,r){let o=(await tp(e,t)).data,i={itemCode:o.itemCode,internalName:o.internalName,appliesToSale:o.appliesToSale,appliesToPurchase:o.appliesToPurchase};return o.appliesToSale&&(o.saleItemName&&(i.saleItemName=o.saleItemName),o.salePrice!==void 0&&(i.salePrice=o.salePrice),o.saleAccountResourceId&&(i.saleAccountResourceId=o.saleAccountResourceId)),o.appliesToPurchase&&(o.purchaseItemName&&(i.purchaseItemName=o.purchaseItemName),o.purchasePrice!==void 0&&(i.purchaseItemPrice=o.purchasePrice),o.purchaseAccountResourceId&&(i.purchaseAccountResourceId=o.purchaseAccountResourceId)),Object.assign(i,r),e.put(`/api/v1/items/${t}`,i)}async function RD(e,t){await e.delete(`/api/v1/items/${t}`)}async function FD(e,t){return e.post("/api/v1/items/bulk-upsert",{items:t})}async function lu(e){return e.get("/api/v1/capsuleTypes")}async function np(e,t){return e.post("/api/v1/capsuleTypes",t)}async function kD(e,t){return e.list("/api/v1/capsules",t)}async function du(e,t){return e.search("/api/v1/capsules/search",t)}async function op(e,t){return e.get(`/api/v1/capsules/${t}`)}async function Aa(e,t){return e.post("/api/v1/capsules",t)}async function PD(e,t,r){let n=await op(e,t),o=n.data.capsuleType?.resourceId;if(!o)throw new Error(`Cannot update capsule ${t}: missing capsuleType.resourceId from GET response`);let i={resourceId:t,capsuleTypeResourceId:o,title:n.data.title,description:n.data.description,...r};return e.put(`/api/v1/capsules/${t}`,i)}async function LD(e,t){await e.delete(`/api/v1/capsules/${t}`)}async function pu(e,t){return e.list("/api/v1/tags",t)}async function MD(e,t){return e.get(`/api/v1/tags/${t}`)}async function jD(e,t){return e.search("/api/v1/tags/search",t)}async function ip(e,t){return e.post("/api/v1/tags",t)}async function BD(e,t,r){return e.put(`/api/v1/tags/${t}`,r)}async function UD(e,t){await e.delete(`/api/v1/tags/${t}`)}async function sp(e,t){if(!t)return;let r=await Mn(e,{filter:{name:{eq:t}},limit:1});return r.totalElements>0?r.data[0]:void 0}async function zD(e,t){if(!t)return;let r=await uu(e,{filter:{itemCode:{eq:t}},limit:1});return r.totalElements>0?r.data[0]:void 0}var Ble={"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"};function qD(e){if(typeof e!="string")return String(e??"");let t=e.trim();return Ble[t.toLowerCase()]??t}async function xz(e,t){if(!t?.trim())return;let r=t.trim().toLowerCase();return(await du(e,{filter:{title:{contains:t.trim()}},limit:20})).data.find(o=>o.title?.trim().toLowerCase()===r)}async function YD(e,t){if(!t)return;let r=await eu(e,{filter:{name:{eq:t}},limit:1});return r.totalElements>0?r.data[0]:void 0}async function JD(e,t){if(!t)return;let r=await ru(e,{filter:{name:{eq:t}},limit:1});return r.totalElements>0?r.data[0]:void 0}async function GD(e,t){if(!t)return;let r=t.toLowerCase().trim();return(await pu(e,{limit:500})).data.find(o=>o.name.toLowerCase().trim()===r)}Te();He();je();ut();We();X();var $z=["DRAFT","UNPAID","PARTIALLY_PAID","PAID","VOID"];var Tz=["DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED","VOID"],Oz=["DRAFT","ACTIVE","VOID"];var Nz=["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"],Rz=["CASH_TRANSFER","DIRECT_CASH_IN","DIRECT_CASH_OUT"],VD=["ACTIVE","INACTIVE"],Fz=["ACTIVE","INACTIVE"],kz=["ACTIVE","INACTIVE"],Pz=["INVENTORY","NON_INVENTORY"],HD=["PENDING","APPROVED"],Lz=["RECONCILED","UNRECONCILED","ARCHIVED","POSSIBLE_DUPLICATE"],UA=["PAYIN","PAYOUT"],ap=["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"],Mz=["ACTIVE","UNPAID","PARTIALLY_PAID","PAID","VOID","DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED"],jz=["ACTIVE","DRAFT","DISPOSED","SOLD","DISCARDED","COMPLETED","ONGOING"],Bz=["TANGIBLE","INTANGIBLE"];var Uz=["ACTIVE","INACTIVE"],zz=["ACTIVE","CANCELLED","INACTIVE"],qz=["ONE_TIME","DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"],Yz=["Asset","Liability","Equity","Revenue","Expense"],Jz=["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"],Gz=["TEXT","NUMBER","BOOLEAN","DATE","LINK"],Vz=["ADMIN","CUSTOM_USER"],Hz=["ACTIVE","INACTIVE"],Wz=["QUEUED","DISPATCHING","PROCESSING","SUCCESS","FAILED","PARTIAL_SUCCESS"],Zz=["CASH","CREDIT_CARD","BANK_TRANSFER","E_WALLET","CHEQUE","WITHHOLDING_TAX_CERTIFICATE","CLEARING_SETTLEMENT","DEBT_WRITE_OFF","INTER_COMPANY","OTHER","PAYMENT_GATEWAY"];function hs(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(!o[n[s]]||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];let i=n[n.length-1];o[i]&&typeof o[i]=="object"?Object.assign(o[i],r):o[i]=r}function Ule(e){return e.split(",").map(t=>t.trim()).filter(Boolean)}function cp(e,t,r){let n={};for(let[i,s]of Object.entries(t)){let a=e[i];if(!(a==null||a===""))switch(s.op){case"contains":hs(n,s.path,{contains:String(a)});break;case"eq":hs(n,s.path,{eq:a});break;case"gte":{let c=s.type==="number"?Xz(a):a;c!==void 0&&hs(n,s.path,{gte:c});break}case"lte":{let c=s.type==="number"?Xz(a):a;c!==void 0&&hs(n,s.path,{lte:c});break}case"boolean":hs(n,s.path,{eq:!!a});break;case"multi":{let c=Ule(String(a));c.length>1?hs(n,s.path,{in:c}):c.length===1&&hs(n,s.path,{eq:c[0]});break}case"array":hs(n,s.path,a);break}}let o=Object.keys(n).length>0?n:void 0;if(!(!r&&!o))return r?o?zle(r,o):r:o}function zle(e,t){let r={...e};for(let[n,o]of Object.entries(t)){let i=r[n];Kz(i)&&Kz(o)?r[n]={...i,...o}:r[n]=o}return r}function Kz(e){return!e||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).some(t=>t!==null&&typeof t=="object"&&!Array.isArray(t))}function Xz(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:void 0}async function up(e,t,r,n){return e(r??0,t??n)}var qle={type:"object",description:"Advanced: raw API filter JSON (merged with named params \u2014 named params win on conflict). Supports operators: eq, neq, contains, in, gt, gte, lt, lte, between, isNull, reg. Supports nested paths: contact.name, contact.taxId, account.code, approvedBy.email, attachments.resourceId."},Yle={type:"string",description:"Sort field name (default varies by entity)"},Jle={type:"string",description:"Sort direction",enum:["ASC","DESC"]},Gle={type:"number",description:"Max results per page (default 20, max 1000)"},Vle={type:"number",description:"Page number (0-indexed). Requires sort."},Hle={type:"string",description:'Jaz search expression (e.g. "status:unpaid AND $500+", "customer:acme AND date:-30d", "ref:INV-* AND currency:SGD"). Merged with named params \u2014 named params win on conflict. Supports: amounts ($500+, $100-500), dates (date:this month, due:overdue), status/enum fields, string fields (customer:, supplier:, ref:, tag:), boolean (hasattachment:yes), AND/OR/NOT logic, and inline sort (sort:amount:desc). Unknown fields return query_not_understood (400). Bad enum values return empty results silently.'};function Qz(e,t=!1){let r={};for(let[n,o]of Object.entries(e)){let i={type:o.type,description:o.description};o.enum&&(i.enum=[...o.enum]),o.type==="array"&&o.items&&(i.items=o.items),r[n]=i}return t&&(r.query=Hle),r.filter=qle,r.sortBy=Yle,r.sortOrder=Jle,r.limit=Gle,r.offset=Vle,r}function zA(e){let t=[];for(let[r,n]of Object.entries(e)){let o=n.cliFlag??Wle(r,n.type),i=n.cliFlag&&n.type!=="boolean"&&!o.includes("<")?`${o} <${o.replace(/^--/,"").split("-").pop()}>`:o;t.push([i,n.description,n.enum,r])}return t}function Wle(e,t){let r=e.replace(/([A-Z])/g,"-$1").toLowerCase();return t==="boolean"?`--${r}`:`--${r} <${r.split("-").pop()}>`}function Nt(e){let t=Qz(e.fields,e.defaults.supportsQuery);e.pathParam&&(t[e.pathParam]={type:"string",description:e.pathParamDescription??`${e.pathParam} (required)`}),e.extraParams&&Object.assign(t,e.extraParams);let r=[...e.pathParam?[e.pathParam]:[],...e.extraRequired??[]];return{name:e.name,description:e.description,params:t,required:r,group:e.group,readOnly:!0,isConcurrencySafe:!0,maxResultSizeChars:5e4,...e.searchHint?{searchHint:e.searchHint}:{},execute:async(n,o)=>{let i=o.limit,s=o.offset,a=o.sortBy??e.defaults.sortBy,c=o.sortOrder??e.defaults.sortOrder,u=o.query,l=o.filter,d=e.baseFilter?l?{...e.baseFilter,...l}:e.baseFilter:l,f=cp(o,e.fields,d),p={sortBy:[a],order:c},m=e.pathParam?(h,g)=>e.fetcher(n.client,o[e.pathParam],{filter:f,sort:p,limit:g,offset:h,query:u}):(h,g)=>e.fetcher(n.client,{filter:f,sort:p,limit:g,offset:h,query:u});return up(m,i,s,e.defaults.defaultLimit)}}}var qA,eq,tq,YA,rq;async function Zle(){if(!qA){let[e,t,r,n]=await Promise.all([Promise.resolve().then(()=>(Te(),N3)),Promise.resolve().then(()=>(ut(),v3)),Promise.resolve().then(()=>(He(),C3)),Promise.resolve().then(()=>(je(),B3))]);qA=e.apiAction,eq=t.paginatedFetch,tq=r.outputList,YA=n.parsePositiveInt,rq=n.parseNonNegativeInt}}function be(e){let t=e.commandName??"search",r=e.positionalArg?` <${e.positionalArg}>`:"",n=e.parent.command(`${t}${r}`).description(`Search ${e.label.replace("Searching ","")}`),o=new Map,i=zA(e.fields);for(let[a,c,u,l]of i){let d=new Om(a,c),f=e.fields[l];u&&f?.op!=="multi"&&d.choices(u),n.addOption(d);let p=Kle(a);p!==l&&o.set(p,l)}if(e.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 Om("--sort <field>","Sort field name")).addOption(new Om("--order <direction>","Sort direction").choices(["ASC","DESC"])).option("--limit <n>",`Max results (default ${e.defaults.defaultLimit})`).option("--offset <n>","Page number offset (0-indexed)").option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 10000)").option("--format <type>","Output format: table, json, csv, yaml").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON"),e.pathParam&&e.pathParam!==e.positionalArg){let a=e.pathParam.replace(/([A-Z])/g,"-$1").toLowerCase();n.requiredOption(`--${a} <id>`,e.pathParamDescription??`${e.pathParam} (required)`)}let s=async(...a)=>{let c=e.positionalArg?a[0]:void 0,u=e.positionalArg?a[1]:a[0];c&&e.positionalArg&&(u[e.positionalArg]=c),await Zle(),await qA(async l=>{e.preProcess&&await e.preProcess(l,u),typeof u.limit=="string"&&(u.limit=YA(u.limit)),typeof u.offset=="string"&&(u.offset=rq(u.offset)),typeof u.maxRows=="string"&&(u.maxRows=YA(u.maxRows));let d={...u};for(let[b,S]of o)d[b]!==void 0&&(d[S]=d[b]);let f;if(typeof u.filter=="string")try{f=JSON.parse(u.filter)}catch{throw new Error(`Invalid --filter JSON: ${u.filter}`)}let p=e.baseFilter?f?{...e.baseFilter,...f}:e.baseFilter:f,m=cp(d,e.fields,p),h;if(c&&e.positionalFilter){let b=e.positionalFilter(c);h=m?{...b,...m}:b}else h=m;let g={sortBy:[u.sort??e.defaults.sortBy],order:u.order??e.defaults.sortOrder},D=e.defaults.supportsQuery?u.query:void 0,v=e.pathParam?({limit:b,offset:S})=>e.fetcher(l,u[e.pathParam],{filter:h,sort:g,limit:b,offset:S,query:D}):({limit:b,offset:S})=>e.fetcher(l,{filter:h,sort:g,limit:b,offset:S,query:D}),y=await eq(u,v,{label:e.label,defaultLimit:e.defaults.defaultLimit});tq(y,e.columns,u,e.label.replace("Searching ",""))})(u)};return n.action(s),n}function Kle(e){return e.replace(/^--/,"").split(/[\s<]/)[0].replace(/-([a-z])/g,(r,n)=>n.toUpperCase())}var fu={reference:{path:"reference",op:"contains",type:"string",description:"Search by invoice reference number"},status:{path:"status",op:"multi",type:"string",description:"Filter by status (comma-separated for OR)",enum:$z},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by contact/customer name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Filter by contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Filter by currency code (e.g., SGD, USD)"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Filter by approval status",enum:HD},startDate:{path:"valueDate",op:"gte",type:"string",description:"Invoices on or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"Invoices on or before this date (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"}},mu={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},lp=fu,dp=mu;var gs={reference:{path:"reference",op:"contains",type:"string",description:"Search by credit note reference"},status:{path:"status",op:"multi",type:"string",description:"Filter by status (comma-separated for OR)",enum:Tz},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by contact name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Filter by contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Filter by currency code"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Filter by approval status",enum:HD},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>"}},hu={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},pp=hu;var fp={reference:{path:"reference",op:"contains",type:"string",description:"Search by journal reference"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Oz},type:{path:"type",op:"multi",type:"string",description:"Filter by journal type",enum:Nz},templateType:{path:"templateType",op:"multi",type:"string",description:"Filter by template type",enum:Rz},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by 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>"}},mp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0};var hp={name:{path:"name",op:"contains",type:"string",description:"Search by contact name"},email:{path:"email",op:"contains",type:"string",description:"Filter by email address"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:VD},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:"Filter by tax ID"}},gp={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Ai={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Filter by transaction type",enum:ap},direction:{path:"direction",op:"eq",type:"string",description:"Filter by direction (PAYIN or PAYOUT)",enum:UA},status:{path:"businessTransactionStatus",op:"multi",type:"string",description:"Filter by status",enum:Mz},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Filter by reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Filter by 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:ap}},xi={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},yp={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Filter by transaction type (SALE, PURCHASE, etc.)",enum:ap},direction:{path:"direction",op:"eq",type:"string",description:"Filter by direction",enum:UA},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Filter by reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Filter by 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:ap},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)"}},Dp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20};var bp={status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Lz},description:{path:"description",op:"contains",type:"string",description:"Search by description"},payer:{path:"extContactName",op:"contains",type:"string",description:"Filter by payer/payee name"},reference:{path:"extReference",op:"contains",type:"string",description:"Filter by 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"}},vp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0};var Sp={status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Fz},itemCategory:{path:"itemCategory",op:"eq",type:"string",description:"Filter by category",enum:Pz},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"}},Ep={sortBy:"internalName",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var _p={name:{path:"name",op:"contains",type:"string",description:"Search by asset name"},reference:{path:"reference",op:"contains",type:"string",description:"Filter by reference",cliFlag:"--ref <reference>"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:jz},category:{path:"category",op:"eq",type:"string",description:"Filter by category",enum:Bz},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},typeName:{path:"typeName",op:"contains",type:"string",description:"Filter by 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"}},Cp={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Ip={type:{path:"businessTransactionType",op:"eq",type:"string",description:"Filter by transaction type (SALE, PURCHASE, JOURNAL_MANUAL)"},status:{path:"status",op:"multi",type:"string",description:"Filter by scheduler status",enum:Uz},subscriptionStatus:{path:"subscriptionStatus",op:"multi",type:"string",description:"Filter by subscription status",enum:zz},schedulerType:{path:"schedulerType",op:"eq",type:"string",description:"Filter by scheduler type"},interval:{path:"interval",op:"eq",type:"string",description:"Filter by interval",enum:qz},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by contact name"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Filter by currency code"}},wp={sortBy:"nextScheduleDate",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Ap={id:{path:"resourceId",op:"eq",type:"string",description:"Filter by job ID (the jobId returned from bulk operations)",cliFlag:"--id"},status:{path:"status",op:"multi",type:"string",description:"Filter by job status",enum:Wz},type:{path:"jobType",op:"eq",type:"string",description:"Filter by job type (e.g. UPSERT_CONTACTS, UPSERT_ITEMS, PROCESS_BANK_STATEMENT_FILES)",cliFlag:"--type"},fileName:{path:"fileName",op:"contains",type:"string",description:"Filter by file name (file-based jobs only)",cliFlag:"--file-name"},from:{path:"createdAt",op:"gte",type:"string",description:"Created on or after (ISO date)",cliFlag:"--from"},to:{path:"createdAt",op:"lte",type:"string",description:"Created on or before (ISO date)",cliFlag:"--to"}},xp={sortBy:"createdAt",sortOrder:"DESC",defaultLimit:20};var $p={name:{path:"name",op:"contains",type:"string",description:"Search by account name"},code:{path:"code",op:"contains",type:"string",description:"Search by account code"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:kz},accountClass:{path:"accountClass",op:"eq",type:"string",description:"Filter by account class",enum:Yz},accountType:{path:"accountType",op:"eq",type:"string",description:"Filter by account type",enum:Jz},controlFlag:{path:"controlFlag",op:"boolean",type:"boolean",description:"Filter by control flag (system accounts)"}},Tp={sortBy:"code",sortOrder:"ASC",defaultLimit:100,supportsQuery:!0},Op={query:{path:"tagName",op:"contains",type:"string",description:"Search by tag name"}},Np={sortBy:"tagName",sortOrder:"ASC",defaultLimit:100},Rp={name:{path:"name",op:"contains",type:"string",description:"Search by tax profile name",cliFlag:"--name <name>"},taxTypeCode:{path:"taxTypeCode",op:"contains",type:"string",description:"Filter by 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"}},Fp={sortBy:"name",sortOrder:"ASC",defaultLimit:100,supportsQuery:!0},kp={title:{path:"title",op:"contains",type:"string",description:"Search by capsule title"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Hz}},Pp={sortBy:"title",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Lp={query:{path:"customFieldName",op:"contains",type:"string",description:"Search by custom field name",cliFlag:"--name <name>"},datatypeCode:{path:"datatypeCode",op:"eq",type:"string",description:"Filter by data type",enum:Gz,cliFlag:"--type <type>"},customFieldName:{path:"customFieldName",op:"contains",type:"string",description:"(alias for query)"}},Mp={sortBy:"customFieldName",sortOrder:"ASC",defaultLimit:100},jp={query:{path:"name",op:"contains",type:"string",description:"Search by group name"}},Bp={sortBy:"name",sortOrder:"ASC",defaultLimit:100},Up={query:{path:"name",op:"contains",type:"string",description:"Search by user name"},email:{path:"email",op:"contains",type:"string",description:"Filter by email"},role:{path:"role",op:"eq",type:"string",description:"Filter by role",enum:Vz},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:VD}},zp={sortBy:"name",sortOrder:"ASC",defaultLimit:50},qp={query:{path:"name",op:"contains",type:"string",description:"Search by rule name"},account:{path:"appliesToReconciliationAccount",op:"eq",type:"string",description:"Filter by bank account resourceId",cliFlag:"--account <id>"}},Yp={sortBy:"name",sortOrder:"ASC",defaultLimit:100},Jp={query:{path:"type",op:"contains",type:"string",description:"Search by classifier type"}},Gp={sortBy:"type",sortOrder:"ASC",defaultLimit:100};var nq=[{key:"resourceId",header:"ID",format:ne},{key:"code",header:"Code"},{key:"name",header:"Name"},{key:"accountType",header:"Type"}];function oq(e){let t=e.command("accounts").description("Chart of accounts");t.command("list").description("List accounts").option("--limit <n>","Max results (default 100)",j).option("--offset <n>","Page number offset (0-indexed)",fe).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 10000)",j).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=await se(n,i=>Ii(r,i),{label:"Fetching accounts"});oe(o,nq,n,"Accounts")})),be({parent:t,fields:$p,defaults:Tp,fetcher:eu,columns:nq,label:"Searching accounts",positionalArg:"name",positionalFilter:r=>({or:{name:{contains:r},code:{contains:r}}})}),t.command("create").description("Create a new account in the chart of accounts").option("--name <name>","Account name").option("--code <code>","Account code").option("--type <accountType>",'Account type (e.g. "Bank Accounts", "Revenue", "Expense")').option("--currency <code>","Currency code (defaults to org currency)").option("--status <status>","Account status (ACTIVE or INACTIVE)").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=q(n),i=o?.name??n.name;if(i){let a=await YD(r,i);if(a){n.json?console.log(JSON.stringify(a,null,2)):(console.log(Z(`Account "${i}" already exists`)),console.log(E("ID:"),a.resourceId));return}}let s;if(o)s=await Vd(r,o);else{ae(n,[{flag:"--name",key:"name"},{flag:"--code",key:"code"},{flag:"--type",key:"type"}]);let a={code:n.code,name:n.name,accountType:qD(n.type)};n.currency&&(a.currencyCode=n.currency),n.status&&(a.status=n.status),s=await Vd(r,a)}n.json?console.log(JSON.stringify(s.data,null,2)):(console.log($(`Account created: ${s.data.name} (${s.data.code})`)),console.log(E("ID:"),s.data.resourceId))})),t.command("delete <resourceId>").description("Delete an account from the chart of accounts").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)=>x(async o=>{await mD(o,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log($(`Account ${r} deleted.`))})(n))}X();Te();He();je();ut();We();var iq=[{key:"resourceId",header:"ID",format:ne},{key:"billingName",header:"Name"},{key:"customer",header:"Customer",format:e=>e?"Yes":"-"},{key:"supplier",header:"Supplier",format:e=>e?"Yes":"-"}];function sq(e){let t=e.command("contacts").description("Manage contacts (customers & suppliers)");t.command("list").description("List contacts").option("--limit <n>","Max results (default 100)",j).option("--offset <n>","Page number offset (0-indexed)",fe).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 10000)",j).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=await se(n,i=>Qi(r,i),{label:"Fetching contacts"});oe(o,iq,n,"Contacts")})),be({parent:t,fields:hp,defaults:gp,fetcher:Mn,columns:iq,label:"Searching contacts"}),t.command("get <resourceId>").description("Get a contact by resourceId").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)=>x(async o=>{let s=(await ga(o,r)).data;if(n.json)console.log(JSON.stringify(s,null,2));else{console.log(E("Name:"),s.billingName),s.name&&s.name!==s.billingName&&console.log(E("Display Name:"),s.name),console.log(E("ID:"),s.resourceId),s.emails?.length&&console.log(E("Email:"),s.emails.join(", ")),s.taxId&&console.log(E("Tax Reg:"),s.taxId);let a=[s.customer&&"Customer",s.supplier&&"Supplier"].filter(Boolean).join(", ");a&&console.log(E("Roles:"),a),s.status&&console.log(E("Status:"),s.status)}})(n)),t.command("create").description("Create a new contact").option("--name <name>","Contact name (used for both name and billingName)").option("--email <email>","Email address").option("--customer","Mark as customer").option("--supplier","Mark as supplier").option("--tax-reg <number>","Tax registration number").option("--phone <phone>","Phone number (E.164 format)").option("--currency <code>","Currency code (ISO 4217)").option("--payment-terms <days>","Payment term in days",j).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=q(n),i=o?.name??n.name;if(i){let a=await sp(r,i);if(a){n.json?console.log(JSON.stringify(a,null,2)):(console.log(Z(`Contact "${i}" already exists`)),console.log(E("ID:"),a.resourceId));return}}let s;o?s=await kc(r,o):(ae(n,[{flag:"--name",key:"name"}]),s=await kc(r,{billingName:n.name,name:n.name,emails:n.email?[n.email]:void 0,customer:n.customer??!1,supplier:n.supplier??!1,taxId:n.taxReg,phone:n.phone,currencyCode:n.currency,customerPaymentTerms:n.paymentTerms!=null?String(n.paymentTerms):void 0})),n.json?console.log(JSON.stringify(s.data,null,2)):(console.log($(`Contact created: ${s.data.billingName}`)),console.log(E("ID:"),s.data.resourceId))})),t.command("update <resourceId>").description("Update a contact").option("--name <name>","New billing name").option("--email <email>","New email address").option("--customer","Set as customer").option("--no-customer","Unset as customer").option("--supplier","Set as supplier").option("--no-supplier","Unset as supplier").option("--tax-reg <number>","Tax registration number").option("--phone <phone>","Phone number").option("--status <status>","Status (ACTIVE/INACTIVE)").option("--input <file>","Read full update body from JSON file (or pipe via stdin)").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)=>x(async o=>{let i=q(n),s;i?s=i:(s={},n.name!==void 0&&(s.billingName=n.name,s.name=n.name),n.email!==void 0&&(s.emails=[n.email]),n.customer!==void 0&&(s.customer=n.customer),n.supplier!==void 0&&(s.supplier=n.supplier),n.taxReg!==void 0&&(s.taxId=n.taxReg),n.phone!==void 0&&(s.phone=n.phone),n.status!==void 0&&(s.status=n.status));let a=await ty(o,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log($(`Contact updated: ${a.data.billingName}`))})(n)),t.command("delete <resourceId>").description("Delete a contact").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)=>x(async o=>{await ry(o,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log($(`Contact ${r} deleted.`))})(n)),t.command("bulk-upsert").description("Create or update contacts in bulk (max 500). Provide resourceId per contact to update, omit to create. Returns a jobId \u2014 poll with `clio background-jobs get <jobId>` to check progress.").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(x(async(r,n)=>{let o=q(n);o||(console.error('Error: --input <file> is required (JSON with { "contacts": [...] } or a bare array)'),process.exit(1));let i=o.contacts??o;Array.isArray(i)||(console.error('Error: expected { "contacts": [...] } or a JSON array'),process.exit(1)),i.length===0&&(console.error("Error: contacts array is empty."),process.exit(1)),i.length>500&&(console.error(`Error: max 500 contacts per call (got ${i.length}). Split into batches.`),process.exit(1));let s=await ny(r,i);n.json?console.log(JSON.stringify(s.data,null,2)):(console.log($(`Bulk upsert started. Job ID: ${s.data.jobId}`)),console.log(Z(` Poll progress: clio background-jobs get ${s.data.jobId}`)))}))}X();We();async function WD(e,t){return e.list("/api/v1/invoices",t)}async function ro(e,t){let r=await e.get(`/api/v1/invoices/${t}`);return"data"in r&&typeof r.data=="object"?r:{data:r}}async function gu(e,t){return e.search("/api/v1/invoices/search",t)}async function xa(e,t){return e.post("/api/v1/invoices",{...t,saveAsDraft:t.saveAsDraft??!0})}async function ZD(e,t,r){return e.put(`/api/v1/invoices/${t}`,r)}async function KD(e,t){await e.delete(`/api/v1/invoices/${t}`)}async function Vp(e,t,r){return e.post(`/api/v1/invoices/${t}/payments`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function Hp(e,t){return e.post("/api/v1/scheduled/invoices",t)}async function XD(e,t,r){return e.post(`/api/v1/invoices/${t}/credits`,{credits:r})}async function Wp(e,t,r){return e.put(`/api/v1/invoices/${t}`,{...r,resourceId:t,saveAsDraft:!1})}async function QD(e,t){return e.get(`/api/v1/invoices/${t}/download`)}async function e0(e,t){let r=await e.get(`/api/v1/invoices/${t}/payments`);return{data:Array.isArray(r)?r:r.data??[]}}async function t0(e,t){let r=await e.get(`/api/v1/invoices/${t}/credits`);return{data:Array.isArray(r)?r:r.data??[]}}async function r0(e,t,r){await e.delete(`/api/v1/invoices/${t}/credits/${r}`)}async function Bt(e,t,r){let n=await e.get(`/api/v1/${t}/${r}/attachments`),o=n?.attachments??n?.data;return{data:Array.isArray(o)?o.map(s=>({...s,resourceId:s.resourceId??s.attachmentResourceId??""})):[]}}async function n0(e,t){let{businessTransactionType:r,businessTransactionResourceId:n,...o}=t,i=new FormData;return o.file&&i.append("file",o.file,o.fileName??"file"),o.attachmentId&&i.append("attachmentId",o.attachmentId),e.postMultipart(`/api/v1/${r}/${n}/attachments`,i)}async function o0(e,t,r,n){return e.delete(`/api/v1/${t}/${r}/attachments/${n}`)}async function i0(e,t){return e.get(`/api/v1/attachments/${t}/table`)}Te();je();ut();He();X();je();var Sn=[{field:"contactResourceId",label:"Contact",hint:"--contact <name or UUID>",check:e=>!!e.contactResourceId},{field:"valueDate",label:"Date",hint:"--date <YYYY-MM-DD>",check:e=>!!e.valueDate},{field:"dueDate",label:"Due date",hint:"--due <YYYY-MM-DD>",check:e=>!!e.dueDate},{field:"lineItems",label:"Line items",hint:"--lines <json>",check:e=>e.lineItems?.length>0},{field:"name",label:"Item name",hint:"via --lines",check:e=>!!e.name,perLineItem:!0},{field:"unitPrice",label:"Unit price",hint:"via --lines",check:e=>e.unitPrice!=null,perLineItem:!0},{field:"accountResourceId",label:"Account",hint:"--account <name or UUID>",check:e=>!!(e.accountResourceId||e.organizationAccountResourceId),perLineItem:!0}],no=[...Sn],ur=Sn.filter(e=>e.field!=="dueDate"),$o=[{field:"valueDate",label:"Date",hint:"--date <YYYY-MM-DD>",check:e=>!!e.valueDate},{field:"journalEntries",label:"Journal entries",hint:"--entries <json>",check:e=>e.journalEntries?.length>0},{field:"accountResourceId",label:"Account",hint:"--account <name or UUID>",check:e=>!!(e.accountResourceId||e.organizationAccountResourceId),perLineItem:!0},{field:"amount",label:"Amount",hint:"via --entries",check:e=>e.amount!=null&&e.amount>0||e.debitAmount!=null&&e.debitAmount>0||e.creditAmount!=null&&e.creditAmount>0,perLineItem:!0}];function sn(e,t,r="lineItems"){let n=[];for(let o of t)if(o.perLineItem){let i=e[r]??[];for(let s=0;s<i.length;s++)o.check(i[s])||n.push(`${r}[${s}].${o.field}`)}else o.check(e)||n.push(o.field);return{missingFields:n,missingCount:n.length,ready:n.length===0}}function gr(e,t,r="lineItems"){let n=t.filter(a=>!a.perLineItem),o=t.filter(a=>a.perLineItem),i={valueDate:JA(e,"valueDate","Date","--date <YYYY-MM-DD>",n),lineItems:[]};n.some(a=>a.field==="contactResourceId")&&(i.contact=JA(e,"contactResourceId","Contact","--contact <name or UUID>",n)),n.some(a=>a.field==="dueDate")&&(i.dueDate=JA(e,"dueDate","Due date","--due <YYYY-MM-DD>",n));let s=e[r]??[];return i.lineItems=s.map((a,c)=>{let u=a.accountResourceId||a.organizationAccountResourceId,l=u?{status:"ok",resourceId:u}:{status:"missing",hint:"--account <name or UUID>"};if(r==="journalEntries"){let h=o.find(S=>S.field==="amount"),g=h?h.check(a):!0,D=a.amount??a.debitAmount??a.creditAmount??null,v=a.debitAmount,y=a.creditAmount,b=a.type??(typeof v=="number"&&v>0?"DEBIT":typeof y=="number"&&y>0?"CREDIT":null);return{index:c,name:a.description||b||null,nameStatus:"ok",unitPrice:D,unitPriceStatus:g?"ok":"missing",account:l}}let d=o.find(h=>h.field==="name"),f=o.find(h=>h.field==="unitPrice"),p=d?d.check(a):!0,m=f?f.check(a):!0;return{index:c,name:a.name||null,nameStatus:p?"ok":"missing",unitPrice:a.unitPrice??null,unitPriceStatus:m?"ok":"missing",account:l}}),i}function JA(e,t,r,n,o){let i=o.find(s=>s.field===t);if(!i){let s=e[t];return s?{status:"ok",value:s}:{status:"ok"}}if(i.check(e)){let s=e[t];return t==="contactResourceId"?{status:"ok",value:e.contactName||s,resourceId:s}:{status:"ok",value:s}}return{status:"missing",hint:n}}function wr(e,t,r,n="lineItems"){let{missingFields:o,missingCount:i,ready:s}=sn(e,t,n),a=gr(e,t,n);return{resourceId:e.resourceId,reference:e.reference||null,totalAmount:e.totalAmount??0,attachmentCount:r,ready:s,missingCount:i,missingFields:o,validation:a}}function oo(e){let t={};e.name!=null&&(t.name=e.name),e.quantity!=null&&(t.quantity=e.quantity),e.unitPrice!=null&&(t.unitPrice=e.unitPrice),e.unit&&(t.unit=e.unit);let r=e.accountResourceId||e.organizationAccountResourceId;r&&(t.accountResourceId=r);let n=e.taxProfileResourceId||(e.taxProfile&&typeof e.taxProfile=="object"?e.taxProfile.resourceId:null);return n&&(t.taxProfileResourceId=n),e.itemResourceId&&(t.itemResourceId=e.itemResourceId),e.discount!=null&&(t.discount=typeof e.discount=="object"?e.discount.rateValue??0:e.discount),t}function yu(e){let t={},r=e.accountResourceId||e.organizationAccountResourceId;return r&&(t.accountResourceId=r),e.amount!=null?t.amount=e.amount:e.debitAmount!=null&&e.debitAmount>0?t.amount=e.debitAmount:e.creditAmount!=null&&e.creditAmount>0&&(t.amount=e.creditAmount),e.type?t.type=e.type:e.debitAmount!=null&&e.debitAmount>0?t.type="DEBIT":e.creditAmount!=null&&e.creditAmount>0&&(t.type="CREDIT"),e.description&&(t.description=e.description),e.contactResourceId&&(t.contactResourceId=e.contactResourceId),t}function Be(e){if(e)return e.split("T")[0]}function Xo(e,t){let r={};if(t.contact&&(r.contactResourceId=t.contact),t.date&&(r.valueDate=t.date),t.due&&(r.dueDate=t.due),t.ref!==void 0&&(r.reference=t.ref),t.notes!==void 0&&(r.notes=t.notes),t.tag!==void 0&&(r.tag=t.tag),t.tax&&(r.isTaxVatApplicable=!0),t.tax&&t.taxInclusive?r.taxInclusion=!0:t.tax&&(r.taxInclusion=!1),t.lines)r.lineItems=t.lines;else if(t.account||t.taxProfile){let n=e.lineItems??[];r.lineItems=n.map(o=>{let i=oo(o);return t.account&&!i.accountResourceId&&(i.accountResourceId=t.account),t.taxProfile&&!i.taxProfileResourceId&&(i.taxProfileResourceId=t.taxProfile),i})}return r}function s0(e,t){let r={};if(t.date&&(r.valueDate=t.date),t.ref!==void 0&&(r.reference=t.ref),t.notes!==void 0&&(r.notes=t.notes),t.entries)r.journalEntries=t.entries;else if(t.account){let n=e.journalEntries??[];r.journalEntries=n.map(o=>{let i=yu(o);return t.account&&!i.accountResourceId&&(i.accountResourceId=t.account),i})}return r}function Qo(e,t){let r=t.filter(i=>i.ready).length,n=t.length-r;if(t.length===0){console.log(`No draft ${e.toLowerCase()} found.`);return}let o=r===t.length?$(`${t.length} drafts, all ready`):`${t.length} drafts, ${$(`${r} ready`)}, ${G(`${n} need attention`)}`;console.log(E(`Draft ${e} \u2014 ${o}
579
+ }`}X();Te();function Az(e){e.command("org").description("Organization management").command("info").description("Show organization details").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(x(async(r,n)=>{let o=await kn(r);n.json?console.log(JSON.stringify(o,null,2)):(console.log(E("Organization:"),o.name),console.log(E("ID:"),o.resourceId),console.log(E("Currency:"),o.currency),console.log(E("Country:"),o.country),console.log(E("Status:"),o.status),o.lockDate&&console.log(E("Lock Date:"),o.lockDate),o.financialYearEnd!==void 0&&console.log(E("Fiscal Year End:"),`Month ${o.financialYearEnd}`))}))}Pc();async function OD(e,t){return e.list("/api/v1/items",t)}async function tp(e,t){return e.get(`/api/v1/items/${t}`)}async function uu(e,t){return e.search("/api/v1/items/search",t)}async function rp(e,t){let r={...t};return t.appliesToSale&&!r.saleItemName&&(r.saleItemName=t.internalName),t.appliesToPurchase&&!r.purchaseItemName&&(r.purchaseItemName=t.internalName),e.post("/api/v1/items",r)}async function ND(e,t,r){let o=(await tp(e,t)).data,i={itemCode:o.itemCode,internalName:o.internalName,appliesToSale:o.appliesToSale,appliesToPurchase:o.appliesToPurchase};return o.appliesToSale&&(o.saleItemName&&(i.saleItemName=o.saleItemName),o.salePrice!==void 0&&(i.salePrice=o.salePrice),o.saleAccountResourceId&&(i.saleAccountResourceId=o.saleAccountResourceId)),o.appliesToPurchase&&(o.purchaseItemName&&(i.purchaseItemName=o.purchaseItemName),o.purchasePrice!==void 0&&(i.purchaseItemPrice=o.purchasePrice),o.purchaseAccountResourceId&&(i.purchaseAccountResourceId=o.purchaseAccountResourceId)),Object.assign(i,r),e.put(`/api/v1/items/${t}`,i)}async function RD(e,t){await e.delete(`/api/v1/items/${t}`)}async function FD(e,t){return e.post("/api/v1/items/bulk-upsert",{items:t})}async function lu(e){return e.get("/api/v1/capsuleTypes")}async function np(e,t){return e.post("/api/v1/capsuleTypes",t)}async function kD(e,t){return e.list("/api/v1/capsules",t)}async function du(e,t){return e.search("/api/v1/capsules/search",t)}async function op(e,t){return e.get(`/api/v1/capsules/${t}`)}async function Aa(e,t){return e.post("/api/v1/capsules",t)}async function PD(e,t,r){let n=await op(e,t),o=n.data.capsuleType?.resourceId;if(!o)throw new Error(`Cannot update capsule ${t}: missing capsuleType.resourceId from GET response`);let i={resourceId:t,capsuleTypeResourceId:o,title:n.data.title,description:n.data.description,...r};return e.put(`/api/v1/capsules/${t}`,i)}async function LD(e,t){await e.delete(`/api/v1/capsules/${t}`)}async function pu(e,t){return e.list("/api/v1/tags",t)}async function MD(e,t){return e.get(`/api/v1/tags/${t}`)}async function jD(e,t){return e.search("/api/v1/tags/search",t)}async function ip(e,t){return e.post("/api/v1/tags",t)}async function BD(e,t,r){return e.put(`/api/v1/tags/${t}`,r)}async function UD(e,t){await e.delete(`/api/v1/tags/${t}`)}async function sp(e,t){return t?(await Mn(e,{filter:{name:{eq:t}},limit:5})).data.find(n=>n.name===t):void 0}async function zD(e,t){return t?(await uu(e,{filter:{itemCode:{eq:t}},limit:5})).data.find(n=>n.itemCode===t):void 0}var Ble={"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"};function qD(e){if(typeof e!="string")return String(e??"");let t=e.trim();return Ble[t.toLowerCase()]??t}async function xz(e,t){if(!t?.trim())return;let r=t.trim().toLowerCase();return(await du(e,{filter:{title:{contains:t.trim()}},limit:20})).data.find(o=>o.title?.trim().toLowerCase()===r)}async function YD(e,t){return t?(await eu(e,{filter:{name:{eq:t}},limit:5})).data.find(n=>n.name===t):void 0}async function JD(e,t){return t?(await ru(e,{filter:{name:{eq:t}},limit:5})).data.find(n=>n.name===t):void 0}async function GD(e,t){if(!t)return;let r=t.toLowerCase().trim();return(await pu(e,{limit:500})).data.find(o=>o.name.toLowerCase().trim()===r)}Te();He();je();ut();We();X();var $z=["DRAFT","UNPAID","PARTIALLY_PAID","PAID","VOID"];var Tz=["DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED","VOID"],Oz=["DRAFT","ACTIVE","VOID"];var Nz=["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"],Rz=["CASH_TRANSFER","DIRECT_CASH_IN","DIRECT_CASH_OUT"],VD=["ACTIVE","INACTIVE"],Fz=["ACTIVE","INACTIVE"],kz=["ACTIVE","INACTIVE"],Pz=["INVENTORY","NON_INVENTORY"],HD=["PENDING","APPROVED"],Lz=["RECONCILED","UNRECONCILED","ARCHIVED","POSSIBLE_DUPLICATE"],UA=["PAYIN","PAYOUT"],ap=["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"],Mz=["ACTIVE","UNPAID","PARTIALLY_PAID","PAID","VOID","DRAFT","UNAPPLIED","PARTIALLY_APPLIED","APPLIED"],jz=["ACTIVE","DRAFT","DISPOSED","SOLD","DISCARDED","COMPLETED","ONGOING"],Bz=["TANGIBLE","INTANGIBLE"];var Uz=["ACTIVE","INACTIVE"],zz=["ACTIVE","CANCELLED","INACTIVE"],qz=["ONE_TIME","DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"],Yz=["Asset","Liability","Equity","Revenue","Expense"],Jz=["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"],Gz=["TEXT","NUMBER","BOOLEAN","DATE","LINK"],Vz=["ADMIN","CUSTOM_USER"],Hz=["ACTIVE","INACTIVE"],Wz=["QUEUED","DISPATCHING","PROCESSING","SUCCESS","FAILED","PARTIAL_SUCCESS"],Zz=["CASH","CREDIT_CARD","BANK_TRANSFER","E_WALLET","CHEQUE","WITHHOLDING_TAX_CERTIFICATE","CLEARING_SETTLEMENT","DEBT_WRITE_OFF","INTER_COMPANY","OTHER","PAYMENT_GATEWAY"];function hs(e,t,r){let n=t.split("."),o=e;for(let s=0;s<n.length-1;s++)(!o[n[s]]||typeof o[n[s]]!="object")&&(o[n[s]]={}),o=o[n[s]];let i=n[n.length-1];o[i]&&typeof o[i]=="object"?Object.assign(o[i],r):o[i]=r}function Ule(e){return e.split(",").map(t=>t.trim()).filter(Boolean)}function cp(e,t,r){let n={};for(let[i,s]of Object.entries(t)){let a=e[i];if(!(a==null||a===""))switch(s.op){case"contains":hs(n,s.path,{contains:String(a)});break;case"eq":hs(n,s.path,{eq:a});break;case"gte":{let c=s.type==="number"?Xz(a):a;c!==void 0&&hs(n,s.path,{gte:c});break}case"lte":{let c=s.type==="number"?Xz(a):a;c!==void 0&&hs(n,s.path,{lte:c});break}case"boolean":hs(n,s.path,{eq:!!a});break;case"multi":{let c=Ule(String(a));c.length>1?hs(n,s.path,{in:c}):c.length===1&&hs(n,s.path,{eq:c[0]});break}case"array":hs(n,s.path,a);break}}let o=Object.keys(n).length>0?n:void 0;if(!(!r&&!o))return r?o?zle(r,o):r:o}function zle(e,t){let r={...e};for(let[n,o]of Object.entries(t)){let i=r[n];Kz(i)&&Kz(o)?r[n]={...i,...o}:r[n]=o}return r}function Kz(e){return!e||typeof e!="object"||Array.isArray(e)?!1:Object.values(e).some(t=>t!==null&&typeof t=="object"&&!Array.isArray(t))}function Xz(e){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:void 0}async function up(e,t,r,n){return e(r??0,t??n)}var qle={type:"object",description:"Advanced: raw API filter JSON (merged with named params \u2014 named params win on conflict). Supports operators: eq, neq, contains, in, gt, gte, lt, lte, between, isNull, reg. Supports nested paths: contact.name, contact.taxId, account.code, approvedBy.email, attachments.resourceId."},Yle={type:"string",description:"Sort field name (default varies by entity)"},Jle={type:"string",description:"Sort direction",enum:["ASC","DESC"]},Gle={type:"number",description:"Max results per page (default 20, max 1000)"},Vle={type:"number",description:"Page number (0-indexed). Requires sort."},Hle={type:"string",description:'Jaz search expression (e.g. "status:unpaid AND $500+", "customer:acme AND date:-30d", "ref:INV-* AND currency:SGD"). Merged with named params \u2014 named params win on conflict. Supports: amounts ($500+, $100-500), dates (date:this month, due:overdue), status/enum fields, string fields (customer:, supplier:, ref:, tag:), boolean (hasattachment:yes), AND/OR/NOT logic, and inline sort (sort:amount:desc). Unknown fields return query_not_understood (400). Bad enum values return empty results silently.'};function Qz(e,t=!1){let r={};for(let[n,o]of Object.entries(e)){let i={type:o.type,description:o.description};o.enum&&(i.enum=[...o.enum]),o.type==="array"&&o.items&&(i.items=o.items),r[n]=i}return t&&(r.query=Hle),r.filter=qle,r.sortBy=Yle,r.sortOrder=Jle,r.limit=Gle,r.offset=Vle,r}function zA(e){let t=[];for(let[r,n]of Object.entries(e)){let o=n.cliFlag??Wle(r,n.type),i=n.cliFlag&&n.type!=="boolean"&&!o.includes("<")?`${o} <${o.replace(/^--/,"").split("-").pop()}>`:o;t.push([i,n.description,n.enum,r])}return t}function Wle(e,t){let r=e.replace(/([A-Z])/g,"-$1").toLowerCase();return t==="boolean"?`--${r}`:`--${r} <${r.split("-").pop()}>`}function Nt(e){let t=Qz(e.fields,e.defaults.supportsQuery);e.pathParam&&(t[e.pathParam]={type:"string",description:e.pathParamDescription??`${e.pathParam} (required)`}),e.extraParams&&Object.assign(t,e.extraParams);let r=[...e.pathParam?[e.pathParam]:[],...e.extraRequired??[]];return{name:e.name,description:e.description,params:t,required:r,group:e.group,readOnly:!0,isConcurrencySafe:!0,maxResultSizeChars:5e4,...e.searchHint?{searchHint:e.searchHint}:{},execute:async(n,o)=>{let i=o.limit,s=o.offset,a=o.sortBy??e.defaults.sortBy,c=o.sortOrder??e.defaults.sortOrder,u=o.query,l=o.filter,d=e.baseFilter?l?{...e.baseFilter,...l}:e.baseFilter:l,f=cp(o,e.fields,d),p={sortBy:[a],order:c},m=e.pathParam?(h,g)=>e.fetcher(n.client,o[e.pathParam],{filter:f,sort:p,limit:g,offset:h,query:u}):(h,g)=>e.fetcher(n.client,{filter:f,sort:p,limit:g,offset:h,query:u});return up(m,i,s,e.defaults.defaultLimit)}}}var qA,eq,tq,YA,rq;async function Zle(){if(!qA){let[e,t,r,n]=await Promise.all([Promise.resolve().then(()=>(Te(),N3)),Promise.resolve().then(()=>(ut(),v3)),Promise.resolve().then(()=>(He(),C3)),Promise.resolve().then(()=>(je(),B3))]);qA=e.apiAction,eq=t.paginatedFetch,tq=r.outputList,YA=n.parsePositiveInt,rq=n.parseNonNegativeInt}}function be(e){let t=e.commandName??"search",r=e.positionalArg?` <${e.positionalArg}>`:"",n=e.parent.command(`${t}${r}`).description(`Search ${e.label.replace("Searching ","")}`),o=new Map,i=zA(e.fields);for(let[a,c,u,l]of i){let d=new Om(a,c),f=e.fields[l];u&&f?.op!=="multi"&&d.choices(u),n.addOption(d);let p=Kle(a);p!==l&&o.set(p,l)}if(e.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 Om("--sort <field>","Sort field name")).addOption(new Om("--order <direction>","Sort direction").choices(["ASC","DESC"])).option("--limit <n>",`Max results (default ${e.defaults.defaultLimit})`).option("--offset <n>","Page number offset (0-indexed)").option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 10000)").option("--format <type>","Output format: table, json, csv, yaml").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON"),e.pathParam&&e.pathParam!==e.positionalArg){let a=e.pathParam.replace(/([A-Z])/g,"-$1").toLowerCase();n.requiredOption(`--${a} <id>`,e.pathParamDescription??`${e.pathParam} (required)`)}let s=async(...a)=>{let c=e.positionalArg?a[0]:void 0,u=e.positionalArg?a[1]:a[0];c&&e.positionalArg&&(u[e.positionalArg]=c),await Zle(),await qA(async l=>{e.preProcess&&await e.preProcess(l,u),typeof u.limit=="string"&&(u.limit=YA(u.limit)),typeof u.offset=="string"&&(u.offset=rq(u.offset)),typeof u.maxRows=="string"&&(u.maxRows=YA(u.maxRows));let d={...u};for(let[b,S]of o)d[b]!==void 0&&(d[S]=d[b]);let f;if(typeof u.filter=="string")try{f=JSON.parse(u.filter)}catch{throw new Error(`Invalid --filter JSON: ${u.filter}`)}let p=e.baseFilter?f?{...e.baseFilter,...f}:e.baseFilter:f,m=cp(d,e.fields,p),h;if(c&&e.positionalFilter){let b=e.positionalFilter(c);h=m?{...b,...m}:b}else h=m;let g={sortBy:[u.sort??e.defaults.sortBy],order:u.order??e.defaults.sortOrder},D=e.defaults.supportsQuery?u.query:void 0,v=e.pathParam?({limit:b,offset:S})=>e.fetcher(l,u[e.pathParam],{filter:h,sort:g,limit:b,offset:S,query:D}):({limit:b,offset:S})=>e.fetcher(l,{filter:h,sort:g,limit:b,offset:S,query:D}),y=await eq(u,v,{label:e.label,defaultLimit:e.defaults.defaultLimit});tq(y,e.columns,u,e.label.replace("Searching ",""))})(u)};return n.action(s),n}function Kle(e){return e.replace(/^--/,"").split(/[\s<]/)[0].replace(/-([a-z])/g,(r,n)=>n.toUpperCase())}var fu={reference:{path:"reference",op:"contains",type:"string",description:"Search by invoice reference number"},status:{path:"status",op:"multi",type:"string",description:"Filter by status (comma-separated for OR)",enum:$z},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by contact/customer name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Filter by contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Filter by currency code (e.g., SGD, USD)"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Filter by approval status",enum:HD},startDate:{path:"valueDate",op:"gte",type:"string",description:"Invoices on or after this date (YYYY-MM-DD)",cliFlag:"--from <date>"},endDate:{path:"valueDate",op:"lte",type:"string",description:"Invoices on or before this date (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"}},mu={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},lp=fu,dp=mu;var gs={reference:{path:"reference",op:"contains",type:"string",description:"Search by credit note reference"},status:{path:"status",op:"multi",type:"string",description:"Filter by status (comma-separated for OR)",enum:Tz},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by contact name"},contactId:{path:"contactResourceId",op:"eq",type:"string",description:"Filter by contact resourceId"},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Filter by currency code"},approvalStatus:{path:"approvalStatus",op:"multi",type:"string",description:"Filter by approval status",enum:HD},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>"}},hu={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},pp=hu;var fp={reference:{path:"reference",op:"contains",type:"string",description:"Search by journal reference"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Oz},type:{path:"type",op:"multi",type:"string",description:"Filter by journal type",enum:Nz},templateType:{path:"templateType",op:"multi",type:"string",description:"Filter by template type",enum:Rz},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by 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>"}},mp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0};var hp={name:{path:"name",op:"contains",type:"string",description:"Search by contact name"},email:{path:"email",op:"contains",type:"string",description:"Filter by email address"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:VD},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:"Filter by tax ID"}},gp={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Ai={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Filter by transaction type",enum:ap},direction:{path:"direction",op:"eq",type:"string",description:"Filter by direction (PAYIN or PAYOUT)",enum:UA},status:{path:"businessTransactionStatus",op:"multi",type:"string",description:"Filter by status",enum:Mz},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Filter by reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Filter by 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:ap}},xi={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0},yp={type:{path:"businessTransactionType",op:"multi",type:"string",description:"Filter by transaction type (SALE, PURCHASE, etc.)",enum:ap},direction:{path:"direction",op:"eq",type:"string",description:"Filter by direction",enum:UA},reference:{path:"businessTransactionReference",op:"contains",type:"string",description:"Filter by reference",cliFlag:"--ref <reference>"},accountId:{path:"organizationAccountResourceId",op:"eq",type:"string",description:"Filter by 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:ap},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)"}},Dp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20};var bp={status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Lz},description:{path:"description",op:"contains",type:"string",description:"Search by description"},payer:{path:"extContactName",op:"contains",type:"string",description:"Filter by payer/payee name"},reference:{path:"extReference",op:"contains",type:"string",description:"Filter by 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"}},vp={sortBy:"valueDate",sortOrder:"DESC",defaultLimit:20,supportsQuery:!0};var Sp={status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Fz},itemCategory:{path:"itemCategory",op:"eq",type:"string",description:"Filter by category",enum:Pz},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"}},Ep={sortBy:"internalName",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var _p={name:{path:"name",op:"contains",type:"string",description:"Search by asset name"},reference:{path:"reference",op:"contains",type:"string",description:"Filter by reference",cliFlag:"--ref <reference>"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:jz},category:{path:"category",op:"eq",type:"string",description:"Filter by category",enum:Bz},tag:{path:"tags.name",op:"eq",type:"string",description:"Filter by tag name",cliFlag:"--tag <name>"},typeName:{path:"typeName",op:"contains",type:"string",description:"Filter by 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"}},Cp={sortBy:"name",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Ip={type:{path:"businessTransactionType",op:"eq",type:"string",description:"Filter by transaction type (SALE, PURCHASE, JOURNAL_MANUAL)"},status:{path:"status",op:"multi",type:"string",description:"Filter by scheduler status",enum:Uz},subscriptionStatus:{path:"subscriptionStatus",op:"multi",type:"string",description:"Filter by subscription status",enum:zz},schedulerType:{path:"schedulerType",op:"eq",type:"string",description:"Filter by scheduler type"},interval:{path:"interval",op:"eq",type:"string",description:"Filter by interval",enum:qz},contactName:{path:"contact.name",op:"contains",type:"string",description:"Filter by contact name"},currencyCode:{path:"currencyCode",op:"eq",type:"string",description:"Filter by currency code"}},wp={sortBy:"nextScheduleDate",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Ap={id:{path:"resourceId",op:"eq",type:"string",description:"Filter by job ID (the jobId returned from bulk operations)",cliFlag:"--id"},status:{path:"status",op:"multi",type:"string",description:"Filter by job status",enum:Wz},type:{path:"jobType",op:"eq",type:"string",description:"Filter by job type (e.g. UPSERT_CONTACTS, UPSERT_ITEMS, PROCESS_BANK_STATEMENT_FILES)",cliFlag:"--type"},fileName:{path:"fileName",op:"contains",type:"string",description:"Filter by file name (file-based jobs only)",cliFlag:"--file-name"},from:{path:"createdAt",op:"gte",type:"string",description:"Created on or after (ISO date)",cliFlag:"--from"},to:{path:"createdAt",op:"lte",type:"string",description:"Created on or before (ISO date)",cliFlag:"--to"}},xp={sortBy:"createdAt",sortOrder:"DESC",defaultLimit:20};var $p={name:{path:"name",op:"contains",type:"string",description:"Search by account name"},code:{path:"code",op:"contains",type:"string",description:"Search by account code"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:kz},accountClass:{path:"accountClass",op:"eq",type:"string",description:"Filter by account class",enum:Yz},accountType:{path:"accountType",op:"eq",type:"string",description:"Filter by account type",enum:Jz},controlFlag:{path:"controlFlag",op:"boolean",type:"boolean",description:"Filter by control flag (system accounts)"}},Tp={sortBy:"code",sortOrder:"ASC",defaultLimit:100,supportsQuery:!0},Op={query:{path:"tagName",op:"contains",type:"string",description:"Search by tag name"}},Np={sortBy:"tagName",sortOrder:"ASC",defaultLimit:100},Rp={name:{path:"name",op:"contains",type:"string",description:"Search by tax profile name",cliFlag:"--name <name>"},taxTypeCode:{path:"taxTypeCode",op:"contains",type:"string",description:"Filter by 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"}},Fp={sortBy:"name",sortOrder:"ASC",defaultLimit:100,supportsQuery:!0},kp={title:{path:"title",op:"contains",type:"string",description:"Search by capsule title"},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:Hz}},Pp={sortBy:"title",sortOrder:"ASC",defaultLimit:20,supportsQuery:!0};var Lp={query:{path:"customFieldName",op:"contains",type:"string",description:"Search by custom field name",cliFlag:"--name <name>"},datatypeCode:{path:"datatypeCode",op:"eq",type:"string",description:"Filter by data type",enum:Gz,cliFlag:"--type <type>"},customFieldName:{path:"customFieldName",op:"contains",type:"string",description:"(alias for query)"}},Mp={sortBy:"customFieldName",sortOrder:"ASC",defaultLimit:100},jp={query:{path:"name",op:"contains",type:"string",description:"Search by group name"}},Bp={sortBy:"name",sortOrder:"ASC",defaultLimit:100},Up={query:{path:"name",op:"contains",type:"string",description:"Search by user name"},email:{path:"email",op:"contains",type:"string",description:"Filter by email"},role:{path:"role",op:"eq",type:"string",description:"Filter by role",enum:Vz},status:{path:"status",op:"multi",type:"string",description:"Filter by status",enum:VD}},zp={sortBy:"name",sortOrder:"ASC",defaultLimit:50},qp={query:{path:"name",op:"contains",type:"string",description:"Search by rule name"},account:{path:"appliesToReconciliationAccount",op:"eq",type:"string",description:"Filter by bank account resourceId",cliFlag:"--account <id>"}},Yp={sortBy:"name",sortOrder:"ASC",defaultLimit:100},Jp={query:{path:"type",op:"contains",type:"string",description:"Search by classifier type"}},Gp={sortBy:"type",sortOrder:"ASC",defaultLimit:100};var nq=[{key:"resourceId",header:"ID",format:ne},{key:"code",header:"Code"},{key:"name",header:"Name"},{key:"accountType",header:"Type"}];function oq(e){let t=e.command("accounts").description("Chart of accounts");t.command("list").description("List accounts").option("--limit <n>","Max results (default 100)",j).option("--offset <n>","Page number offset (0-indexed)",fe).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 10000)",j).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=await se(n,i=>Ii(r,i),{label:"Fetching accounts"});oe(o,nq,n,"Accounts")})),be({parent:t,fields:$p,defaults:Tp,fetcher:eu,columns:nq,label:"Searching accounts",positionalArg:"name",positionalFilter:r=>({or:{name:{contains:r},code:{contains:r}}})}),t.command("create").description("Create a new account in the chart of accounts").option("--name <name>","Account name").option("--code <code>","Account code").option("--type <accountType>",'Account type (e.g. "Bank Accounts", "Revenue", "Expense")').option("--currency <code>","Currency code (defaults to org currency)").option("--status <status>","Account status (ACTIVE or INACTIVE)").option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=q(n),i=o?.name??n.name;if(i){let a=await YD(r,i);if(a){n.json?console.log(JSON.stringify(a,null,2)):(console.log(Z(`Account "${i}" already exists`)),console.log(E("ID:"),a.resourceId));return}}let s;if(o)s=await Vd(r,o);else{ae(n,[{flag:"--name",key:"name"},{flag:"--code",key:"code"},{flag:"--type",key:"type"}]);let a={code:n.code,name:n.name,accountType:qD(n.type)};n.currency&&(a.currencyCode=n.currency),n.status&&(a.status=n.status),s=await Vd(r,a)}n.json?console.log(JSON.stringify(s.data,null,2)):(console.log($(`Account created: ${s.data.name} (${s.data.code})`)),console.log(E("ID:"),s.data.resourceId))})),t.command("delete <resourceId>").description("Delete an account from the chart of accounts").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)=>x(async o=>{await mD(o,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log($(`Account ${r} deleted.`))})(n))}X();Te();He();je();ut();We();var iq=[{key:"resourceId",header:"ID",format:ne},{key:"billingName",header:"Name"},{key:"customer",header:"Customer",format:e=>e?"Yes":"-"},{key:"supplier",header:"Supplier",format:e=>e?"Yes":"-"}];function sq(e){let t=e.command("contacts").description("Manage contacts (customers & suppliers)");t.command("list").description("List contacts").option("--limit <n>","Max results (default 100)",j).option("--offset <n>","Page number offset (0-indexed)",fe).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 10000)",j).option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=await se(n,i=>Qi(r,i),{label:"Fetching contacts"});oe(o,iq,n,"Contacts")})),be({parent:t,fields:hp,defaults:gp,fetcher:Mn,columns:iq,label:"Searching contacts"}),t.command("get <resourceId>").description("Get a contact by resourceId").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)=>x(async o=>{let s=(await ga(o,r)).data;if(n.json)console.log(JSON.stringify(s,null,2));else{console.log(E("Name:"),s.billingName),s.name&&s.name!==s.billingName&&console.log(E("Display Name:"),s.name),console.log(E("ID:"),s.resourceId),s.emails?.length&&console.log(E("Email:"),s.emails.join(", ")),s.taxId&&console.log(E("Tax Reg:"),s.taxId);let a=[s.customer&&"Customer",s.supplier&&"Supplier"].filter(Boolean).join(", ");a&&console.log(E("Roles:"),a),s.status&&console.log(E("Status:"),s.status)}})(n)),t.command("create").description("Create a new contact").option("--name <name>","Contact name (used for both name and billingName)").option("--email <email>","Email address").option("--customer","Mark as customer").option("--supplier","Mark as supplier").option("--tax-reg <number>","Tax registration number").option("--phone <phone>","Phone number (E.164 format)").option("--currency <code>","Currency code (ISO 4217)").option("--payment-terms <days>","Payment term in days",j).option("--input <file>","Read full request body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--format <type>","Output format: table, json, csv, yaml").option("--json","Output as JSON").action(x(async(r,n)=>{let o=q(n),i=o?.name??n.name;if(i){let a=await sp(r,i);if(a){n.json?console.log(JSON.stringify(a,null,2)):(console.log(Z(`Contact "${i}" already exists`)),console.log(E("ID:"),a.resourceId));return}}let s;o?s=await kc(r,o):(ae(n,[{flag:"--name",key:"name"}]),s=await kc(r,{billingName:n.name,name:n.name,emails:n.email?[n.email]:void 0,customer:n.customer??!1,supplier:n.supplier??!1,taxId:n.taxReg,phone:n.phone,currencyCode:n.currency,customerPaymentTerms:n.paymentTerms!=null?String(n.paymentTerms):void 0})),n.json?console.log(JSON.stringify(s.data,null,2)):(console.log($(`Contact created: ${s.data.billingName}`)),console.log(E("ID:"),s.data.resourceId))})),t.command("update <resourceId>").description("Update a contact").option("--name <name>","New billing name").option("--email <email>","New email address").option("--customer","Set as customer").option("--no-customer","Unset as customer").option("--supplier","Set as supplier").option("--no-supplier","Unset as supplier").option("--tax-reg <number>","Tax registration number").option("--phone <phone>","Phone number").option("--status <status>","Status (ACTIVE/INACTIVE)").option("--input <file>","Read full update body from JSON file (or pipe via stdin)").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)=>x(async o=>{let i=q(n),s;i?s=i:(s={},n.name!==void 0&&(s.billingName=n.name,s.name=n.name),n.email!==void 0&&(s.emails=[n.email]),n.customer!==void 0&&(s.customer=n.customer),n.supplier!==void 0&&(s.supplier=n.supplier),n.taxReg!==void 0&&(s.taxId=n.taxReg),n.phone!==void 0&&(s.phone=n.phone),n.status!==void 0&&(s.status=n.status));let a=await ty(o,r,s);n.json?console.log(JSON.stringify(a.data,null,2)):console.log($(`Contact updated: ${a.data.billingName}`))})(n)),t.command("delete <resourceId>").description("Delete a contact").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)=>x(async o=>{await ry(o,r),n.json?console.log(JSON.stringify({deleted:!0,resourceId:r})):console.log($(`Contact ${r} deleted.`))})(n)),t.command("bulk-upsert").description("Create or update contacts in bulk (max 500). Provide resourceId per contact to update, omit to create. Returns a jobId \u2014 poll with `clio background-jobs get <jobId>` to check progress.").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(x(async(r,n)=>{let o=q(n);o||(console.error('Error: --input <file> is required (JSON with { "contacts": [...] } or a bare array)'),process.exit(1));let i=o.contacts??o;Array.isArray(i)||(console.error('Error: expected { "contacts": [...] } or a JSON array'),process.exit(1)),i.length===0&&(console.error("Error: contacts array is empty."),process.exit(1)),i.length>500&&(console.error(`Error: max 500 contacts per call (got ${i.length}). Split into batches.`),process.exit(1));let s=await ny(r,i);n.json?console.log(JSON.stringify(s.data,null,2)):(console.log($(`Bulk upsert started. Job ID: ${s.data.jobId}`)),console.log(Z(` Poll progress: clio background-jobs get ${s.data.jobId}`)))}))}X();We();async function WD(e,t){return e.list("/api/v1/invoices",t)}async function ro(e,t){let r=await e.get(`/api/v1/invoices/${t}`);return"data"in r&&typeof r.data=="object"?r:{data:r}}async function gu(e,t){return e.search("/api/v1/invoices/search",t)}async function xa(e,t){return e.post("/api/v1/invoices",{...t,saveAsDraft:t.saveAsDraft??!0})}async function ZD(e,t,r){return e.put(`/api/v1/invoices/${t}`,r)}async function KD(e,t){await e.delete(`/api/v1/invoices/${t}`)}async function Vp(e,t,r){return e.post(`/api/v1/invoices/${t}/payments`,{...r,saveAsDraft:r.saveAsDraft??!0})}async function Hp(e,t){return e.post("/api/v1/scheduled/invoices",t)}async function XD(e,t,r){return e.post(`/api/v1/invoices/${t}/credits`,{credits:r})}async function Wp(e,t,r){return e.put(`/api/v1/invoices/${t}`,{...r,resourceId:t,saveAsDraft:!1})}async function QD(e,t){return e.get(`/api/v1/invoices/${t}/download`)}async function e0(e,t){let r=await e.get(`/api/v1/invoices/${t}/payments`);return{data:Array.isArray(r)?r:r.data??[]}}async function t0(e,t){let r=await e.get(`/api/v1/invoices/${t}/credits`);return{data:Array.isArray(r)?r:r.data??[]}}async function r0(e,t,r){await e.delete(`/api/v1/invoices/${t}/credits/${r}`)}async function Bt(e,t,r){let n=await e.get(`/api/v1/${t}/${r}/attachments`),o=n?.attachments??n?.data;return{data:Array.isArray(o)?o.map(s=>({...s,resourceId:s.resourceId??s.attachmentResourceId??""})):[]}}async function n0(e,t){let{businessTransactionType:r,businessTransactionResourceId:n,...o}=t,i=new FormData;return o.file&&i.append("file",o.file,o.fileName??"file"),o.attachmentId&&i.append("attachmentId",o.attachmentId),e.postMultipart(`/api/v1/${r}/${n}/attachments`,i)}async function o0(e,t,r,n){return e.delete(`/api/v1/${t}/${r}/attachments/${n}`)}async function i0(e,t){return e.get(`/api/v1/attachments/${t}/table`)}Te();je();ut();He();X();je();var Sn=[{field:"contactResourceId",label:"Contact",hint:"--contact <name or UUID>",check:e=>!!e.contactResourceId},{field:"valueDate",label:"Date",hint:"--date <YYYY-MM-DD>",check:e=>!!e.valueDate},{field:"dueDate",label:"Due date",hint:"--due <YYYY-MM-DD>",check:e=>!!e.dueDate},{field:"lineItems",label:"Line items",hint:"--lines <json>",check:e=>e.lineItems?.length>0},{field:"name",label:"Item name",hint:"via --lines",check:e=>!!e.name,perLineItem:!0},{field:"unitPrice",label:"Unit price",hint:"via --lines",check:e=>e.unitPrice!=null,perLineItem:!0},{field:"accountResourceId",label:"Account",hint:"--account <name or UUID>",check:e=>!!(e.accountResourceId||e.organizationAccountResourceId),perLineItem:!0}],no=[...Sn],ur=Sn.filter(e=>e.field!=="dueDate"),$o=[{field:"valueDate",label:"Date",hint:"--date <YYYY-MM-DD>",check:e=>!!e.valueDate},{field:"journalEntries",label:"Journal entries",hint:"--entries <json>",check:e=>e.journalEntries?.length>0},{field:"accountResourceId",label:"Account",hint:"--account <name or UUID>",check:e=>!!(e.accountResourceId||e.organizationAccountResourceId),perLineItem:!0},{field:"amount",label:"Amount",hint:"via --entries",check:e=>e.amount!=null&&e.amount>0||e.debitAmount!=null&&e.debitAmount>0||e.creditAmount!=null&&e.creditAmount>0,perLineItem:!0}];function sn(e,t,r="lineItems"){let n=[];for(let o of t)if(o.perLineItem){let i=e[r]??[];for(let s=0;s<i.length;s++)o.check(i[s])||n.push(`${r}[${s}].${o.field}`)}else o.check(e)||n.push(o.field);return{missingFields:n,missingCount:n.length,ready:n.length===0}}function gr(e,t,r="lineItems"){let n=t.filter(a=>!a.perLineItem),o=t.filter(a=>a.perLineItem),i={valueDate:JA(e,"valueDate","Date","--date <YYYY-MM-DD>",n),lineItems:[]};n.some(a=>a.field==="contactResourceId")&&(i.contact=JA(e,"contactResourceId","Contact","--contact <name or UUID>",n)),n.some(a=>a.field==="dueDate")&&(i.dueDate=JA(e,"dueDate","Due date","--due <YYYY-MM-DD>",n));let s=e[r]??[];return i.lineItems=s.map((a,c)=>{let u=a.accountResourceId||a.organizationAccountResourceId,l=u?{status:"ok",resourceId:u}:{status:"missing",hint:"--account <name or UUID>"};if(r==="journalEntries"){let h=o.find(S=>S.field==="amount"),g=h?h.check(a):!0,D=a.amount??a.debitAmount??a.creditAmount??null,v=a.debitAmount,y=a.creditAmount,b=a.type??(typeof v=="number"&&v>0?"DEBIT":typeof y=="number"&&y>0?"CREDIT":null);return{index:c,name:a.description||b||null,nameStatus:"ok",unitPrice:D,unitPriceStatus:g?"ok":"missing",account:l}}let d=o.find(h=>h.field==="name"),f=o.find(h=>h.field==="unitPrice"),p=d?d.check(a):!0,m=f?f.check(a):!0;return{index:c,name:a.name||null,nameStatus:p?"ok":"missing",unitPrice:a.unitPrice??null,unitPriceStatus:m?"ok":"missing",account:l}}),i}function JA(e,t,r,n,o){let i=o.find(s=>s.field===t);if(!i){let s=e[t];return s?{status:"ok",value:s}:{status:"ok"}}if(i.check(e)){let s=e[t];return t==="contactResourceId"?{status:"ok",value:e.contactName||s,resourceId:s}:{status:"ok",value:s}}return{status:"missing",hint:n}}function wr(e,t,r,n="lineItems"){let{missingFields:o,missingCount:i,ready:s}=sn(e,t,n),a=gr(e,t,n);return{resourceId:e.resourceId,reference:e.reference||null,totalAmount:e.totalAmount??0,attachmentCount:r,ready:s,missingCount:i,missingFields:o,validation:a}}function oo(e){let t={};e.name!=null&&(t.name=e.name),e.quantity!=null&&(t.quantity=e.quantity),e.unitPrice!=null&&(t.unitPrice=e.unitPrice),e.unit&&(t.unit=e.unit);let r=e.accountResourceId||e.organizationAccountResourceId;r&&(t.accountResourceId=r);let n=e.taxProfileResourceId||(e.taxProfile&&typeof e.taxProfile=="object"?e.taxProfile.resourceId:null);return n&&(t.taxProfileResourceId=n),e.itemResourceId&&(t.itemResourceId=e.itemResourceId),e.discount!=null&&(t.discount=typeof e.discount=="object"?e.discount.rateValue??0:e.discount),t}function yu(e){let t={},r=e.accountResourceId||e.organizationAccountResourceId;return r&&(t.accountResourceId=r),e.amount!=null?t.amount=e.amount:e.debitAmount!=null&&e.debitAmount>0?t.amount=e.debitAmount:e.creditAmount!=null&&e.creditAmount>0&&(t.amount=e.creditAmount),e.type?t.type=e.type:e.debitAmount!=null&&e.debitAmount>0?t.type="DEBIT":e.creditAmount!=null&&e.creditAmount>0&&(t.type="CREDIT"),e.description&&(t.description=e.description),e.contactResourceId&&(t.contactResourceId=e.contactResourceId),t}function Be(e){if(e)return e.split("T")[0]}function Xo(e,t){let r={};if(t.contact&&(r.contactResourceId=t.contact),t.date&&(r.valueDate=t.date),t.due&&(r.dueDate=t.due),t.ref!==void 0&&(r.reference=t.ref),t.notes!==void 0&&(r.notes=t.notes),t.tag!==void 0&&(r.tag=t.tag),t.tax&&(r.isTaxVatApplicable=!0),t.tax&&t.taxInclusive?r.taxInclusion=!0:t.tax&&(r.taxInclusion=!1),t.lines)r.lineItems=t.lines;else if(t.account||t.taxProfile){let n=e.lineItems??[];r.lineItems=n.map(o=>{let i=oo(o);return t.account&&!i.accountResourceId&&(i.accountResourceId=t.account),t.taxProfile&&!i.taxProfileResourceId&&(i.taxProfileResourceId=t.taxProfile),i})}return r}function s0(e,t){let r={};if(t.date&&(r.valueDate=t.date),t.ref!==void 0&&(r.reference=t.ref),t.notes!==void 0&&(r.notes=t.notes),t.entries)r.journalEntries=t.entries;else if(t.account){let n=e.journalEntries??[];r.journalEntries=n.map(o=>{let i=yu(o);return t.account&&!i.accountResourceId&&(i.accountResourceId=t.account),i})}return r}function Qo(e,t){let r=t.filter(i=>i.ready).length,n=t.length-r;if(t.length===0){console.log(`No draft ${e.toLowerCase()} found.`);return}let o=r===t.length?$(`${t.length} drafts, all ready`):`${t.length} drafts, ${$(`${r} ready`)}, ${G(`${n} need attention`)}`;console.log(E(`Draft ${e} \u2014 ${o}
580
580
  `));for(let i=0;i<t.length;i++){let s=t[i],a=s.reference||"(no ref)",c=s.totalAmount>0?`$${s.totalAmount.toFixed(2)}`:"$0.00",u=s.resourceId.length>12?s.resourceId.slice(0,8)+"-...":s.resourceId;console.log(` ${E(`${i+1}.`)} ${a} ${I(`(${u})`)} ${I(c)}`);let l=s.validation;l.contact&&GA("Contact",l.contact),GA("Date",l.valueDate),l.dueDate&&GA("Due",l.dueDate);for(let f of l.lineItems){let p=f.name||"(unnamed)",m=f.unitPrice!=null?`$${f.unitPrice.toFixed(2)}`:"no price",h=f.account.status==="ok"?$("\u2713"):R("MISSING");console.log(` Line ${f.index+1}: ${p} \u2014 ${m} \u2014 account: ${h}`)}let d=s.attachmentCount>0?`${s.attachmentCount} file${s.attachmentCount>1?"s":""}`:"none";if(console.log(` Attach: ${I(d)}`),s.ready)console.log($(" \u2713 READY TO FINALIZE"));else{let f=Xle(s);console.error(G(` \u2192 ${s.missingCount} issue${s.missingCount>1?"s":""}: ${f}`))}console.log("")}}function GA(e,t){let r=e.padEnd(8);if(t.status==="ok"){let n=t.value!=null?String(t.value):"";console.log(` ${r} ${n} ${$("\u2713")}`)}else console.log(` ${r} ${R("MISSING")}`)}function Xle(e){let t=new Set,r=e.validation;r.contact?.status==="missing"&&r.contact.hint&&t.add(r.contact.hint),r.valueDate.status==="missing"&&r.valueDate.hint&&t.add(r.valueDate.hint),r.dueDate?.status==="missing"&&r.dueDate.hint&&t.add(r.dueDate.hint);for(let n of r.lineItems)n.account.status==="missing"&&n.account.hint&&t.add(n.account.hint);return Array.from(t).join(", ")}function ys(e){return e.option("--contact <name/uuid>","Set/override contact (fuzzy resolved)").option("--date <YYYY-MM-DD>","Set/override date (valueDate)").option("--due <YYYY-MM-DD>","Set/override due date").option("--lines <json>","Override all line items (JSON array)",hr).option("--account <name/uuid>","Set account on ALL line items missing it (fuzzy resolved)").option("--tax-profile <name/uuid>","Set tax profile on ALL line items missing it (fuzzy resolved)").option("--ref <reference>","Set reference").option("--notes <text>","Set notes").option("--tag <tag>","Set tag").option("--tax","Enable tax/VAT").option("--tax-inclusive","Prices are tax-inclusive (requires --tax)").option("--dry-run","Validate only \u2014 show what's present/missing, don't finalize").option("--input <file>","Read full JSON override body from file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON")}function aq(e){return e.option("--date <YYYY-MM-DD>","Set/override date (valueDate)").option("--entries <json>","Override all journal entries (JSON array)",to).option("--account <name/uuid>","Set account on ALL entries missing it (fuzzy resolved)").option("--ref <reference>","Set reference").option("--notes <text>","Set notes").option("--dry-run","Validate only \u2014 show what's present/missing, don't finalize").option("--input <file>","Read full JSON override body from file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON")}var cq=[{key:"resourceId",header:"ID",format:ne},{key:"reference",header:"Reference",format:mr},{key:"status",header:"Status",format:e=>tr(String(e))},{key:"totalAmount",header:"Amount",align:"right",format:rr},{key:"valueDate",header:"Date",format:e=>Be(String(e))??"-"}];function uq(e){let t=e.command("invoices").description("Manage sales invoices");t.command("list").description("List invoices").option("--limit <n>","Max results (default 100)",j).option("--offset <n>","Page number offset (0-indexed)",fe).option("--all","Fetch all pages").option("--max-rows <n>","Max rows for --all (default 10000)",j).option("--format <type>","Output format: table, json, csv, yaml").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(x(async(n,o)=>{let i=await se(o,s=>WD(n,s),{label:"Fetching invoices"});oe(i,cq,o,"Invoices")})),t.command("get <resourceId>").description("Get an invoice by resourceId").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,o)=>x(async i=>{let a=(await ro(i,n)).data;if(o.json)console.log(JSON.stringify(a,null,2));else{if(console.log(E("Reference:"),a.reference||"(none)"),console.log(E("ID:"),a.resourceId),console.log(E("Status:"),a.status),console.log(E("Date:"),Be(a.valueDate)),console.log(E("Due:"),Be(a.dueDate)),a.contactName&&console.log(E("Contact:"),a.contactName),a.totalAmount!==void 0&&console.log(E("Total:"),a.totalAmount.toFixed(2)),a.amountDue!==void 0&&console.log(E("Amount Due:"),a.amountDue.toFixed(2)),a.lineItems?.length){console.log(E("Line Items:"));for(let c of a.lineItems){let u=c.quantity??1,l=c.unitPrice??0;console.log(` - ${c.name} qty: ${u} price: ${l.toFixed(2)}`)}}a.invoiceNotes&&console.log(E("Notes:"),a.invoiceNotes)}})(o)),be({parent:t,fields:fu,defaults:mu,fetcher:gu,columns:cq,label:"Searching invoices"}),t.command("create").description("Create an invoice (saves as draft by default)").option("--contact <resourceId>","Contact name or resourceId").option("--lines <json>","Line items as JSON array",hr).option("--date <YYYY-MM-DD>","Invoice date (valueDate)").option("--due <YYYY-MM-DD>","Due date").option("--ref <reference>","Invoice reference/number").option("--notes <text>","Notes").option("--tag <tag>","Tag").option("--custom-fields <json>",'Custom field values as JSON array: [{"customFieldName":"PO Number","actualValue":"PO-123"}]').option("--currency <code>","Foreign currency code (ISO 4217)").option("--exchange-rate <rate>","Exchange rate for foreign currency",wi).option("--tax","Enable tax/VAT").option("--tax-inclusive","Prices are tax-inclusive (requires --tax)").option("--finalize","Finalize instead of saving as draft").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(x(async(n,o)=>{let i=q(o),s;if(i)s=await xa(n,{...i,saveAsDraft:i.saveAsDraft??!o.finalize});else{ae(o,[{flag:"--contact",key:"contact"},{flag:"--lines",key:"lines"},{flag:"--date",key:"date"},{flag:"--due",key:"due"}]);let a=await Jr(n,o.contact,{silent:o.json});o.contact=a.resourceId;let c=o.currency?{sourceCurrency:o.currency,...o.exchangeRate!==void 0&&{exchangeRate:o.exchangeRate}}:void 0,u=o.customFields?Zt(o.customFields):void 0;s=await xa(n,{contactResourceId:o.contact,lineItems:o.lines,valueDate:o.date,dueDate:o.due,reference:o.ref,invoiceNotes:o.notes,tags:o.tag?[o.tag]:void 0,customFields:u,currency:c,isTaxVatApplicable:o.tax??void 0,taxInclusion:o.tax&&o.taxInclusive?"INCLUSIVE":o.tax?"EXCLUSIVE":void 0,saveAsDraft:!o.finalize})}if(o.json)console.log(JSON.stringify(s.data,null,2));else{let a=o.finalize?"finalized":"draft";console.log($(`Invoice created (${a}): ${s.data.reference||s.data.resourceId}`)),console.log(E("ID:"),s.data.resourceId)}})),t.command("update <resourceId>").description("Update a draft invoice").option("--ref <reference>","New reference").option("--date <YYYY-MM-DD>","New invoice date").option("--due <YYYY-MM-DD>","New due date").option("--lines <json>","New line items as JSON array",hr).option("--notes <text>","New notes").option("--tag <tag>","New tag").option("--custom-fields <json>",'Custom field values as JSON array: [{"customFieldName":"PO Number","actualValue":"PO-123"}]').option("--input <file>","Read full update body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,o)=>x(async i=>{let s=q(o),a;s?a=s:(a={},o.ref!==void 0&&(a.reference=o.ref),o.date!==void 0&&(a.valueDate=o.date),o.due!==void 0&&(a.dueDate=o.due),o.lines!==void 0&&(a.lineItems=o.lines),o.notes!==void 0&&(a.invoiceNotes=o.notes),o.tag!==void 0&&(a.tags=[o.tag]),o.customFields!==void 0&&(a.customFields=Zt(o.customFields)));let c=await ZD(i,n,a);o.json?console.log(JSON.stringify(c.data,null,2)):console.log($(`Invoice updated: ${c.data.reference||c.data.resourceId}`))})(o)),t.command("delete <resourceId>").description("Delete/void an invoice").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,o)=>x(async i=>{await KD(i,n),o.json?console.log(JSON.stringify({deleted:!0,resourceId:n})):console.log($(`Invoice ${n} deleted.`))})(o)),t.command("pay <resourceId>").description("Record a payment against an invoice (finalizes by default)").option("--amount <n>","Payment amount (bank currency)",tt).option("--account <resourceId>","Bank/cash account name or resourceId").option("--date <YYYY-MM-DD>","Payment date (valueDate)").option("--transaction-amount <n>","Transaction amount (invoice currency, if different from bank)",tt).option("--method <method>","Payment method (BANK_TRANSFER, CASH, CHEQUE, etc.)","BANK_TRANSFER").option("--ref <reference>","Payment reference").option("--draft","Save as draft instead of finalizing").option("--custom-fields <json>","Custom field values as JSON array").option("--input <file>","Read full payment body from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,o)=>x(async i=>{let s=q(o),a=o.customFields?Zt(o.customFields):void 0,c;if(s)c=await Vp(i,n,{...s,saveAsDraft:s.saveAsDraft??o.draft??!1,customFields:s.customFields??a});else{ae(o,[{flag:"--amount",key:"amount"},{flag:"--account",key:"account"},{flag:"--date",key:"date"}]);let l=new Set(["BANK_TRANSFER","CASH","CHEQUE"]).has(o.method)?"bank":"any",d=await Wt(i,o.account,{filter:l,silent:o.json});o.account=d.resourceId,c=await Vp(i,n,{paymentAmount:o.amount,transactionAmount:o.transactionAmount??o.amount,accountResourceId:o.account,valueDate:o.date,dueDate:o.date,paymentMethod:o.method,reference:o.ref??"",saveAsDraft:o.draft??!1,customFields:a})}o.json?console.log(JSON.stringify(c.data,null,2)):console.log($(`Payment recorded for invoice ${n}`))})(o)),t.command("apply-credits <resourceId>").description("Apply customer credit note(s) to an invoice").option("--credit-note <id>","Credit note resourceId").option("--amount <n>","Amount to apply",tt).option("--credits <json>","JSON array: [{creditNoteResourceId, amountApplied}]").option("--input <file>","Read credits from JSON file (or pipe via stdin)").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,o)=>x(async i=>{let s=q(o),a;s?a=Array.isArray(s)?s:s.credits:o.credits?a=JSON.parse(o.credits):(ae(o,[{flag:"--credit-note",key:"creditNote"},{flag:"--amount",key:"amount"}]),a=[{creditNoteResourceId:o.creditNote,amountApplied:o.amount}]);let c=await XD(i,n,a);o.json?console.log(JSON.stringify(c.data,null,2)):console.log($(`Applied ${a.length} credit(s) to invoice ${n}`))})(o)),t.command("download <resourceId>").description("Get PDF download URL for an invoice").option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action((n,o)=>x(async i=>{let s=await QD(i,n);o.json?console.log(JSON.stringify(s.data,null,2)):console.log(E("PDF URL:"),s.data.fileUrl)})(o));let r=t.command("draft").description("Manage draft invoices (inspect, finalize, attachments)");r.command("list").description("List all draft invoices with per-field validation status").option("--ids <ids>","Comma-separated invoice IDs to inspect (instead of all drafts)").option("--max-rows <n>","Max drafts to fetch (default 10000)",j).option("--api-key <key>","API key (overrides stored/env)").option("--json","Output as JSON").action(x(async(n,o)=>{let i;if(o.ids){let c=o.ids.split(",").map(u=>u.trim()).filter(Boolean);i=await Promise.all(c.map(async u=>(await ro(n,u)).data)),i=i.filter(u=>u.status==="DRAFT")}else i=(await se({all:!0,json:!0,maxRows:o.maxRows},({limit:u,offset:l})=>gu(n,{filter:{status:{eq:"DRAFT"}},limit:u,offset:l,sort:{sortBy:["valueDate"],order:"DESC"}}),{label:"Fetching draft invoices"})).data;let s=5,a=[];for(let c=0;c<i.length;c+=s){let u=i.slice(c,c+s),l=await Promise.all(u.map(async d=>{let f=0;try{f=(await Bt(n,"invoices",d.resourceId)).data.length}catch{}return wr(d,no,f)}));a.push(...l)}if(o.json){let c=a.filter(u=>u.ready).length;console.log(JSON.stringify({totalDrafts:a.length,readyCount:c,needsAttentionCount:a.length-c,drafts:a},null,2))}else Qo("Invoices",a)})),ys(r.command("finalize <resourceId>").description("Fill missing fields and convert a draft invoice to APPROVED")).action((n,o)=>x(async i=>{let s=q(o),c=(await ro(i,n)).data;if(c.status!=="DRAFT"){let y=`Invoice ${n} is ${c.status}, not DRAFT. Only DRAFT invoices can be finalized.`;o.json?console.log(JSON.stringify({finalized:!1,error:y})):console.error(R(y)),process.exit(1)}let u={...o};if(o.contact){let y=await Jr(i,o.contact,{silent:o.json});u.contact=y.resourceId}if(o.account){let y=await Wt(i,o.account,{filter:"line-item",silent:o.json});u.account=y.resourceId}if(o.taxProfile){let y=await fs(i,o.taxProfile,{silent:o.json});u.taxProfile=y.resourceId}let l;s?l=s:l=Xo(c,u);let d=Object.keys(l),f={...c,...l};l.lineItems&&(f.lineItems=l.lineItems);let{missingFields:p,missingCount:m,ready:h}=sn(f,no);if(!s){let y={reference:f.reference||void 0,contactResourceId:f.contactResourceId,valueDate:Be(l.valueDate)||Be(c.valueDate),dueDate:Be(l.dueDate)||Be(c.dueDate)},b=l.lineItems??c.lineItems??[];y.lineItems=b.map(S=>oo(S)),(l.isTaxVatApplicable!=null||c.isTaxVATApplicable!=null)&&(y.isTaxVATApplicable=l.isTaxVatApplicable??c.isTaxVATApplicable),(l.taxInclusion!=null||c.taxInclusion!=null)&&(y.taxInclusion=l.taxInclusion??c.taxInclusion),l.notes&&(y.invoiceNotes=l.notes),l.tag&&(y.tags=[l.tag]),l=y}if(o.dryRun){let y=gr(f,no);if(o.json)console.log(JSON.stringify({finalized:!1,dryRun:!0,resourceId:n,reference:f.reference||null,ready:h,missingCount:m,missingFields:p,validation:y},null,2));else if(h)console.log($(`\u2713 ${f.reference||n} is ready to finalize.`));else{console.error(G(`\u2717 ${f.reference||n} \u2014 ${m} issue${m>1?"s":""} remaining:`));for(let b of p){let S=no.find(C=>b===C.field||b.endsWith(`.${C.field}`));console.log(` ${b}: ${R("MISSING")} \u2014 ${S?.hint??""}`)}}return}if(!h){let y=gr(f,no);if(o.json)console.log(JSON.stringify({finalized:!1,resourceId:n,reference:f.reference||null,ready:!1,missingCount:m,missingFields:p,validation:y},null,2));else{console.error(R(`
581
581
  \u2717 Cannot finalize ${f.reference||n} \u2014 ${m} issue${m>1?"s":""} remaining:
582
582
  `));for(let b of p){let S=no.find(C=>b===C.field||b.endsWith(`.${C.field}`));console.error(` ${b}: ${R("MISSING")} \u2014 ${S?.hint??""}`)}console.error(I(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jaz-clio",
3
- "version": "4.55.4",
3
+ "version": "4.55.5",
4
4
  "description": "Clio: Command Line Interface Operator for Jaz AI.",
5
5
  "type": "module",
6
6
  "bin": {