@hyperline/cli 0.1.0-build.1.cda113b → 0.1.0-build.1.cde0d40

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.
@@ -38165,7 +38165,7 @@ Examples:
38165
38165
  // build/commands/generated/accounting-journal-entries.js
38166
38166
  function registerAccounting_Journal_EntriesCommands(parent) {
38167
38167
  const resource = parent.command("accounting-journal-entries").description("Manage accounting > journal entries");
38168
- resource.command("list-journal-entries").description(`List accounting journal entries with optional filters.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--entry-number <value>", `Filter by journal entry number.`).option("--status <value>", `Filter by journal entry status.`).option("--origin <value>", `Filter by automatic or manual origin.`).option("--ledger-id <value>", `Filter by ledger identifier.`).option("--invoicing-entity-id <value>", `Filter by invoicing entity identifier.`).option("--invoice-id <value>", `Filter by invoice identifier.`).option("--customer-id <value>", `Filter by customer identifier.`).option("--subscription-id <value>", `Filter by subscription identifier.`).option("--transaction-id <value>", `Filter by transaction identifier.`).option("--ledger-account-id <value>", `Filter entries containing a ledger account.`).option("--rule-id <value>", `Filter entries containing an accounting rule.`).option("--search <value>", `Search entry number, description, customer, or invoice.`).option("--year <number>", `Filter by entry year.`).option("--quarter <number>", `Filter by entry quarter.`).addHelpText("after", `
38168
+ resource.command("list-journal-entries").description(`List accounting journal entries with optional filters.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--entry-number <value>", `Filter by journal entry number.`).option("--status <value>", `Filter by journal entry status.`).option("--origin <value>", `Filter by automatic or manual origin.`).option("--ledger-id <value>", `Filter by ledger identifier.`).option("--invoicing-entity-id <value>", `Filter by invoicing entity identifier.`).option("--invoice-id <value>", `Filter by invoice identifier.`).option("--customer-id <value>", `Filter by customer identifier.`).option("--subscription-id <value>", `Filter by subscription identifier.`).option("--transaction-id <value>", `Filter by transaction identifier.`).option("--ledger-account-id <value>", `Filter entries containing a ledger account.`).option("--rule-id <value>", `Filter entries containing an accounting rule.`).option("--search <value>", `Search entry number, description, amount, invoice number or ID, customer name or ID, or subscription ID.`).option("--year <number>", `Filter by entry year.`).option("--quarter <number>", `Filter by entry quarter.`).addHelpText("after", `
38169
38169
  Examples:
38170
38170
  hyperline accounting-journal-entries list-journal-entries
38171
38171
  hyperline accounting-journal-entries list-journal-entries --take <take> --entry-number <entry_number>`).action(async (opts) => {
@@ -38409,7 +38409,7 @@ Examples:
38409
38409
  queryParamKeys: ["invoicing_entity_id"]
38410
38410
  });
38411
38411
  });
38412
- resource.command("create-ledger").description(`Create an accounting ledger for an invoicing entity.`).requiredOption("--invoicing-entity-id <value>", `Identifier of the invoicing entity that owns the ledger.`).requiredOption("--name <value>", `Display name of the ledger.`).requiredOption("--code <value>", `Optional accounting code of the ledger.`).requiredOption("--description <value>", `Optional description of the ledger.`).requiredOption("--type <value>", `Type of ledger.`).requiredOption("--currency <value>", `ISO 4217 currency used by the ledger.`).option("--fiscal-year-end-month <number>", `Last month of the ledger's fiscal year, from 1 (January) to 12 (December). Reports split profit between past fiscal years and the current one from it. Defaults to 12.`).requiredOption("--entry-number-pattern <value>", `Entry numbering pattern containing \`{number}\`.`).requiredOption("--is-primary", `Whether this is the primary ledger for the invoicing entity.`).requiredOption("--is-inactive", `Whether the ledger is inactive.`).addHelpText("after", `
38412
+ resource.command("create-ledger").description(`Create an accounting ledger for an invoicing entity.`).requiredOption("--invoicing-entity-id <value>", `Identifier of the invoicing entity that owns the ledger.`).requiredOption("--name <value>", `Display name of the ledger.`).requiredOption("--code <value>", `Optional accounting code of the ledger.`).requiredOption("--description <value>", `Optional description of the ledger.`).requiredOption("--type <value>", `Type of ledger.`).requiredOption("--currency <value>", `ISO 4217 currency used by the ledger.`).option("--fiscal-year-end-month <number>", `Last month of the ledger's fiscal year, from 1 (January) to 12 (December). Reports split profit between past fiscal years and the current one from it. Defaults to 12. It cannot be changed after creation.`).requiredOption("--entry-number-pattern <value>", `Entry numbering pattern containing \`{number}\`.`).requiredOption("--is-primary", `Whether this is the primary ledger for the invoicing entity.`).requiredOption("--is-inactive", `Whether the ledger is inactive.`).addHelpText("after", `
38413
38413
  Examples:
38414
38414
  hyperline accounting-ledgers create-ledger --invoicing-entity-id <invoicing_entity_id> --name <name> --code <code> --description <description> --type <type> --currency <currency> --entry-number-pattern <entry_number_pattern> --is-primary --is-inactive
38415
38415
  hyperline accounting-ledgers create-ledger --invoicing-entity-id <invoicing_entity_id> --name <name> --code <code> --description <description> --type <type> --currency <currency> --entry-number-pattern <entry_number_pattern> --is-primary --is-inactive --fiscal-year-end-month <fiscal_year_end_month>
@@ -38447,7 +38447,7 @@ Examples:
38447
38447
  queryParamKeys: []
38448
38448
  });
38449
38449
  });
38450
- resource.command("update-ledger").description(`Update an existing accounting ledger.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Display name of the ledger.`).option("--code <value>", `Optional accounting code of the ledger.`).option("--description <value>", `Optional description of the ledger.`).option("--type <value>", `Type of ledger.`).option("--currency <value>", `ISO 4217 currency used by the ledger.`).option("--fiscal-year-end-month <number>", `Last month of the ledger's fiscal year, from 1 (January) to 12 (December). Reports split profit between past fiscal years and the current one from it.`).option("--entry-number-pattern <value>", `Entry numbering pattern containing \`{number}\`.`).option("--next-entry-number <number>", `Next sequence number assigned to an entry.`).addHelpText("after", `
38450
+ resource.command("update-ledger").description(`Update an existing accounting ledger.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Display name of the ledger.`).option("--code <value>", `Optional accounting code of the ledger.`).option("--description <value>", `Optional description of the ledger.`).option("--type <value>", `Type of ledger.`).option("--currency <value>", `ISO 4217 currency used by the ledger.`).option("--entry-number-pattern <value>", `Entry numbering pattern containing \`{number}\`.`).option("--next-entry-number <number>", `Next sequence number assigned to an entry.`).addHelpText("after", `
38451
38451
  Examples:
38452
38452
  hyperline accounting-ledgers update-ledger --id <id>
38453
38453
  hyperline accounting-ledgers update-ledger --id <id> --name <name> --code <code>
@@ -38472,8 +38472,6 @@ Examples:
38472
38472
  args.currency = opts.currency;
38473
38473
  if (opts.entryNumberPattern !== void 0)
38474
38474
  args.entry_number_pattern = opts.entryNumberPattern;
38475
- if (opts.fiscalYearEndMonth !== void 0)
38476
- args.fiscal_year_end_month = Number(opts.fiscalYearEndMonth);
38477
38475
  if (opts.nextEntryNumber !== void 0)
38478
38476
  args.next_entry_number = Number(opts.nextEntryNumber);
38479
38477
  await ctx.execute({
@@ -38509,6 +38507,94 @@ Examples:
38509
38507
  queryParamKeys: []
38510
38508
  });
38511
38509
  });
38510
+ resource.command("get-ledger-close-state").description(`Retrieve the last closed month of a ledger and the latest month that can be closed.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
38511
+ Examples:
38512
+ hyperline accounting-ledgers get-ledger-close-state --id <id>`).action(async (opts) => {
38513
+ const ctx = resource.parent?.opts()._ctx;
38514
+ if (!ctx) {
38515
+ process.stderr.write("Error: Not authenticated\n");
38516
+ process.exit(1);
38517
+ }
38518
+ const args = {};
38519
+ if (opts.id !== void 0)
38520
+ args.id = opts.id;
38521
+ await ctx.execute({
38522
+ method: "GET",
38523
+ path: "/v1/accounting/ledgers/{id}/close",
38524
+ args,
38525
+ queryParamKeys: []
38526
+ });
38527
+ });
38528
+ resource.command("list-ledger-close-events").description(`List the closes and reopens of a ledger, newest first, with who did them and why.`).requiredOption("--id <value>", `id parameter`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
38529
+ Examples:
38530
+ hyperline accounting-ledgers list-ledger-close-events --id <id>
38531
+ hyperline accounting-ledgers list-ledger-close-events --id <id> --take <take>`).action(async (opts) => {
38532
+ const ctx = resource.parent?.opts()._ctx;
38533
+ if (!ctx) {
38534
+ process.stderr.write("Error: Not authenticated\n");
38535
+ process.exit(1);
38536
+ }
38537
+ const args = {};
38538
+ if (opts.id !== void 0)
38539
+ args.id = opts.id;
38540
+ if (opts.take !== void 0)
38541
+ args.take = Number(opts.take);
38542
+ if (opts.skip !== void 0)
38543
+ args.skip = Number(opts.skip);
38544
+ await ctx.execute({
38545
+ method: "GET",
38546
+ path: "/v1/accounting/ledgers/{id}/close-events",
38547
+ args,
38548
+ queryParamKeys: ["take", "skip"]
38549
+ });
38550
+ });
38551
+ resource.command("close-ledger-period").description(`Close every month of a ledger through an ended month, after posting the revenue recognition due by its end; a user token needs the accounting_close permission.`).requiredOption("--id <value>", `id parameter`).requiredOption("--through-month <value>", `Last month to close, formatted YYYY-MM: an ended month after the last closed month. Every earlier month is closed too.`).option("--reason <value>", `Why the months are closed, 1 to 500 characters.`).addHelpText("after", `
38552
+ Examples:
38553
+ hyperline accounting-ledgers close-ledger-period --id <id> --through-month <through_month>
38554
+ hyperline accounting-ledgers close-ledger-period --id <id> --through-month <through_month> --reason <reason>
38555
+ hyperline accounting-ledgers close-ledger-period --id <id> --through-month <through_month> --output json`).action(async (opts) => {
38556
+ const ctx = resource.parent?.opts()._ctx;
38557
+ if (!ctx) {
38558
+ process.stderr.write("Error: Not authenticated\n");
38559
+ process.exit(1);
38560
+ }
38561
+ const args = {};
38562
+ if (opts.id !== void 0)
38563
+ args.id = opts.id;
38564
+ if (opts.throughMonth !== void 0)
38565
+ args.through_month = opts.throughMonth;
38566
+ if (opts.reason !== void 0)
38567
+ args.reason = opts.reason;
38568
+ await ctx.execute({
38569
+ method: "POST",
38570
+ path: "/v1/accounting/ledgers/{id}/close",
38571
+ args,
38572
+ queryParamKeys: []
38573
+ });
38574
+ });
38575
+ resource.command("reopen-ledger-period").description(`Reopen a closed month of a ledger and every later month, with a mandatory reason; a user token needs the accounting_close permission.`).requiredOption("--id <value>", `id parameter`).requiredOption("--from-month <value>", `First month to reopen, formatted YYYY-MM: a closed month. Every later month is reopened too.`).requiredOption("--reason <value>", `Why the months are reopened, 1 to 500 characters.`).addHelpText("after", `
38576
+ Examples:
38577
+ hyperline accounting-ledgers reopen-ledger-period --id <id> --from-month <from_month> --reason <reason>
38578
+ hyperline accounting-ledgers reopen-ledger-period --id <id> --from-month <from_month> --reason <reason> --output json`).action(async (opts) => {
38579
+ const ctx = resource.parent?.opts()._ctx;
38580
+ if (!ctx) {
38581
+ process.stderr.write("Error: Not authenticated\n");
38582
+ process.exit(1);
38583
+ }
38584
+ const args = {};
38585
+ if (opts.id !== void 0)
38586
+ args.id = opts.id;
38587
+ if (opts.fromMonth !== void 0)
38588
+ args.from_month = opts.fromMonth;
38589
+ if (opts.reason !== void 0)
38590
+ args.reason = opts.reason;
38591
+ await ctx.execute({
38592
+ method: "POST",
38593
+ path: "/v1/accounting/ledgers/{id}/reopen",
38594
+ args,
38595
+ queryParamKeys: []
38596
+ });
38597
+ });
38512
38598
  }
38513
38599
 
38514
38600
  // build/commands/generated/accounting-reports.js
@@ -39001,7 +39087,7 @@ Examples:
39001
39087
  queryParamKeys: []
39002
39088
  });
39003
39089
  });
39004
- resource.command("create").description(`Create a new accounting rule for account code routing or journal posting, with the filters, accounts and required fields the rule editor applies to its category.`).option("--ledger-id <value>", `Identifier of the ledger this rule belongs to.`).option("--name <value>", `Optional user-defined name for the rule.`).requiredOption("--category <value>", `Rule category (e.g. accounting_software, invoice_posted).`).requiredOption("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--tax-schemes <json>", `Tax schemes to match. A context without a tax scheme never matches a rule that sets this filter. Empty means match all.`).option("--tax-territories <json>", `Tax territory country codes to match. A context without a tax territory never matches a rule that sets this filter. Empty means match all.`).option("--tax-rate-classes <json>", `Tax rate classes to match. A context without a tax rate class never matches a rule that sets this filter. Empty means match all.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--bank-account-ids <json>", `Bank account IDs to match. Empty means match all.`).option("--invoice-types <json>", `Invoice kinds to match: \`invoice\` or \`document\`. Refunds and other standard invoices match as \`invoice\`. A context without an invoice, such as a PSP payout, never matches a rule that sets this filter. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (months, years, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).option("--custom-property-filters <json>", `Invoice custom property filters. A rule matches only when every entry matches (AND across entries), and an entry matches when the invoice value is one of its \`values\` (any-of). Matching is strict: an invoice without a value for the property never matches. Each entry adds 10 to the \`suggested_priority\` returned by the rule defaults endpoint. Allowed on invoice_posted, invoice_settled, revenue_recognition, credit_note_created and accounting_software (invoice side) rules. An invoice_settled rule with filters cannot set \`payments_clearing_ledger_account_id\`, as PSP payouts are booked without the invoice. Empty means match all.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing. Must be a \`revenue\` account. On accounting_software rules, a \`revenue\` or \`contra_revenue\` account with entity_type invoice, an \`asset\` or \`contra_asset\` account with entity_type payment.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized. Must be a \`liability\` account.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized. Must be an \`asset\` or \`contra_liability\` account.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue. Must be a \`contra_revenue\` account.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts. Must be a \`contra_revenue\` account.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting. Must be an \`asset\` account.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement. Must be an \`asset\` account.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle. Must be an \`asset\` account.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability. Must be a \`liability\` account.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Must be an \`asset\` account, for doubtful-receivable reclassification, or an \`expense\` account, for direct write-off.`).option("--allowance-for-doubtful-accounts-id <value>", `Allowance for doubtful accounts ledger account ID, set on credit_note_created rules. Must be a \`contra_asset\` account.`).option("--provider-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment provider fees when a payment settles. Must be an \`expense\` account.`).option("--payment-processing-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment processing fees when a payment settles. Takes precedence over \`provider_fees_expense_ledger_account_id\` when set by the same or a higher priority rule. Must be an \`expense\` account.`).option("--payment-processing-fees-revenue-ledger-account-id <value>", `Payment processing fees revenue ledger account ID, set on invoice_settled rules. Must be a \`revenue\` account.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances. Must be a \`liability\` account.`).option("--rev-rec-method <value>", `Revenue recognition method.`).option("--rev-rec-granularity <value>", `Recognition period granularity. Used when \`rev_rec_method\` is \`over_time\`.`).option("--rev-rec-point-in-time-basis <value>", `Date revenue is recognized on. Used when \`rev_rec_method\` is \`point_in_time\`.`).option("--discount-recognition-method <value>", `Method used to recognize discounts.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39090
+ resource.command("create").description(`Create a new accounting rule for account code routing or journal posting, with the filters, accounts and required fields the rule editor applies to its category.`).option("--ledger-id <value>", `Identifier of the ledger this rule belongs to.`).option("--name <value>", `Optional user-defined name for the rule.`).requiredOption("--category <value>", `Rule category (e.g. accounting_software, invoice_posted).`).requiredOption("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--tax-schemes <json>", `Tax schemes to match. A context without a tax scheme never matches a rule that sets this filter. Empty means match all.`).option("--tax-territories <json>", `Tax territory country codes to match. A context without a tax territory never matches a rule that sets this filter. Empty means match all.`).option("--tax-rate-classes <json>", `Tax rate classes to match. A context without a tax rate class never matches a rule that sets this filter. Empty means match all.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--bank-account-ids <json>", `Bank account IDs to match. Empty means match all.`).option("--invoice-types <json>", `Invoice kinds to match: \`invoice\` or \`document\`. Refunds and other standard invoices match as \`invoice\`. A context without an invoice, such as a PSP payout, never matches a rule that sets this filter. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (months, years, etc.). \`recurring\` matches every interval except \`once\` and requires a null \`interval_count\`. \`null\` matches every interval, including \`once\`.`).option("--interval-count <number>", `Billing interval count filter.`).option("--custom-property-filters <json>", `Invoice custom property filters. A rule matches only when every entry matches (AND across entries), and an entry matches when the invoice value is one of its \`values\` (any-of). Matching is strict: an invoice without a value for the property never matches. Each entry adds 10 to the \`suggested_priority\` returned by the rule defaults endpoint. Allowed on invoice_posted, invoice_settled, revenue_recognition, credit_note_created and accounting_software (invoice side) rules. An invoice_settled rule with filters cannot set \`payments_clearing_ledger_account_id\`, as PSP payouts are booked without the invoice. Empty means match all.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing. Must be a \`revenue\` account. On accounting_software rules, a \`revenue\` or \`contra_revenue\` account with entity_type invoice, an \`asset\` or \`contra_asset\` account with entity_type payment.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized. Must be a \`liability\` account.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized. Must be an \`asset\` or \`contra_liability\` account.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue. Must be a \`contra_revenue\` account.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts. Must be a \`contra_revenue\` account.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting. Must be an \`asset\` account.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement. Must be an \`asset\` account.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle. Must be an \`asset\` account.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability. Must be a \`liability\` account.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Must be an \`asset\` account, for doubtful-receivable reclassification, or an \`expense\` account, for direct write-off.`).option("--allowance-for-doubtful-accounts-id <value>", `Allowance for doubtful accounts ledger account ID, set on credit_note_created rules. Must be a \`contra_asset\` account.`).option("--provider-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment provider fees when a payment settles. Must be an \`expense\` account.`).option("--payment-processing-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment processing fees when a payment settles. Takes precedence over \`provider_fees_expense_ledger_account_id\` when set by the same or a higher priority rule. Must be an \`expense\` account.`).option("--payment-processing-fees-revenue-ledger-account-id <value>", `Payment processing fees revenue ledger account ID, set on invoice_settled rules. Must be a \`revenue\` account.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances. Must be a \`liability\` account.`).option("--rev-rec-method <value>", `Revenue recognition method.`).option("--rev-rec-granularity <value>", `Recognition period granularity. Used when \`rev_rec_method\` is \`over_time\`.`).option("--rev-rec-point-in-time-basis <value>", `Date revenue is recognized on. Used when \`rev_rec_method\` is \`point_in_time\`.`).option("--discount-recognition-method <value>", `Method used to recognize discounts.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39005
39091
  Examples:
39006
39092
  hyperline accounting-rules create --category <category> --priority <priority>
39007
39093
  hyperline accounting-rules create --category <category> --priority <priority> --ledger-id <ledger_id> --name <name>
@@ -39101,7 +39187,7 @@ Examples:
39101
39187
  queryParamKeys: []
39102
39188
  });
39103
39189
  });
39104
- resource.command("update").description(`Update an existing accounting rule, with the filters, accounts and required fields the rule editor applies to its category.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Optional user-defined name for the rule.`).option("--category <value>", `Rule category. Cannot be changed after creation, must match the current category when sent.`).option("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--tax-schemes <json>", `Tax schemes to match. A context without a tax scheme never matches a rule that sets this filter. Empty means match all.`).option("--tax-territories <json>", `Tax territory country codes to match. A context without a tax territory never matches a rule that sets this filter. Empty means match all.`).option("--tax-rate-classes <json>", `Tax rate classes to match. A context without a tax rate class never matches a rule that sets this filter. Empty means match all.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--bank-account-ids <json>", `Bank account IDs to match. Empty means match all.`).option("--invoice-types <json>", `Invoice kinds to match: \`invoice\` or \`document\`. Refunds and other standard invoices match as \`invoice\`. A context without an invoice, such as a PSP payout, never matches a rule that sets this filter. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (months, years, etc.).`).option("--interval-count <number>", `Billing interval count filter.`).option("--custom-property-filters <json>", `Invoice custom property filters. A rule matches only when every entry matches (AND across entries), and an entry matches when the invoice value is one of its \`values\` (any-of). Matching is strict: an invoice without a value for the property never matches. Each entry adds 10 to the \`suggested_priority\` returned by the rule defaults endpoint. Allowed on invoice_posted, invoice_settled, revenue_recognition, credit_note_created and accounting_software (invoice side) rules. An invoice_settled rule with filters cannot set \`payments_clearing_ledger_account_id\`, as PSP payouts are booked without the invoice. Empty means match all.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing. Must be a \`revenue\` account. On accounting_software rules, a \`revenue\` or \`contra_revenue\` account with entity_type invoice, an \`asset\` or \`contra_asset\` account with entity_type payment.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized. Must be a \`liability\` account.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized. Must be an \`asset\` or \`contra_liability\` account.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue. Must be a \`contra_revenue\` account.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts. Must be a \`contra_revenue\` account.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting. Must be an \`asset\` account.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement. Must be an \`asset\` account.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle. Must be an \`asset\` account.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability. Must be a \`liability\` account.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Must be an \`asset\` account, for doubtful-receivable reclassification, or an \`expense\` account, for direct write-off.`).option("--allowance-for-doubtful-accounts-id <value>", `Allowance for doubtful accounts ledger account ID, set on credit_note_created rules. Must be a \`contra_asset\` account.`).option("--provider-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment provider fees when a payment settles. Must be an \`expense\` account.`).option("--payment-processing-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment processing fees when a payment settles. Takes precedence over \`provider_fees_expense_ledger_account_id\` when set by the same or a higher priority rule. Must be an \`expense\` account.`).option("--payment-processing-fees-revenue-ledger-account-id <value>", `Payment processing fees revenue ledger account ID, set on invoice_settled rules. Must be a \`revenue\` account.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances. Must be a \`liability\` account.`).option("--rev-rec-method <value>", `Revenue recognition method.`).option("--rev-rec-granularity <value>", `Recognition period granularity. Used when \`rev_rec_method\` is \`over_time\`.`).option("--rev-rec-point-in-time-basis <value>", `Date revenue is recognized on. Used when \`rev_rec_method\` is \`point_in_time\`.`).option("--discount-recognition-method <value>", `Method used to recognize discounts.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39190
+ resource.command("update").description(`Update an existing accounting rule, with the filters, accounts and required fields the rule editor applies to its category.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Optional user-defined name for the rule.`).option("--category <value>", `Rule category. Cannot be changed after creation, must match the current category when sent.`).option("--priority <number>", `Override order. Higher priority wins when multiple rules match.`).option("--product-ids <json>", `Product IDs to match. Empty means match all.`).option("--product-types <json>", `Product types to match. Allowed values: flat_fee, dynamic, seat, credit. Empty means match all.`).option("--customer-ids <json>", `Customer IDs for customer-specific overrides.`).option("--currencies <json>", `Currency codes to match (e.g. EUR, USD).`).option("--countries <json>", `Country codes for jurisdiction-based overrides.`).option("--tax-schemes <json>", `Tax schemes to match. A context without a tax scheme never matches a rule that sets this filter. Empty means match all.`).option("--tax-territories <json>", `Tax territory country codes to match. A context without a tax territory never matches a rule that sets this filter. Empty means match all.`).option("--tax-rate-classes <json>", `Tax rate classes to match. A context without a tax rate class never matches a rule that sets this filter. Empty means match all.`).option("--coupon-ids <json>", `Coupon IDs to match. Empty means match all.`).option("--client-provider-ids <json>", `Client provider IDs to match. Empty means match all.`).option("--payment-method-types <json>", `Payment method types to match. Empty means match all.`).option("--bank-account-ids <json>", `Bank account IDs to match. Empty means match all.`).option("--invoice-types <json>", `Invoice kinds to match: \`invoice\` or \`document\`. Refunds and other standard invoices match as \`invoice\`. A context without an invoice, such as a PSP payout, never matches a rule that sets this filter. Empty means match all.`).option("--interval-period <value>", `Billing interval period filter (months, years, etc.). \`recurring\` matches every interval except \`once\` and requires a null \`interval_count\`. \`null\` matches every interval, including \`once\`.`).option("--interval-count <number>", `Billing interval count filter.`).option("--custom-property-filters <json>", `Invoice custom property filters. A rule matches only when every entry matches (AND across entries), and an entry matches when the invoice value is one of its \`values\` (any-of). Matching is strict: an invoice without a value for the property never matches. Each entry adds 10 to the \`suggested_priority\` returned by the rule defaults endpoint. Allowed on invoice_posted, invoice_settled, revenue_recognition, credit_note_created and accounting_software (invoice side) rules. An invoice_settled rule with filters cannot set \`payments_clearing_ledger_account_id\`, as PSP payouts are booked without the invoice. Empty means match all.`).option("--revenue-ledger-account-id <value>", `Revenue ledger account ID used for invoice line revenue routing. Must be a \`revenue\` account. On accounting_software rules, a \`revenue\` or \`contra_revenue\` account with entity_type invoice, an \`asset\` or \`contra_asset\` account with entity_type payment.`).option("--deferred-revenue-ledger-account-id <value>", `Deferred revenue ledger account ID used before revenue is recognized. Must be a \`liability\` account.`).option("--deferred-discount-ledger-account-id <value>", `Deferred discount ledger account ID used before discounts are recognized. Must be an \`asset\` or \`contra_liability\` account.`).option("--contra-revenue-ledger-account-id <value>", `Contra revenue ledger account ID used for amounts that reduce revenue. Must be a \`contra_revenue\` account.`).option("--discount-ledger-account-id <value>", `Discount ledger account ID used for recognized discounts. Must be a \`contra_revenue\` account.`).option("--ar-ledger-account-id <value>", `Accounts receivable ledger account ID used for invoice posting. Must be an \`asset\` account.`).option("--cash-ledger-account-id <value>", `Cash ledger account ID used for payment settlement. Must be an \`asset\` account.`).option("--payments-clearing-ledger-account-id <value>", `Payments clearing ledger account ID used while payments settle. Must be an \`asset\` account.`).option("--output-tax-ledger-account-id <value>", `Output tax ledger account ID used for tax liability. Must be a \`liability\` account.`).option("--uncollectible-debit-ledger-account-id <value>", `Ledger account ID debited when an invoice becomes uncollectible. Must be an \`asset\` account, for doubtful-receivable reclassification, or an \`expense\` account, for direct write-off.`).option("--allowance-for-doubtful-accounts-id <value>", `Allowance for doubtful accounts ledger account ID, set on credit_note_created rules. Must be a \`contra_asset\` account.`).option("--provider-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment provider fees when a payment settles. Must be an \`expense\` account.`).option("--payment-processing-fees-expense-ledger-account-id <value>", `Expense ledger account ID debited for payment processing fees when a payment settles. Takes precedence over \`provider_fees_expense_ledger_account_id\` when set by the same or a higher priority rule. Must be an \`expense\` account.`).option("--payment-processing-fees-revenue-ledger-account-id <value>", `Payment processing fees revenue ledger account ID, set on invoice_settled rules. Must be a \`revenue\` account.`).option("--customer-credits-ledger-account-id <value>", `Customer credits ledger account ID used for credit balances. Must be a \`liability\` account.`).option("--rev-rec-method <value>", `Revenue recognition method.`).option("--rev-rec-granularity <value>", `Recognition period granularity. Used when \`rev_rec_method\` is \`over_time\`.`).option("--rev-rec-point-in-time-basis <value>", `Date revenue is recognized on. Used when \`rev_rec_method\` is \`point_in_time\`.`).option("--discount-recognition-method <value>", `Method used to recognize discounts.`).option("--journal-id <value>", `Journal ID used to route entries in the accounting provider.`).option("--entity-type <value>", `Entity type the rule applies to.`).addHelpText("after", `
39105
39191
  Examples:
39106
39192
  hyperline accounting-rules update --id <id>
39107
39193
  hyperline accounting-rules update --id <id> --name <name> --category <category>
@@ -40587,6 +40673,52 @@ Examples:
40587
40673
  });
40588
40674
  }
40589
40675
 
40676
+ // build/commands/generated/approval-workflows.js
40677
+ function registerApproval_WorkflowsCommands(parent) {
40678
+ const resource = parent.command("approval-workflows").description("Manage approval workflows");
40679
+ resource.command("list").description(`List approval workflows with their steps and approvers. Those whose \`applicable_flows\` include \`workflow_step\` can be picked as the \`approvalWorkflowId\` of a workflow's Request approval step (\`hyperline.request_approval\`). Filter with \`is_active\`; paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--is-active <value>", `Only return workflows matching this active state.`).addHelpText("after", `
40680
+ Examples:
40681
+ hyperline approval-workflows list
40682
+ hyperline approval-workflows list --take <take> --is-active <is_active>`).action(async (opts) => {
40683
+ const ctx = resource.parent?.opts()._ctx;
40684
+ if (!ctx) {
40685
+ process.stderr.write("Error: Not authenticated\n");
40686
+ process.exit(1);
40687
+ }
40688
+ const args = {};
40689
+ if (opts.isActive !== void 0)
40690
+ args.is_active = opts.isActive;
40691
+ if (opts.take !== void 0)
40692
+ args.take = Number(opts.take);
40693
+ if (opts.skip !== void 0)
40694
+ args.skip = Number(opts.skip);
40695
+ await ctx.execute({
40696
+ method: "GET",
40697
+ path: "/v1/approvals/workflows",
40698
+ args,
40699
+ queryParamKeys: ["take", "skip", "is_active"]
40700
+ });
40701
+ });
40702
+ resource.command("get").description(`Retrieve a single approval workflow.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
40703
+ Examples:
40704
+ hyperline approval-workflows get --id <id>`).action(async (opts) => {
40705
+ const ctx = resource.parent?.opts()._ctx;
40706
+ if (!ctx) {
40707
+ process.stderr.write("Error: Not authenticated\n");
40708
+ process.exit(1);
40709
+ }
40710
+ const args = {};
40711
+ if (opts.id !== void 0)
40712
+ args.id = opts.id;
40713
+ await ctx.execute({
40714
+ method: "GET",
40715
+ path: "/v1/approvals/workflows/{id}",
40716
+ args,
40717
+ queryParamKeys: []
40718
+ });
40719
+ });
40720
+ }
40721
+
40590
40722
  // build/commands/generated/bank-accounts.js
40591
40723
  function registerBank_AccountsCommands(parent) {
40592
40724
  const resource = parent.command("bank-accounts").description("Manage bank accounts");
@@ -40656,6 +40788,84 @@ Examples:
40656
40788
  });
40657
40789
  }
40658
40790
 
40791
+ // build/commands/generated/catalog.js
40792
+ function registerCatalogCommands(parent) {
40793
+ const resource = parent.command("catalog").description("Manage catalog");
40794
+ resource.command("list-catalog-versions").description(`List product catalog versions (pending draft and published history). Catalog versioning must be enabled for the organisation.`).addHelpText("after", `
40795
+ Examples:
40796
+ hyperline catalog list-catalog-versions`).action(async (_opts) => {
40797
+ const ctx = resource.parent?.opts()._ctx;
40798
+ if (!ctx) {
40799
+ process.stderr.write("Error: Not authenticated\n");
40800
+ process.exit(1);
40801
+ }
40802
+ const args = {};
40803
+ await ctx.execute({
40804
+ method: "GET",
40805
+ path: "/v1/catalog/versions",
40806
+ args,
40807
+ queryParamKeys: []
40808
+ });
40809
+ });
40810
+ resource.command("get-catalog-draft").description(`Get the pending product catalog draft (null when there is none).`).addHelpText("after", `
40811
+ Examples:
40812
+ hyperline catalog get-catalog-draft`).action(async (_opts) => {
40813
+ const ctx = resource.parent?.opts()._ctx;
40814
+ if (!ctx) {
40815
+ process.stderr.write("Error: Not authenticated\n");
40816
+ process.exit(1);
40817
+ }
40818
+ const args = {};
40819
+ await ctx.execute({
40820
+ method: "GET",
40821
+ path: "/v1/catalog/versions/draft",
40822
+ args,
40823
+ queryParamKeys: []
40824
+ });
40825
+ });
40826
+ resource.command("publish-catalog-draft").description(`Publish the pending product catalog draft: its changes become the live catalog.`).addHelpText("after", `
40827
+ Examples:
40828
+ hyperline catalog publish-catalog-draft
40829
+ hyperline catalog publish-catalog-draft --output json`).action(async (_opts) => {
40830
+ const ctx = resource.parent?.opts()._ctx;
40831
+ if (!ctx) {
40832
+ process.stderr.write("Error: Not authenticated\n");
40833
+ process.exit(1);
40834
+ }
40835
+ const args = {};
40836
+ await ctx.execute({
40837
+ method: "POST",
40838
+ path: "/v1/catalog/versions/draft/publish",
40839
+ args,
40840
+ queryParamKeys: []
40841
+ });
40842
+ });
40843
+ resource.command("discard-catalog-draft").description(`Discard the pending product catalog draft without publishing it.`).option("--yes", "Skip confirmation").addHelpText("after", `
40844
+ Examples:
40845
+ hyperline catalog discard-catalog-draft
40846
+ hyperline catalog discard-catalog-draft --output json`).action(async (opts) => {
40847
+ const ctx = resource.parent?.opts()._ctx;
40848
+ if (!ctx) {
40849
+ process.stderr.write("Error: Not authenticated\n");
40850
+ process.exit(1);
40851
+ }
40852
+ const args = {};
40853
+ if (!opts.yes) {
40854
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
40855
+ if (!confirmed) {
40856
+ process.stdout.write("Aborted.\n");
40857
+ return;
40858
+ }
40859
+ }
40860
+ await ctx.execute({
40861
+ method: "DELETE",
40862
+ path: "/v1/catalog/versions/draft",
40863
+ args,
40864
+ queryParamKeys: []
40865
+ });
40866
+ });
40867
+ }
40868
+
40659
40869
  // build/commands/generated/companies.js
40660
40870
  function registerCompaniesCommands(parent) {
40661
40871
  const resource = parent.command("companies").description("Manage companies");
@@ -40698,6 +40908,332 @@ Examples:
40698
40908
  });
40699
40909
  }
40700
40910
 
40911
+ // build/commands/generated/contracts-clauses.js
40912
+ function registerContracts_ClausesCommands(parent) {
40913
+ const resource = parent.command("contracts-clauses").description("Manage contracts > clauses");
40914
+ resource.command("list-contract-clauses").description(`List the contract clauses of the contract library, with their texts and translations. Use the returned IDs in \`contract_clause_ids\` when creating a quote. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
40915
+ Examples:
40916
+ hyperline contracts-clauses list-contract-clauses
40917
+ hyperline contracts-clauses list-contract-clauses --take <take>`).action(async (opts) => {
40918
+ const ctx = resource.parent?.opts()._ctx;
40919
+ if (!ctx) {
40920
+ process.stderr.write("Error: Not authenticated\n");
40921
+ process.exit(1);
40922
+ }
40923
+ const args = {};
40924
+ if (opts.take !== void 0)
40925
+ args.take = Number(opts.take);
40926
+ if (opts.skip !== void 0)
40927
+ args.skip = Number(opts.skip);
40928
+ await ctx.execute({
40929
+ method: "GET",
40930
+ path: "/v1/contracts/clauses",
40931
+ args,
40932
+ queryParamKeys: ["take", "skip"]
40933
+ });
40934
+ });
40935
+ resource.command("create-contract-clause").description(`Create a contract clause in the contract library, with a default text and optional translations keyed by language code.`).requiredOption("--name <value>", `Name of the contract clause, displayed in the contract library.`).requiredOption("--text <value>", `Default text of the clause, used when no translation exists for the customer language. Plain text, line breaks are preserved.`).option("--translations <json>", `Translations of the clause, keyed by language code. The translation matching the customer language is used instead of \`text\`.`).option("--invoicing-entity-ids <json>", `IDs of the invoicing entities for which the clause is available when building a quote.`).addHelpText("after", `
40936
+ Examples:
40937
+ hyperline contracts-clauses create-contract-clause --name <name> --text <text>
40938
+ hyperline contracts-clauses create-contract-clause --name <name> --text <text> --translations <translations> --invoicing-entity-ids <invoicing_entity_ids>
40939
+ hyperline contracts-clauses create-contract-clause --name <name> --text <text> --output json`).action(async (opts) => {
40940
+ const ctx = resource.parent?.opts()._ctx;
40941
+ if (!ctx) {
40942
+ process.stderr.write("Error: Not authenticated\n");
40943
+ process.exit(1);
40944
+ }
40945
+ const args = {};
40946
+ if (opts.name !== void 0)
40947
+ args.name = opts.name;
40948
+ if (opts.text !== void 0)
40949
+ args.text = opts.text;
40950
+ if (opts.translations !== void 0)
40951
+ args.translations = JSON.parse(opts.translations);
40952
+ if (opts.invoicingEntityIds !== void 0)
40953
+ args.invoicing_entity_ids = JSON.parse(opts.invoicingEntityIds);
40954
+ await ctx.execute({
40955
+ method: "POST",
40956
+ path: "/v1/contracts/clauses",
40957
+ args,
40958
+ queryParamKeys: []
40959
+ });
40960
+ });
40961
+ resource.command("get-contract-clause").description(`Retrieve a contract clause by ID.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
40962
+ Examples:
40963
+ hyperline contracts-clauses get-contract-clause --id <id>`).action(async (opts) => {
40964
+ const ctx = resource.parent?.opts()._ctx;
40965
+ if (!ctx) {
40966
+ process.stderr.write("Error: Not authenticated\n");
40967
+ process.exit(1);
40968
+ }
40969
+ const args = {};
40970
+ if (opts.id !== void 0)
40971
+ args.id = opts.id;
40972
+ await ctx.execute({
40973
+ method: "GET",
40974
+ path: "/v1/contracts/clauses/{id}",
40975
+ args,
40976
+ queryParamKeys: []
40977
+ });
40978
+ });
40979
+ resource.command("update-contract-clause").description(`Update the name, text, translations or invoicing entities of a contract clause. Sending \`translations\` replaces all existing translations.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Name of the contract clause, displayed in the contract library.`).option("--text <value>", `Default text of the clause, used when no translation exists for the customer language. Plain text, line breaks are preserved.`).option("--translations <json>", `Translations of the clause, keyed by language code. Replaces all existing translations: omitted languages are removed.`).option("--invoicing-entity-ids <json>", `IDs of the invoicing entities for which the clause is available when building a quote.`).addHelpText("after", `
40980
+ Examples:
40981
+ hyperline contracts-clauses update-contract-clause --id <id>
40982
+ hyperline contracts-clauses update-contract-clause --id <id> --name <name> --text <text>
40983
+ hyperline contracts-clauses update-contract-clause --id <id> --output json`).action(async (opts) => {
40984
+ const ctx = resource.parent?.opts()._ctx;
40985
+ if (!ctx) {
40986
+ process.stderr.write("Error: Not authenticated\n");
40987
+ process.exit(1);
40988
+ }
40989
+ const args = {};
40990
+ if (opts.id !== void 0)
40991
+ args.id = opts.id;
40992
+ if (opts.name !== void 0)
40993
+ args.name = opts.name;
40994
+ if (opts.text !== void 0)
40995
+ args.text = opts.text;
40996
+ if (opts.translations !== void 0)
40997
+ args.translations = JSON.parse(opts.translations);
40998
+ if (opts.invoicingEntityIds !== void 0)
40999
+ args.invoicing_entity_ids = JSON.parse(opts.invoicingEntityIds);
41000
+ await ctx.execute({
41001
+ method: "PUT",
41002
+ path: "/v1/contracts/clauses/{id}",
41003
+ args,
41004
+ queryParamKeys: []
41005
+ });
41006
+ });
41007
+ resource.command("delete-contract-clause").description(`Delete a contract clause from the contract library. Existing quotes keep their copy of the clause.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
41008
+ Examples:
41009
+ hyperline contracts-clauses delete-contract-clause --id <id>
41010
+ hyperline contracts-clauses delete-contract-clause --id <id> --output json`).action(async (opts) => {
41011
+ const ctx = resource.parent?.opts()._ctx;
41012
+ if (!ctx) {
41013
+ process.stderr.write("Error: Not authenticated\n");
41014
+ process.exit(1);
41015
+ }
41016
+ const args = {};
41017
+ if (opts.id !== void 0)
41018
+ args.id = opts.id;
41019
+ if (!opts.yes) {
41020
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
41021
+ if (!confirmed) {
41022
+ process.stdout.write("Aborted.\n");
41023
+ return;
41024
+ }
41025
+ }
41026
+ await ctx.execute({
41027
+ method: "DELETE",
41028
+ path: "/v1/contracts/clauses/{id}",
41029
+ args,
41030
+ queryParamKeys: []
41031
+ });
41032
+ });
41033
+ }
41034
+
41035
+ // build/commands/generated/contracts-documents.js
41036
+ function registerContracts_DocumentsCommands(parent) {
41037
+ const resource = parent.command("contracts-documents").description("Manage contracts > documents");
41038
+ resource.command("list-contract-documents").description(`List the contract documents of the contract library (terms of service, DPA, SLA...), with their contents per language and countries and the files of each content. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).addHelpText("after", `
41039
+ Examples:
41040
+ hyperline contracts-documents list-contract-documents
41041
+ hyperline contracts-documents list-contract-documents --take <take>`).action(async (opts) => {
41042
+ const ctx = resource.parent?.opts()._ctx;
41043
+ if (!ctx) {
41044
+ process.stderr.write("Error: Not authenticated\n");
41045
+ process.exit(1);
41046
+ }
41047
+ const args = {};
41048
+ if (opts.take !== void 0)
41049
+ args.take = Number(opts.take);
41050
+ if (opts.skip !== void 0)
41051
+ args.skip = Number(opts.skip);
41052
+ await ctx.execute({
41053
+ method: "GET",
41054
+ path: "/v1/contracts/documents",
41055
+ args,
41056
+ queryParamKeys: ["take", "skip"]
41057
+ });
41058
+ });
41059
+ resource.command("create-contract-document").description(`Create a contract document in the contract library. Its files are added afterwards per language with \`create_contract_document_content\`.`).requiredOption("--name <value>", `Name of the contract document, displayed in the contract library.`).option("--invoicing-entity-ids <json>", `IDs of the invoicing entities for which the contract document is available when building a quote.`).addHelpText("after", `
41060
+ Examples:
41061
+ hyperline contracts-documents create-contract-document --name <name>
41062
+ hyperline contracts-documents create-contract-document --name <name> --invoicing-entity-ids <invoicing_entity_ids>
41063
+ hyperline contracts-documents create-contract-document --name <name> --output json`).action(async (opts) => {
41064
+ const ctx = resource.parent?.opts()._ctx;
41065
+ if (!ctx) {
41066
+ process.stderr.write("Error: Not authenticated\n");
41067
+ process.exit(1);
41068
+ }
41069
+ const args = {};
41070
+ if (opts.name !== void 0)
41071
+ args.name = opts.name;
41072
+ if (opts.invoicingEntityIds !== void 0)
41073
+ args.invoicing_entity_ids = JSON.parse(opts.invoicingEntityIds);
41074
+ await ctx.execute({
41075
+ method: "POST",
41076
+ path: "/v1/contracts/documents",
41077
+ args,
41078
+ queryParamKeys: []
41079
+ });
41080
+ });
41081
+ resource.command("get-contract-document").description(`Retrieve a contract document by ID, with its contents and their files.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
41082
+ Examples:
41083
+ hyperline contracts-documents get-contract-document --id <id>`).action(async (opts) => {
41084
+ const ctx = resource.parent?.opts()._ctx;
41085
+ if (!ctx) {
41086
+ process.stderr.write("Error: Not authenticated\n");
41087
+ process.exit(1);
41088
+ }
41089
+ const args = {};
41090
+ if (opts.id !== void 0)
41091
+ args.id = opts.id;
41092
+ await ctx.execute({
41093
+ method: "GET",
41094
+ path: "/v1/contracts/documents/{id}",
41095
+ args,
41096
+ queryParamKeys: []
41097
+ });
41098
+ });
41099
+ resource.command("update-contract-document").description(`Update the name or invoicing entities of a contract document. Its files are updated per content with \`update_contract_document_content\`.`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `Name of the contract document, displayed in the contract library.`).option("--invoicing-entity-ids <json>", `IDs of the invoicing entities for which the contract document is available when building a quote.`).addHelpText("after", `
41100
+ Examples:
41101
+ hyperline contracts-documents update-contract-document --id <id>
41102
+ hyperline contracts-documents update-contract-document --id <id> --name <name> --invoicing-entity-ids <invoicing_entity_ids>
41103
+ hyperline contracts-documents update-contract-document --id <id> --output json`).action(async (opts) => {
41104
+ const ctx = resource.parent?.opts()._ctx;
41105
+ if (!ctx) {
41106
+ process.stderr.write("Error: Not authenticated\n");
41107
+ process.exit(1);
41108
+ }
41109
+ const args = {};
41110
+ if (opts.id !== void 0)
41111
+ args.id = opts.id;
41112
+ if (opts.name !== void 0)
41113
+ args.name = opts.name;
41114
+ if (opts.invoicingEntityIds !== void 0)
41115
+ args.invoicing_entity_ids = JSON.parse(opts.invoicingEntityIds);
41116
+ await ctx.execute({
41117
+ method: "PUT",
41118
+ path: "/v1/contracts/documents/{id}",
41119
+ args,
41120
+ queryParamKeys: []
41121
+ });
41122
+ });
41123
+ resource.command("delete-contract-document").description(`Delete a contract document from the contract library. Existing quotes keep their copy of the files.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
41124
+ Examples:
41125
+ hyperline contracts-documents delete-contract-document --id <id>
41126
+ hyperline contracts-documents delete-contract-document --id <id> --output json`).action(async (opts) => {
41127
+ const ctx = resource.parent?.opts()._ctx;
41128
+ if (!ctx) {
41129
+ process.stderr.write("Error: Not authenticated\n");
41130
+ process.exit(1);
41131
+ }
41132
+ const args = {};
41133
+ if (opts.id !== void 0)
41134
+ args.id = opts.id;
41135
+ if (!opts.yes) {
41136
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
41137
+ if (!confirmed) {
41138
+ process.stdout.write("Aborted.\n");
41139
+ return;
41140
+ }
41141
+ }
41142
+ await ctx.execute({
41143
+ method: "DELETE",
41144
+ path: "/v1/contracts/documents/{id}",
41145
+ args,
41146
+ queryParamKeys: []
41147
+ });
41148
+ });
41149
+ resource.command("create-contract-document-content").description(`Add a content to a contract document: its files for one language (\`default\` as fallback) and optional countries, sent as a comma-separated list. At least one PDF or Word file is required.`).requiredOption("--id <value>", `id parameter`).requiredOption("--language <value>", `Language of the content. \`default\` is used when no content exists for the customer language.`).option("--countries <value>", `Countries the content applies to, as ISO 3166-1 alpha-2 codes. Empty means all countries. In a multipart request, send a comma-separated list.`).requiredOption("--files <paths...>", `Paths of the local files to upload (space-separated, sends a multipart request)`).addHelpText("after", `
41150
+ Examples:
41151
+ hyperline contracts-documents create-contract-document-content --id <id> --language <language> --files <path>
41152
+ hyperline contracts-documents create-contract-document-content --id <id> --language <language> --files <path> --countries <countries>
41153
+ hyperline contracts-documents create-contract-document-content --id <id> --language <language> --files <path> --output json`).action(async (opts) => {
41154
+ const ctx = resource.parent?.opts()._ctx;
41155
+ if (!ctx) {
41156
+ process.stderr.write("Error: Not authenticated\n");
41157
+ process.exit(1);
41158
+ }
41159
+ const args = {};
41160
+ if (opts.id !== void 0)
41161
+ args.id = opts.id;
41162
+ if (opts.language !== void 0)
41163
+ args.language = opts.language;
41164
+ if (opts.countries !== void 0)
41165
+ args.countries = opts.countries;
41166
+ const files = {};
41167
+ if (opts.files !== void 0)
41168
+ files.files = [opts.files].flat();
41169
+ await ctx.execute({
41170
+ method: "POST",
41171
+ path: "/v1/contracts/documents/{id}/contents",
41172
+ args,
41173
+ queryParamKeys: [],
41174
+ files
41175
+ });
41176
+ });
41177
+ resource.command("update-contract-document-content").description(`Update a contract document content. Sent files replace all its existing files: use it to publish a new version of a document. Existing quotes keep their copy of the previous files.`).requiredOption("--id <value>", `id parameter`).requiredOption("--content-id <value>", `contentId parameter`).option("--language <value>", `Language of the content. \`default\` is used when no content exists for the customer language.`).option("--countries <value>", `Countries the content applies to, as ISO 3166-1 alpha-2 codes. Empty means all countries. In a multipart request, send a comma-separated list, or an empty value for all countries.`).option("--files <paths...>", `Paths of the local files to upload (space-separated, sends a multipart request)`).addHelpText("after", `
41178
+ Examples:
41179
+ hyperline contracts-documents update-contract-document-content --id <id> --content-id <contentId>
41180
+ hyperline contracts-documents update-contract-document-content --id <id> --content-id <contentId> --language <language> --countries <countries>
41181
+ hyperline contracts-documents update-contract-document-content --id <id> --content-id <contentId> --output json`).action(async (opts) => {
41182
+ const ctx = resource.parent?.opts()._ctx;
41183
+ if (!ctx) {
41184
+ process.stderr.write("Error: Not authenticated\n");
41185
+ process.exit(1);
41186
+ }
41187
+ const args = {};
41188
+ if (opts.id !== void 0)
41189
+ args.id = opts.id;
41190
+ if (opts.contentId !== void 0)
41191
+ args.contentId = opts.contentId;
41192
+ if (opts.language !== void 0)
41193
+ args.language = opts.language;
41194
+ if (opts.countries !== void 0)
41195
+ args.countries = opts.countries;
41196
+ const files = {};
41197
+ if (opts.files !== void 0)
41198
+ files.files = [opts.files].flat();
41199
+ await ctx.execute({
41200
+ method: "PUT",
41201
+ path: "/v1/contracts/documents/{id}/contents/{contentId}",
41202
+ args,
41203
+ queryParamKeys: [],
41204
+ files
41205
+ });
41206
+ });
41207
+ resource.command("delete-contract-document-content").description(`Delete a content (one language and countries version) of a contract document.`).requiredOption("--id <value>", `id parameter`).requiredOption("--content-id <value>", `contentId parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
41208
+ Examples:
41209
+ hyperline contracts-documents delete-contract-document-content --id <id> --content-id <contentId>
41210
+ hyperline contracts-documents delete-contract-document-content --id <id> --content-id <contentId> --output json`).action(async (opts) => {
41211
+ const ctx = resource.parent?.opts()._ctx;
41212
+ if (!ctx) {
41213
+ process.stderr.write("Error: Not authenticated\n");
41214
+ process.exit(1);
41215
+ }
41216
+ const args = {};
41217
+ if (opts.id !== void 0)
41218
+ args.id = opts.id;
41219
+ if (opts.contentId !== void 0)
41220
+ args.contentId = opts.contentId;
41221
+ if (!opts.yes) {
41222
+ const confirmed = await confirmPrompt("Are you sure? Pass --yes to skip. [y/N] ");
41223
+ if (!confirmed) {
41224
+ process.stdout.write("Aborted.\n");
41225
+ return;
41226
+ }
41227
+ }
41228
+ await ctx.execute({
41229
+ method: "DELETE",
41230
+ path: "/v1/contracts/documents/{id}/contents/{contentId}",
41231
+ args,
41232
+ queryParamKeys: []
41233
+ });
41234
+ });
41235
+ }
41236
+
40701
41237
  // build/commands/generated/coupons.js
40702
41238
  function registerCouponsCommands(parent) {
40703
41239
  const resource = parent.command("coupons").description("Manage coupons");
@@ -41149,7 +41685,7 @@ Examples:
41149
41685
  // build/commands/generated/customers.js
41150
41686
  function registerCustomersCommands(parent) {
41151
41687
  const resource = parent.command("customers").description("Manage customers");
41152
- resource.command("list").description(`List customers with optional filters for name, type, status, currency, country, external_id, billing_email, search, tax_id, tax_id_status, subscription_status, invoicing_entity_id, segment_id, custom_properties, payment_method_type, integration_entity_id, created_at, and updated_at. Sortable by created_at or updated_at. Paginated with limit/cursor.`).option("--limit <number>", `Maximum number of items to return (1-100).`).option("--cursor <value>", `Opaque cursor returned in the previous response's \`next_cursor\`. Omit to fetch the first page.`).option("--include-total <value>", `Set to \`true\` to include \`total\` in the response.`).option("--order <value>", `Sort direction.`).option("--sort <value>", `Field used to sort the results.`).option("--tax-id-status <value>", `
41688
+ resource.command("list").description(`List customers with optional filters for name, type, status, currency, country, external_id, billing_email, search, tax_id, tax_id_status, subscription_status, invoicing_entity_id, segment_id, custom_properties (JSON object of slug to exact value, e.g. {"my_slug":"value"}; slugs matching no custom property are ignored), payment_method_type, integration_entity_id, created_at, and updated_at. Sortable by created_at or updated_at. Paginated with limit/cursor.`).option("--limit <number>", `Maximum number of items to return (1-100).`).option("--cursor <value>", `Opaque cursor returned in the previous response's \`next_cursor\`. Omit to fetch the first page.`).option("--include-total <value>", `Set to \`true\` to include \`total\` in the response.`).option("--order <value>", `Sort direction.`).option("--sort <value>", `Field used to sort the results.`).option("--tax-id-status <value>", `
41153
41689
  Verification status of the customer tax ID.
41154
41690
 
41155
41691
  - \`valid\`: Tax ID has been verified and is valid.
@@ -41157,7 +41693,7 @@ Verification status of the customer tax ID.
41157
41693
  - \`mismatch\`: Tax ID is valid but is for a different country than the customer's country.
41158
41694
  - \`unverified\`: Tax ID has not been verified yet.
41159
41695
  - \`unsupported\`: Tax ID verification for this type not supported yet.
41160
- `).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--type <value>", `type`).option("--type.in <value>", `type__in`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--country <value>", `country`).option("--country.not <value>", `country__not`).option("--country.equals <value>", `country__equals`).option("--country.contains <value>", `country__contains`).option("--country.starts-with <value>", `country__startsWith`).option("--country.end-with <value>", `country__endWith`).option("--country.is-null <value>", `country__isNull`).option("--country.is-not-null <value>", `country__isNotNull`).option("--external-id <value>", `external_id`).option("--external-id.not <value>", `external_id__not`).option("--external-id.equals <value>", `external_id__equals`).option("--external-id.contains <value>", `external_id__contains`).option("--external-id.starts-with <value>", `external_id__startsWith`).option("--external-id.end-with <value>", `external_id__endWith`).option("--external-id.is-null <value>", `external_id__isNull`).option("--external-id.is-not-null <value>", `external_id__isNotNull`).option("--billing-email <value>", `billing_email`).option("--billing-email.not <value>", `billing_email__not`).option("--billing-email.equals <value>", `billing_email__equals`).option("--billing-email.contains <value>", `billing_email__contains`).option("--billing-email.starts-with <value>", `billing_email__startsWith`).option("--billing-email.end-with <value>", `billing_email__endWith`).option("--billing-email.is-null <value>", `billing_email__isNull`).option("--billing-email.is-not-null <value>", `billing_email__isNotNull`).option("--search <value>", `search`).option("--tax-id <value>", `tax_id`).option("--tax-id.not <value>", `tax_id__not`).option("--tax-id.equals <value>", `tax_id__equals`).option("--tax-id.contains <value>", `tax_id__contains`).option("--tax-id.starts-with <value>", `tax_id__startsWith`).option("--tax-id.end-with <value>", `tax_id__endWith`).option("--tax-id.is-null <value>", `tax_id__isNull`).option("--tax-id.is-not-null <value>", `tax_id__isNotNull`).option("--subscription-status <value>", `subscription_status`).option("--subscription-status.in <value>", `subscription_status__in`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--invoicing-entity-id.not <value>", `invoicing_entity_id__not`).option("--invoicing-entity-id.equals <value>", `invoicing_entity_id__equals`).option("--invoicing-entity-id.contains <value>", `invoicing_entity_id__contains`).option("--invoicing-entity-id.starts-with <value>", `invoicing_entity_id__startsWith`).option("--invoicing-entity-id.end-with <value>", `invoicing_entity_id__endWith`).option("--segment-id <value>", `segment_id`).option("--custom-properties <value>", `custom_properties`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-type.in <value>", `payment_method_type__in`).option("--integration-entity-id <value>", `integration_entity_id`).option("--created-at <value>", `created_at`).option("--created-at.not <value>", `created_at__not`).option("--created-at.equals <value>", `created_at__equals`).option("--created-at.lt <value>", `created_at__lt`).option("--created-at.lte <value>", `created_at__lte`).option("--created-at.gt <value>", `created_at__gt`).option("--created-at.gte <value>", `created_at__gte`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
41696
+ `).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--type <value>", `type`).option("--type.in <value>", `type__in`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--currency.is-null <value>", `currency__isNull`).option("--currency.is-not-null <value>", `currency__isNotNull`).option("--country <value>", `country`).option("--country.not <value>", `country__not`).option("--country.equals <value>", `country__equals`).option("--country.contains <value>", `country__contains`).option("--country.starts-with <value>", `country__startsWith`).option("--country.end-with <value>", `country__endWith`).option("--country.is-null <value>", `country__isNull`).option("--country.is-not-null <value>", `country__isNotNull`).option("--external-id <value>", `external_id`).option("--external-id.not <value>", `external_id__not`).option("--external-id.equals <value>", `external_id__equals`).option("--external-id.contains <value>", `external_id__contains`).option("--external-id.starts-with <value>", `external_id__startsWith`).option("--external-id.end-with <value>", `external_id__endWith`).option("--external-id.is-null <value>", `external_id__isNull`).option("--external-id.is-not-null <value>", `external_id__isNotNull`).option("--billing-email <value>", `billing_email`).option("--billing-email.not <value>", `billing_email__not`).option("--billing-email.equals <value>", `billing_email__equals`).option("--billing-email.contains <value>", `billing_email__contains`).option("--billing-email.starts-with <value>", `billing_email__startsWith`).option("--billing-email.end-with <value>", `billing_email__endWith`).option("--billing-email.is-null <value>", `billing_email__isNull`).option("--billing-email.is-not-null <value>", `billing_email__isNotNull`).option("--search <value>", `search`).option("--tax-id <value>", `tax_id`).option("--tax-id.not <value>", `tax_id__not`).option("--tax-id.equals <value>", `tax_id__equals`).option("--tax-id.contains <value>", `tax_id__contains`).option("--tax-id.starts-with <value>", `tax_id__startsWith`).option("--tax-id.end-with <value>", `tax_id__endWith`).option("--tax-id.is-null <value>", `tax_id__isNull`).option("--tax-id.is-not-null <value>", `tax_id__isNotNull`).option("--subscription-status <value>", `subscription_status`).option("--subscription-status.in <value>", `subscription_status__in`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--invoicing-entity-id.not <value>", `invoicing_entity_id__not`).option("--invoicing-entity-id.equals <value>", `invoicing_entity_id__equals`).option("--invoicing-entity-id.contains <value>", `invoicing_entity_id__contains`).option("--invoicing-entity-id.starts-with <value>", `invoicing_entity_id__startsWith`).option("--invoicing-entity-id.end-with <value>", `invoicing_entity_id__endWith`).option("--segment-id <value>", `segment_id`).option("--custom-properties <value>", `Filter by custom property values, as a JSON object mapping a custom property slug to the exact value to match. Suffix a slug with \`__contains\` for a case-sensitive substring match on text values. Several entries are combined with AND. Entries whose slug matches no custom property, or whose value is \`false\`, \`0\`, \`null\` or an empty string, are ignored.`).option("--payment-method-type <value>", `payment_method_type`).option("--payment-method-type.in <value>", `payment_method_type__in`).option("--integration-entity-id <value>", `integration_entity_id`).option("--created-at <value>", `created_at`).option("--created-at.not <value>", `created_at__not`).option("--created-at.equals <value>", `created_at__equals`).option("--created-at.lt <value>", `created_at__lt`).option("--created-at.lte <value>", `created_at__lte`).option("--created-at.gt <value>", `created_at__gt`).option("--created-at.gte <value>", `created_at__gte`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
41161
41697
  Examples:
41162
41698
  hyperline customers list
41163
41699
  hyperline customers list --limit <limit> --cursor <cursor>`).action(async (opts) => {
@@ -41878,7 +42414,13 @@ Examples:
41878
42414
  queryParamKeys: []
41879
42415
  });
41880
42416
  });
41881
- resource.command("create-customer-address").description(`Create a shipping address with type shipping; billing creation is rejected because a customer can have at most one billing address, managed through the customer endpoint.`).requiredOption("--customer-id <value>", `customerId parameter`).requiredOption("--type <value>", `Only shipping addresses can be created here. A customer has at most one active billing address, managed through the customer or by updating its address ID.`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `Only for US country. Second part of subdivision code in ISO format. See [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US).`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).option("--tax-id <value>", `Tax ID override for a shipping address. Null or blank inherits the customer's tax ID; omission on update preserves the override. Billing addresses cannot have an override.`).addHelpText("after", `
42417
+ resource.command("create-customer-address").description(`Create a shipping address with type shipping; billing creation is rejected because a customer can have at most one billing address, managed through the customer endpoint.`).requiredOption("--customer-id <value>", `customerId parameter`).requiredOption("--type <value>", `Only shipping addresses can be created here. A customer has at most one active billing address, managed through the customer or by updating its address ID.`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `State or province of the address, stored as its code (the second part of the ISO 3166-2 code, e.g. \`CA\` for \`US-CA\`) for:
42418
+ - United States: state, see [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US)
42419
+ - Canada: province or territory, see [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA)
42420
+ - Italy: province, see [ISO 3166-2:IT](https://en.wikipedia.org/wiki/ISO_3166-2:IT)
42421
+ - Brazil: state, see [ISO 3166-2:BR](https://en.wikipedia.org/wiki/ISO_3166-2:BR)
42422
+
42423
+ A code or a name is accepted (e.g. \`ON\` or \`Ontario\`); a value that matches neither for these countries is rejected. For any other country, the state is ignored.`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).option("--tax-id <value>", `Tax ID override for a shipping address. Null or blank inherits the customer's tax ID; omission on update preserves the override. Billing addresses cannot have an override.`).addHelpText("after", `
41882
42424
  Examples:
41883
42425
  hyperline customers-address create-customer-address --customer-id <customerId> --type <type>
41884
42426
  hyperline customers-address create-customer-address --customer-id <customerId> --type <type> --name <name> --line1 <line1>
@@ -41916,7 +42458,13 @@ Examples:
41916
42458
  queryParamKeys: []
41917
42459
  });
41918
42460
  });
41919
- resource.command("update-customer-address").description(`Update a billing or shipping address by ID; billing changes also update the customer billing-address projection.`).requiredOption("--customer-id <value>", `customerId parameter`).requiredOption("--address-id <value>", `addressId parameter`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `Only for US country. Second part of subdivision code in ISO format. See [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US).`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).option("--tax-id <value>", `Tax ID override for a shipping address. Null or blank inherits the customer's tax ID; omission on update preserves the override. Billing addresses cannot have an override.`).addHelpText("after", `
42461
+ resource.command("update-customer-address").description(`Update a billing or shipping address by ID; billing changes also update the customer billing-address projection.`).requiredOption("--customer-id <value>", `customerId parameter`).requiredOption("--address-id <value>", `addressId parameter`).option("--name <value>", `Address name.`).option("--line1 <value>", `Address first line.`).option("--line2 <value>", `Address second line (optional).`).option("--city <value>", `Address city.`).option("--zip <value>", `Address ZIP code.`).option("--state <value>", `State or province of the address, stored as its code (the second part of the ISO 3166-2 code, e.g. \`CA\` for \`US-CA\`) for:
42462
+ - United States: state, see [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US)
42463
+ - Canada: province or territory, see [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA)
42464
+ - Italy: province, see [ISO 3166-2:IT](https://en.wikipedia.org/wiki/ISO_3166-2:IT)
42465
+ - Brazil: state, see [ISO 3166-2:BR](https://en.wikipedia.org/wiki/ISO_3166-2:BR)
42466
+
42467
+ A code or a name is accepted (e.g. \`ON\` or \`Ontario\`); a value that matches neither for these countries is rejected. For any other country, the state is ignored.`).option("--country <value>", `Two-letter country code in ISO format. See [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).`).option("--tax-id <value>", `Tax ID override for a shipping address. Null or blank inherits the customer's tax ID; omission on update preserves the override. Billing addresses cannot have an override.`).addHelpText("after", `
41920
42468
  Examples:
41921
42469
  hyperline customers-address update-customer-address --customer-id <customerId> --address-id <addressId>
41922
42470
  hyperline customers-address update-customer-address --customer-id <customerId> --address-id <addressId> --name <name> --line1 <line1>
@@ -43166,10 +43714,10 @@ Examples:
43166
43714
  ]
43167
43715
  });
43168
43716
  });
43169
- resource.command("create").description(`Upload a new file (max 10MB). Requires multipart form data with a file field and metadata (name and customer_id).`).requiredOption("--name <value>", `Name of the file to be uploaded.`).requiredOption("--customer-id <value>", `ID of the customer to link the file to.`).addHelpText("after", `
43717
+ resource.command("create").description(`Upload a new file (max 10MB). Requires multipart form data with a file field and metadata (name and customer_id).`).requiredOption("--name <value>", `Name of the file to be uploaded.`).requiredOption("--customer-id <value>", `ID of the customer to link the file to.`).requiredOption("--file <path>", `Path of the local file to upload (sends a multipart request)`).addHelpText("after", `
43170
43718
  Examples:
43171
- hyperline files create --name <name> --customer-id <customer_id>
43172
- hyperline files create --name <name> --customer-id <customer_id> --output json`).action(async (opts) => {
43719
+ hyperline files create --name <name> --customer-id <customer_id> --file <path>
43720
+ hyperline files create --name <name> --customer-id <customer_id> --file <path> --output json`).action(async (opts) => {
43173
43721
  const ctx = resource.parent?.opts()._ctx;
43174
43722
  if (!ctx) {
43175
43723
  process.stderr.write("Error: Not authenticated\n");
@@ -43180,11 +43728,15 @@ Examples:
43180
43728
  args.name = opts.name;
43181
43729
  if (opts.customerId !== void 0)
43182
43730
  args.customer_id = opts.customerId;
43731
+ const files = {};
43732
+ if (opts.file !== void 0)
43733
+ files.file = [opts.file].flat();
43183
43734
  await ctx.execute({
43184
43735
  method: "POST",
43185
43736
  path: "/v1/files",
43186
43737
  args,
43187
- queryParamKeys: []
43738
+ queryParamKeys: [],
43739
+ files
43188
43740
  });
43189
43741
  });
43190
43742
  resource.command("delete").description(`Permanently delete a file by ID.`).requiredOption("--id <value>", `id parameter`).option("--yes", "Skip confirmation").addHelpText("after", `
@@ -43737,6 +44289,36 @@ Examples:
43737
44289
  queryParamKeys: []
43738
44290
  });
43739
44291
  });
44292
+ resource.command("send-invoice-emails").description(`Send a specific email (\`email_type\`, e.g. \`invoice_ready\` for the to-pay email) to the customer for a list of invoice IDs, asynchronously in batch. Returns a batch_id only; outcomes arrive via webhooks (invoice.batch.email_succeeded / invoice.batch.email_skipped / invoice.batch.email_failed). An invoice whose status doesn't match the email (e.g. a draft or an invoice still pending approval after validate_invoice) is skipped, so check each invoice's status with get_invoice first. Every call sends the emails again: never re-call it to retry or check status.`).option("--batch-id <value>", `Optional client-supplied identifier for the batch. Echoed back in the response and on the emitted webhook events. Generated if omitted.`).requiredOption("--email-type <value>", `The email to send. The invoice's status must resolve to this email, otherwise it is skipped with reason \`email_type_mismatch\`.
44293
+
44294
+ - \`invoice_ready\`: The to-pay invoice email (for \`to_pay\`, \`partially_paid\`, \`late\` invoices).
44295
+ - \`invoice_settled\`: The paid-invoice email (for \`paid\` invoices).
44296
+ - \`invoice_errored\`: The failed-payment email (for \`error\` invoices with a payment method).
44297
+ - \`credit_note_ready\`: The issued-credit-note email (for \`to_pay\`, \`partially_paid\` refunds).
44298
+ - \`credit_note_settled\`: The credit-note email (for paid refunds).`).requiredOption("--ids <json>", `IDs of the invoices to send the email for. Processed asynchronously; each outcome is reported via webhook events.`).addHelpText("after", `
44299
+ Examples:
44300
+ hyperline invoices send-invoice-emails --email-type <email_type> --ids <ids>
44301
+ hyperline invoices send-invoice-emails --email-type <email_type> --ids <ids> --batch-id <batch_id>
44302
+ hyperline invoices send-invoice-emails --email-type <email_type> --ids <ids> --output json`).action(async (opts) => {
44303
+ const ctx = resource.parent?.opts()._ctx;
44304
+ if (!ctx) {
44305
+ process.stderr.write("Error: Not authenticated\n");
44306
+ process.exit(1);
44307
+ }
44308
+ const args = {};
44309
+ if (opts.batchId !== void 0)
44310
+ args.batch_id = opts.batchId;
44311
+ if (opts.emailType !== void 0)
44312
+ args.email_type = opts.emailType;
44313
+ if (opts.ids !== void 0)
44314
+ args.ids = JSON.parse(opts.ids);
44315
+ await ctx.execute({
44316
+ method: "POST",
44317
+ path: "/v1/invoices/send-email",
44318
+ args,
44319
+ queryParamKeys: []
44320
+ });
44321
+ });
43740
44322
  resource.command("mark-invoice-as-uncollectible").description(`Mark an invoice as uncollectible for accounting write-off purposes. The invoice remains in the system for record keeping.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
43741
44323
  Examples:
43742
44324
  hyperline invoices mark-invoice-as-uncollectible --id <id>
@@ -43869,10 +44451,10 @@ Examples:
43869
44451
  queryParamKeys: []
43870
44452
  });
43871
44453
  });
43872
- resource.command("upload-pdf-to").description(`Upload a custom PDF file (max 5MB) to attach to an existing invoice, replacing the auto-generated PDF.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
44454
+ resource.command("upload-pdf-to").description(`Upload a custom PDF file (max 5MB) to attach to an existing invoice, replacing the auto-generated PDF.`).requiredOption("--id <value>", `id parameter`).requiredOption("--file <path>", `Path of the local file to upload (sends a multipart request)`).addHelpText("after", `
43873
44455
  Examples:
43874
- hyperline invoices upload-pdf-to --id <id>
43875
- hyperline invoices upload-pdf-to --id <id> --output json`).action(async (opts) => {
44456
+ hyperline invoices upload-pdf-to --id <id> --file <path>
44457
+ hyperline invoices upload-pdf-to --id <id> --file <path> --output json`).action(async (opts) => {
43876
44458
  const ctx = resource.parent?.opts()._ctx;
43877
44459
  if (!ctx) {
43878
44460
  process.stderr.write("Error: Not authenticated\n");
@@ -43881,11 +44463,15 @@ Examples:
43881
44463
  const args = {};
43882
44464
  if (opts.id !== void 0)
43883
44465
  args.id = opts.id;
44466
+ const files = {};
44467
+ if (opts.file !== void 0)
44468
+ files.file = [opts.file].flat();
43884
44469
  await ctx.execute({
43885
44470
  method: "POST",
43886
44471
  path: "/v1/invoices/{id}/upload",
43887
44472
  args,
43888
- queryParamKeys: []
44473
+ queryParamKeys: [],
44474
+ files
43889
44475
  });
43890
44476
  });
43891
44477
  resource.command("download").description(`Download the PDF of an invoice as a downloadable file. The HTTP client must follow redirects. Supports lang/locale params for localization.`).requiredOption("--id <value>", `id parameter`).option("--lang <value>", `lang`).option("--locale <value>", `Locale as a supported language code and an uppercase ISO 3166-1 alpha-2 country code, separated by a hyphen.`).addHelpText("after", `
@@ -44024,7 +44610,13 @@ Examples:
44024
44610
  queryParamKeys: []
44025
44611
  });
44026
44612
  });
44027
- resource.command("create-invoicing-entity").description(`Create a new invoicing entity with company details, address, and tax configuration. Used as the sender on invoices.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).requiredOption("--name <value>", `The name of the invoicing entity.`).option("--trade-name <value>", `The trade name of the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).requiredOption("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).requiredOption("--currency <value>", `The currency code that the invoicing entity operates in.`).requiredOption("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--next-invoice-number <number>", `The next invoice number to be used.`).option("--next-credit-note-number <number>", `The next credit note number to be used.`).option("--next-document-number <number>", `The next document number to be used.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--quote-footer <value>", `The footer text to be used in quotes.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
44613
+ resource.command("create-invoicing-entity").description(`Create a new invoicing entity with company details, address, and tax configuration. Used as the sender on invoices.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).requiredOption("--name <value>", `The name of the invoicing entity.`).option("--trade-name <value>", `The trade name of the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `State or province of the address, stored as its code (the second part of the ISO 3166-2 code, e.g. \`CA\` for \`US-CA\`) for:
44614
+ - United States: state, see [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US)
44615
+ - Canada: province or territory, see [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA)
44616
+ - Italy: province, see [ISO 3166-2:IT](https://en.wikipedia.org/wiki/ISO_3166-2:IT)
44617
+ - Brazil: state, see [ISO 3166-2:BR](https://en.wikipedia.org/wiki/ISO_3166-2:BR)
44618
+
44619
+ A code or a name is accepted (e.g. \`ON\` or \`Ontario\`); a value that matches neither for these countries is rejected. For any other country, the state is ignored.`).option("--city <value>", `The city of the invoicing entity.`).requiredOption("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).requiredOption("--currency <value>", `The currency code that the invoicing entity operates in.`).requiredOption("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--next-invoice-number <number>", `The next invoice number to be used.`).option("--next-credit-note-number <number>", `The next credit note number to be used.`).option("--next-document-number <number>", `The next document number to be used.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--quote-footer <value>", `The footer text to be used in quotes.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
44028
44620
  Examples:
44029
44621
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency>
44030
44622
  hyperline invoicing-entities create-invoicing-entity --name <name> --country <country> --currency <currency> --accounting-currency <accounting_currency> --is-default --trade-name <trade_name>
@@ -44116,7 +44708,13 @@ Examples:
44116
44708
  queryParamKeys: []
44117
44709
  });
44118
44710
  });
44119
- resource.command("update-invoicing-entity").description(`Update an existing invoicing entity's details (address, tax ID, branding, etc.).`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `The name of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `The state or province of the invoicing entity.`).option("--city <value>", `The city of the invoicing entity.`).option("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).option("--currency <value>", `The currency code that the invoicing entity operates in.`).option("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
44711
+ resource.command("update-invoicing-entity").description(`Update an existing invoicing entity's details (address, tax ID, branding, etc.).`).requiredOption("--id <value>", `id parameter`).option("--name <value>", `The name of the invoicing entity.`).option("--registration-number <value>", `The registration number of the invoicing entity.`).option("--tax-id <value>", `The tax identification number of the invoicing entity.`).option("--billing-email <value>", `The billing email address for the invoicing entity.`).option("--timezone <value>", `The timezone the invoicing entity operates in.`).option("--language <value>", `The default language of the invoicing entity.`).option("--is-default", `Flag to indicate if this is the default invoicing entity. If true, it will switch the other existing invoicing entities to non-default.`).option("--address-line1 <value>", `The first line of the address for the invoicing entity.`).option("--address-line2 <value>", `The second line of the address for the invoicing entity.`).option("--zip-code <value>", `The postal code for the invoicing entity's address.`).option("--state <value>", `State or province of the address, stored as its code (the second part of the ISO 3166-2 code, e.g. \`CA\` for \`US-CA\`) for:
44712
+ - United States: state, see [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US)
44713
+ - Canada: province or territory, see [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA)
44714
+ - Italy: province, see [ISO 3166-2:IT](https://en.wikipedia.org/wiki/ISO_3166-2:IT)
44715
+ - Brazil: state, see [ISO 3166-2:BR](https://en.wikipedia.org/wiki/ISO_3166-2:BR)
44716
+
44717
+ A code or a name is accepted (e.g. \`ON\` or \`Ontario\`); a value that matches neither for these countries is rejected. For any other country, the state is ignored.`).option("--city <value>", `The city of the invoicing entity.`).option("--country <value>", `The country in which the invoicing entity is registered. It cannot be changed after creation.`).option("--currency <value>", `The currency code that the invoicing entity operates in.`).option("--accounting-currency <value>", `The currency used for accounting purposes.`).option("--invoice-number-pattern <value>", `The pattern used for generating invoice numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--credit-note-number-pattern <value>", `The pattern used for generating credit note numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--document-number-pattern <value>", `The pattern used for generating document numbers. Available dynamic elements: number {number} (mandatory), year {YYYY}, month {MM} and day {DD}.`).option("--default-payment-delay <number>", `The default payment term in days.`).option("--invoice-grace-period-duration <number>", `The grace period duration in days.`).option("--invoice-payment-initiation-delay <number>", `The payment initiation delay in days for the invoices.`).option("--document-payment-initiation-delay <number>", `The payment initiation delay in days for the custom documents.`).option("--invoice-late-fees <value>", `The late fees applicable to the invoices.`).option("--invoice-footer <value>", `The footer text to be used in invoices.`).option("--document-footer <value>", `The footer text to be used in documents. If not specified, the invoice footer will be used.`).option("--logo-url <value>", `URL of the logo to be used in invoices.`).option("--favicon-url <value>", `URL of the logo to be used as favicon.`).option("--brand-color <value>", `Brand color to be used in invoices (hexadecimal color code).`).option("--forced-customer-type <value>", `Forces all customers created under this invoicing entity to have this type. Set to null to allow users to choose.`).option("--credit-note-wallet-refund-enabled", `When enabled and no \`refund_method\` is specified, credit note refunds default to the customer's wallet, including credit notes generated by subscription updates, cancellations, and transitions. An explicit \`refund_method\` always wins. Requires wallets to be enabled at the workspace level.`).option("--standalone-credit-note-creation-enabled", `Whether credit notes without an original invoice can be created under this invoicing entity. Defaults to \`true\`.`).option("--fx-conversion-display-enabled", `Whether the exchange rate and converted amount in the accounting currency are displayed on the invoice PDF when the invoice currency differs from the accounting currency. The conversion data is still stored and returned by the API when disabled. Defaults to \`true\`.`).addHelpText("after", `
44120
44718
  Examples:
44121
44719
  hyperline invoicing-entities update-invoicing-entity --id <id>
44122
44720
  hyperline invoicing-entities update-invoicing-entity --id <id> --name <name> --registration-number <registration_number>
@@ -44599,7 +45197,7 @@ Examples:
44599
45197
  // build/commands/generated/products.js
44600
45198
  function registerProductsCommands(parent) {
44601
45199
  const resource = parent.command("products").description("Manage products");
44602
- resource.command("list").description(`List products with optional filters for id, status, name, description, type, and price_book_id. Products define what is being sold (flat fee, per-unit, usage-based, etc.). Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--id <value>", `id`).option("--id.not <value>", `id__not`).option("--id.equals <value>", `id__equals`).option("--id.contains <value>", `id__contains`).option("--id.starts-with <value>", `id__startsWith`).option("--id.end-with <value>", `id__endWith`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--description <value>", `description`).option("--description.not <value>", `description__not`).option("--description.equals <value>", `description__equals`).option("--description.contains <value>", `description__contains`).option("--description.starts-with <value>", `description__startsWith`).option("--description.end-with <value>", `description__endWith`).option("--description.is-null <value>", `description__isNull`).option("--description.is-not-null <value>", `description__isNotNull`).option("--type <value>", `type`).option("--type.not <value>", `type__not`).option("--type.equals <value>", `type__equals`).option("--type.contains <value>", `type__contains`).option("--type.starts-with <value>", `type__startsWith`).option("--type.end-with <value>", `type__endWith`).option("--price-book-id <value>", `price_book_id`).addHelpText("after", `
45200
+ resource.command("list").description(`List products with optional filters for id, status, name, description, type, price_book_id, and custom_properties (JSON object of slug to exact value, e.g. {"my_slug":"value"}; slugs matching no custom property are rejected). Products define what is being sold (flat fee, per-unit, usage-based, etc.). Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--id <value>", `id`).option("--id.not <value>", `id__not`).option("--id.equals <value>", `id__equals`).option("--id.contains <value>", `id__contains`).option("--id.starts-with <value>", `id__startsWith`).option("--id.end-with <value>", `id__endWith`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--name <value>", `name`).option("--name.not <value>", `name__not`).option("--name.equals <value>", `name__equals`).option("--name.contains <value>", `name__contains`).option("--name.starts-with <value>", `name__startsWith`).option("--name.end-with <value>", `name__endWith`).option("--description <value>", `description`).option("--description.not <value>", `description__not`).option("--description.equals <value>", `description__equals`).option("--description.contains <value>", `description__contains`).option("--description.starts-with <value>", `description__startsWith`).option("--description.end-with <value>", `description__endWith`).option("--description.is-null <value>", `description__isNull`).option("--description.is-not-null <value>", `description__isNotNull`).option("--type <value>", `type`).option("--type.not <value>", `type__not`).option("--type.equals <value>", `type__equals`).option("--type.contains <value>", `type__contains`).option("--type.starts-with <value>", `type__startsWith`).option("--type.end-with <value>", `type__endWith`).option("--price-book-id <value>", `price_book_id`).option("--custom-properties <value>", `Filter by custom property values, as a JSON object mapping a custom property slug to the exact value to match. Suffix a slug with \`__contains\` for a case-sensitive substring match on text values. Several entries are combined with AND. A slug that matches no custom property returns a \`400\` error.`).addHelpText("after", `
44603
45201
  Examples:
44604
45202
  hyperline products list
44605
45203
  hyperline products list --take <take> --id <id>`).action(async (opts) => {
@@ -44667,6 +45265,8 @@ Examples:
44667
45265
  args.type__endWith = opts["type.endWith"];
44668
45266
  if (opts.priceBookId !== void 0)
44669
45267
  args.price_book_id = opts.priceBookId;
45268
+ if (opts.customProperties !== void 0)
45269
+ args.custom_properties = opts.customProperties;
44670
45270
  if (opts.take !== void 0)
44671
45271
  args.take = Number(opts.take);
44672
45272
  if (opts.skip !== void 0)
@@ -44706,11 +45306,12 @@ Examples:
44706
45306
  "type__contains",
44707
45307
  "type__startsWith",
44708
45308
  "type__endWith",
44709
- "price_book_id"
45309
+ "price_book_id",
45310
+ "custom_properties"
44710
45311
  ]
44711
45312
  });
44712
45313
  });
44713
- resource.command("create").description(`Create a new product with name, type (flat_fee, per_unit, usage, seat, etc.), and pricing configuration.`).requiredOption("--name <value>", `Product name.`).option("--description <value>", `Product description.`).option("--description-display-interval-dates", `Indicates if the dates of the interval should be automatically added in the product description on the invoices.`).option("--public-description <value>", `Public description of the product.`).option("--translations <json>", `Product name and description translations.`).option("--is-available-on-demand", `is_available_on_demand`).option("--is-available-on-subscription", `is_available_on_subscription`).option("--custom-properties <json>", `A list of key value with the slug of the custom property as the key and the custom property value as value.`).option("--accounting <json>", `Mapping invoicing entity ID/accounting settings.`).requiredOption("--type <value>", `Product type for fixed fee products.`).requiredOption("--price-configurations <json>", `Price configurations for the product.`).option("--aggregator <json>", `Aggregator configuration to automatically count seats from billable events. Only count aggregators are supported for seat products.`).option("--aggregator-id <value>", `ID of an existing aggregator to link to this product.`).option("--unit-name <value>", `Name of the unit (e.g., 'user', 'seat').`).option("--is-connected-seat-item", `When true, the seat count is automatically synced from an external source (e.g., CRM users).`).option("--credit-aggregators <json>", `Multiple aggregators with weights for multi-aggregator credit consumption. Cannot be used together with aggregator or aggregator_id.`).option("--low-credits-threshold <number>", `Threshold indicating a low level of credits.`).option("--credits-grant-mode <value>", `
45314
+ resource.command("create").description(`Create a new product with name, type (flat_fee, per_unit, usage, seat, etc.), and pricing configuration. With catalog versioning enabled, the change is staged in the pending catalog draft and only goes live after publish_catalog_draft.`).requiredOption("--name <value>", `Product name.`).option("--description <value>", `Product description.`).option("--description-display-interval-dates", `Indicates if the dates of the interval should be automatically added in the product description on the invoices.`).option("--public-description <value>", `Public description of the product.`).option("--translations <json>", `Product name and description translations.`).option("--is-available-on-demand", `is_available_on_demand`).option("--is-available-on-subscription", `is_available_on_subscription`).option("--custom-properties <json>", `A list of key value with the slug of the custom property as the key and the custom property value as value.`).option("--accounting <json>", `Mapping invoicing entity ID/accounting settings.`).requiredOption("--type <value>", `Product type for fixed fee products.`).requiredOption("--price-configurations <json>", `Price configurations for the product.`).option("--aggregator <json>", `Aggregator configuration to automatically count seats from billable events. Only count aggregators are supported for seat products.`).option("--aggregator-id <value>", `ID of an existing aggregator to link to this product.`).option("--unit-name <value>", `Name of the unit (e.g., 'user', 'seat').`).option("--is-connected-seat-item", `When true, the seat count is automatically synced from an external source (e.g., CRM users).`).option("--credit-aggregators <json>", `Multiple aggregators with weights for multi-aggregator credit consumption. Cannot be used together with aggregator or aggregator_id.`).option("--low-credits-threshold <number>", `Threshold indicating a low level of credits.`).option("--credits-grant-mode <value>", `
44714
45315
  How the periodic credit allowance is granted for partial billing periods.
44715
45316
 
44716
45317
  - \`prorated\` (default): the granted credits are prorated to the elapsed period.
@@ -44798,7 +45399,7 @@ Examples:
44798
45399
  queryParamKeys: ["price_book_id"]
44799
45400
  });
44800
45401
  });
44801
- resource.command("update").description(`Update a product's name, description, type, or configuration by ID.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Product name.`).option("--description <value>", `Product description.`).option("--public-description <value>", `Public description of the product.`).option("--translations <json>", `Product name and description translations.`).option("--is-available-on-demand", `is_available_on_demand`).option("--is-available-on-subscription", `is_available_on_subscription`).option("--properties <json>", `properties`).option("--custom-properties <json>", `A list of key value with the slug of the custom property as the key and the custom property value as value.`).option("--accounting <json>", `Mapping invoicing entity ID/accounting settings.`).addHelpText("after", `
45402
+ resource.command("update").description(`Update a product's name, description, type, or configuration by ID. With catalog versioning enabled, the change is staged in the pending catalog draft and only goes live after publish_catalog_draft.`).requiredOption("--id <value>", `id parameter`).requiredOption("--name <value>", `Product name.`).option("--description <value>", `Product description.`).option("--public-description <value>", `Public description of the product.`).option("--translations <json>", `Product name and description translations.`).option("--is-available-on-demand", `is_available_on_demand`).option("--is-available-on-subscription", `is_available_on_subscription`).option("--properties <json>", `properties`).option("--custom-properties <json>", `A list of key value with the slug of the custom property as the key and the custom property value as value.`).option("--accounting <json>", `Mapping invoicing entity ID/accounting settings.`).addHelpText("after", `
44802
45403
  Examples:
44803
45404
  hyperline products update --id <id> --name <name>
44804
45405
  hyperline products update --id <id> --name <name> --description <description> --public-description <public_description>
@@ -44985,12 +45586,12 @@ Quote status.
44985
45586
  - \`draft\`: The quote is a draft.
44986
45587
  - \`approved\`: The quote is approved and ready to be sent to the customer.
44987
45588
  - \`pending_signature\`: The quote is awaiting the customer's signature.
44988
- `).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. The owner requests approval when the quote is finalized using an API key or finalized during creation. If not specified, the Hyperline account owner will be assigned.`).requiredOption("--customer-id <value>", `ID of the customer.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity attached to the quote.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. When computed, a subscription phase with neither an end date nor a fixed duration is counted over a conventional horizon: the contract's length for a single phase on a contract that has one, otherwise 12 months or the longest billing interval if longer. That horizon is not an end date: the subscription can run past it. Usage-based and connected seat lines are priced at their estimated quantity when it exceeds the committed quantity and, for seats, the live seat count. For subscription quotes, defaults to the computed subscription value if not specified. For one-off quotes, this field is ignored \u2014 the amount is always derived from the linked invoice's \`amount_excluding_tax\`.`).option("--contract-value <number>", `What the customer pays over the contract, each coupon counted on the invoices it applies to. Computed from the subscription for \`subscription\` and \`subscription_update\` quotes, unless set manually. Not set on \`one_off\` quotes. When specified, overrides the computed value.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
45589
+ `).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. The user must be a member of your Hyperline account. The owner requests approval when the quote is finalized using an API key or finalized during creation. If not specified, the Hyperline account owner will be assigned.`).requiredOption("--customer-id <value>", `ID of the customer.`).option("--invoicing-entity-id <value>", `ID of the invoicing entity attached to the quote.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. When computed, a subscription phase with neither an end date nor a fixed duration is counted over a conventional horizon: the contract's length for a single phase on a contract that has one, otherwise 12 months or the longest billing interval if longer. That horizon is not an end date: the subscription can run past it. Usage-based and connected seat lines are priced at their estimated quantity when it exceeds the committed quantity and, for seats, the live seat count. For subscription quotes, defaults to the computed subscription value if not specified. For one-off quotes, this field is ignored \u2014 the amount is always derived from the linked invoice's \`amount_excluding_tax\`.`).option("--contract-value <number>", `What the customer pays over the contract, each coupon counted on the invoices it applies to. Computed from the subscription for \`subscription\` and \`subscription_update\` quotes, unless set manually. Not set on \`one_off\` quotes. When specified, overrides the computed value.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
44989
45590
 
44990
45591
  - \`all\`: Display all pricing tiers.
44991
45592
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
44992
45593
  - \`none\`: Hide all pricing tiers.
44993
- `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--template-id <value>", `ID of the quote template. If not specified, a subscription configuration or an \`invoice\` payload must be defined.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--subscription <json>", `Subscription configuration constituting the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided, a draft invoice is created and linked to the quote. Cannot be combined with \`subscription\` or \`template_id\`.`).addHelpText("after", `
45594
+ `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--template-id <value>", `ID of the quote template. If not specified, a subscription configuration or an \`invoice\` payload must be defined.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format.`).option("--subscription <json>", `Subscription configuration constituting the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided, a draft invoice is created and linked to the quote. Cannot be combined with \`subscription\` or \`template_id\`.`).option("--attachments <paths...>", `Paths of the local files to upload (space-separated, sends a multipart request)`).addHelpText("after", `
44994
45595
  Examples:
44995
45596
  hyperline quotes create --customer-id <customer_id>
44996
45597
  hyperline quotes create --customer-id <customer_id> --status <status> --owner-email <owner_email>
@@ -45055,11 +45656,15 @@ Examples:
45055
45656
  args.subscription = JSON.parse(opts.subscription);
45056
45657
  if (opts.invoice !== void 0)
45057
45658
  args.invoice = JSON.parse(opts.invoice);
45659
+ const files = {};
45660
+ if (opts.attachments !== void 0)
45661
+ files.attachments = [opts.attachments].flat();
45058
45662
  await ctx.execute({
45059
45663
  method: "POST",
45060
45664
  path: "/v1/quotes",
45061
45665
  args,
45062
- queryParamKeys: []
45666
+ queryParamKeys: [],
45667
+ files
45063
45668
  });
45064
45669
  });
45065
45670
  resource.command("list").description(`List quotes with optional filters for id, number, status, customer_id, template_id, crm_opportunity_id, type, and updated_at. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--id <value>", `id`).option("--id.not <value>", `id__not`).option("--id.equals <value>", `id__equals`).option("--id.contains <value>", `id__contains`).option("--id.starts-with <value>", `id__startsWith`).option("--id.end-with <value>", `id__endWith`).option("--number <value>", `number`).option("--number.not <value>", `number__not`).option("--number.equals <value>", `number__equals`).option("--number.contains <value>", `number__contains`).option("--number.starts-with <value>", `number__startsWith`).option("--number.end-with <value>", `number__endWith`).option("--status <value>", `status`).option("--status.in <value>", `status__in`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--template-id <value>", `template_id`).option("--template-id.not <value>", `template_id__not`).option("--template-id.equals <value>", `template_id__equals`).option("--template-id.contains <value>", `template_id__contains`).option("--template-id.starts-with <value>", `template_id__startsWith`).option("--template-id.end-with <value>", `template_id__endWith`).option("--template-id.is-null <value>", `template_id__isNull`).option("--template-id.is-not-null <value>", `template_id__isNotNull`).option("--crm-opportunity-id <value>", `crm_opportunity_id`).option("--crm-opportunity-id.not <value>", `crm_opportunity_id__not`).option("--crm-opportunity-id.equals <value>", `crm_opportunity_id__equals`).option("--crm-opportunity-id.contains <value>", `crm_opportunity_id__contains`).option("--crm-opportunity-id.starts-with <value>", `crm_opportunity_id__startsWith`).option("--crm-opportunity-id.end-with <value>", `crm_opportunity_id__endWith`).option("--crm-opportunity-id.is-null <value>", `crm_opportunity_id__isNull`).option("--crm-opportunity-id.is-not-null <value>", `crm_opportunity_id__isNotNull`).option("--type <value>", `type`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).addHelpText("after", `
@@ -45236,12 +45841,12 @@ Examples:
45236
45841
  queryParamKeys: []
45237
45842
  });
45238
45843
  });
45239
- resource.command("update").description(`Update quote-level fields before a quote is finalized. On draft quotes, pass \`subscription\` inline \u2014 the full configuration, not a reference to an existing subscription \u2014 to create or replace the draft subscription configuration, or pass \`invoice\` on a one-off quote to replace the linked draft invoice. For quotes created from \`template_id\`, use this tool for subscription overrides such as dates, contract terms, products, phases, coupons, discounts, prices, seats, and subscription custom properties. Omit \`terms\`, \`comments\`, and \`contract_clause_ids\` unless deliberately overriding template content. Discover product and price configuration IDs with \`get_catalog_context\`.`).requiredOption("--id <value>", `id parameter`).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. The owner requests approval when the quote is finalized using an API key or finalized during creation.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. When computed, a subscription phase with neither an end date nor a fixed duration is counted over a conventional horizon: the contract's length for a single phase on a contract that has one, otherwise 12 months or the longest billing interval if longer. That horizon is not an end date: the subscription can run past it. Usage-based and connected seat lines are priced at their estimated quantity when it exceeds the committed quantity and, for seats, the live seat count. Set to \`null\` to clear the manually set value.`).option("--contract-value <number>", `What the customer pays over the contract, each coupon counted on the invoices it applies to. Computed from the subscription for \`subscription\` and \`subscription_update\` quotes, unless set manually. Not set on \`one_off\` quotes. When specified, overrides the computed value. Set to \`null\` to go back to the computed value.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
45844
+ resource.command("update").description(`Update quote-level fields before a quote is finalized. On draft quotes, pass \`subscription\` inline \u2014 the full configuration, not a reference to an existing subscription \u2014 to create or replace the draft subscription configuration, or pass \`invoice\` on a one-off quote to replace the linked draft invoice. For quotes created from \`template_id\`, use this tool for subscription overrides such as dates, contract terms, products, phases, coupons, discounts, prices, seats, and subscription custom properties. Omit \`terms\`, \`comments\`, and \`contract_clause_ids\` unless deliberately overriding template content. Discover product and price configuration IDs with \`get_catalog_context\`.`).requiredOption("--id <value>", `id parameter`).option("--owner-email <value>", `Email address of the Hyperline user acting as the quote owner. The user must be a member of your Hyperline account. The owner requests approval when the quote is finalized using an API key or finalized during creation.`).option("--catalog-version-id <value>", `ID of a published catalog version to price every product of the quote from, instead of the live products catalog. A product's own \`catalog_version_id\` takes precedence, and explicit \`prices\` always win over both.`).option("--comments <value>", `Custom comments displayed on the quote.`).option("--terms <value>", `Custom quotation terms.`).option("--amount <number>", `Estimated contract value. When computed, a subscription phase with neither an end date nor a fixed duration is counted over a conventional horizon: the contract's length for a single phase on a contract that has one, otherwise 12 months or the longest billing interval if longer. That horizon is not an end date: the subscription can run past it. Usage-based and connected seat lines are priced at their estimated quantity when it exceeds the committed quantity and, for seats, the live seat count. Set to \`null\` to clear the manually set value.`).option("--contract-value <number>", `What the customer pays over the contract, each coupon counted on the invoices it applies to. Computed from the subscription for \`subscription\` and \`subscription_update\` quotes, unless set manually. Not set on \`one_off\` quotes. When specified, overrides the computed value. Set to \`null\` to go back to the computed value.`).option("--collect-payment-details <value>", `Collect customer payment method mandate during signature flow or not.`).option("--collect-custom-property-ids <json>", `IDs of the customer custom properties required to be filled during the signature flow.`).option("--contract-clause-ids <json>", `IDs of the contract clauses used in the quote terms.`).option("--require-tax-id <value>", `Require the customer to provide a tax ID during the signature flow.`).option("--display-quote-value <value>", `Display the total quote value on the quote.`).option("--display-quote-value-with-tax <value>", `Display the total quote value including tax on the quote. Only applies to \`one_off\` quotes.`).option("--display-taxes <value>", `Display tax breakdown on the quote.`).option("--display-price-tiers <value>", `Controls which price tiers are displayed on the quote.
45240
45845
 
45241
45846
  - \`all\`: Display all pricing tiers.
45242
45847
  - \`matching\`: Only display the tiers used to compute the price based on quantity.
45243
45848
  - \`none\`: Hide all pricing tiers.
45244
- `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--crm-opportunity-id <value>", `ID of the related opportunity/deal in the connected CRM.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Set to \`null\` to clear the expiration.`).option("--subscription <json>", `Subscription configuration constituting the quote. When provided on a draft quote, it creates or replaces the draft subscription attached to the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided on a draft one-off quote, it deletes the previous draft invoice and creates a fresh one linked to the quote. \`invoice.invoicing_entity_id\` is ignored on update \u2014 the quote's existing invoicing entity is reused.`).addHelpText("after", `
45849
+ `).option("--display-phase-value <value>", `Display per-phase value breakdown on the quote.`).option("--display-discounts-on-total <value>", `Display discounts on the totals, with product prices before discount. Totals then follow the contract value, so discounts with a limited duration are included.`).option("--display-first-invoice-amount <value>", `Display the first invoice amount on the quote.`).option("--display-documents-in-preview <value>", `Display attached documents in the quote preview.`).option("--subscription-update-display <value>", `Sections displayed on subscription update quotes: quote_update_details, subscription_details, or both. Takes precedence over display_subscription_on_update.`).option("--generate-draft-invoices <value>", `When \`true\`, the invoice issued after signature stays in \`draft\` status instead of being emitted for payment. Use this when you want to review the final invoice manually before sending it. Defaults to \`false\`.`).option("--crm-opportunity-id <value>", `ID of the related opportunity/deal in the connected CRM.`).option("--expires-at <value>", `Quote expiration date. UTC date time string in the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) format. Set to \`null\` to clear the expiration.`).option("--subscription <json>", `Subscription configuration constituting the quote. When provided on a draft quote, it creates or replaces the draft subscription attached to the quote.`).option("--invoice <json>", `Invoice configuration constituting the one-off quote. When provided on a draft one-off quote, it deletes the previous draft invoice and creates a fresh one linked to the quote. \`invoice.invoicing_entity_id\` is ignored on update \u2014 the quote's existing invoicing entity is reused.`).option("--attachments <paths...>", `Paths of the local files to upload (space-separated, sends a multipart request)`).addHelpText("after", `
45245
45850
  Examples:
45246
45851
  hyperline quotes update --id <id>
45247
45852
  hyperline quotes update --id <id> --owner-email <owner_email> --catalog-version-id <catalog_version_id>
@@ -45302,11 +45907,15 @@ Examples:
45302
45907
  args.subscription = JSON.parse(opts.subscription);
45303
45908
  if (opts.invoice !== void 0)
45304
45909
  args.invoice = JSON.parse(opts.invoice);
45910
+ const files = {};
45911
+ if (opts.attachments !== void 0)
45912
+ files.attachments = [opts.attachments].flat();
45305
45913
  await ctx.execute({
45306
45914
  method: "PATCH",
45307
45915
  path: "/v1/quotes/{id}",
45308
45916
  args,
45309
- queryParamKeys: []
45917
+ queryParamKeys: [],
45918
+ files
45310
45919
  });
45311
45920
  });
45312
45921
  resource.command("duplicate").description(`Create a draft duplicate of an existing quote, including its linked invoice or subscription configuration.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
@@ -45459,9 +46068,10 @@ Examples:
45459
46068
  queryParamKeys: []
45460
46069
  });
45461
46070
  });
45462
- resource.command("sign").description(`Manually mark a quote as signed externally. Optionally upload a signed PDF. Bypasses the built-in Hyperline signature flow.`).requiredOption("--id <value>", `id parameter`).addHelpText("after", `
46071
+ resource.command("sign").description(`Manually mark a quote as signed externally. Optionally upload a signed PDF. Bypasses the built-in Hyperline signature flow.`).requiredOption("--id <value>", `id parameter`).option("--signed-quote <path>", `Path of the local file to upload (sends a multipart request)`).addHelpText("after", `
45463
46072
  Examples:
45464
46073
  hyperline quotes sign --id <id>
46074
+ hyperline quotes sign --id <id> --signed-quote <path>
45465
46075
  hyperline quotes sign --id <id> --output json`).action(async (opts) => {
45466
46076
  const ctx = resource.parent?.opts()._ctx;
45467
46077
  if (!ctx) {
@@ -45471,11 +46081,15 @@ Examples:
45471
46081
  const args = {};
45472
46082
  if (opts.id !== void 0)
45473
46083
  args.id = opts.id;
46084
+ const files = {};
46085
+ if (opts.signedQuote !== void 0)
46086
+ files.signed_quote = [opts.signedQuote].flat();
45474
46087
  await ctx.execute({
45475
46088
  method: "POST",
45476
46089
  path: "/v1/quotes/{id}/sign",
45477
46090
  args,
45478
- queryParamKeys: []
46091
+ queryParamKeys: [],
46092
+ files
45479
46093
  });
45480
46094
  });
45481
46095
  resource.command("void").description(`Void an existing quote, canceling it and preventing further actions.`).requiredOption("--id <value>", `id parameter`).requiredOption("--reason <value>", `Quote voiding reason.`).addHelpText("after", `
@@ -46071,7 +46685,7 @@ Examples:
46071
46685
  queryParamKeys: []
46072
46686
  });
46073
46687
  });
46074
- resource.command("list").description(`List subscriptions with filters for activation_strategy, status, currency, plan_id, original_quote_id, integration_entity_id, customer_id, invoicing_entity_id, purchase_order, updated_at, cancel_at, custom_properties, and the active contract: contract_start__gte/__lte, contract_end__gte/__lte, renew_automatically. For upcoming renewals, combine contract_end__gte/__lte with renew_automatically, plus cancel_at for scheduled cancellations. Draft, voided, cancelled and archived excluded by default (status=all applies the same exclusion); status=any returns every status. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--activation-strategy <value>", `activation_strategy`).option("--activation-strategy.in <value>", `activation_strategy__in`).option("--status <value>", `
46688
+ resource.command("list").description(`List subscriptions with filters for activation_strategy, status, currency, plan_id, original_quote_id, integration_entity_id, customer_id, invoicing_entity_id, purchase_order, updated_at, cancel_at, custom_properties (JSON object of slug to exact value, e.g. {"my_slug":"value"}; slugs matching no custom property are ignored), and the active contract: contract_start__gte/__lte, contract_end__gte/__lte, renew_automatically. For upcoming renewals, combine contract_end__gte/__lte with renew_automatically, plus cancel_at for scheduled cancellations. Draft, voided, cancelled and archived excluded by default (status=all applies the same exclusion); status=any returns every status. Paginated with take/skip.`).option("--take <number>", `take`).option("--skip <number>", `skip`).option("--activation-strategy <value>", `activation_strategy`).option("--activation-strategy.in <value>", `activation_strategy__in`).option("--status <value>", `
46075
46689
  Subscription status filter.
46076
46690
 
46077
46691
  - \`active\`, \`pending\`, \`paused\`, \`errored\`, \`cancelled\`, \`draft\`, \`voided\`, \`archived\`: match that status.
@@ -46080,7 +46694,7 @@ Subscription status filter.
46080
46694
  - \`any\`: every status, no exclusion.
46081
46695
 
46082
46696
  Use \`status__in\` with comma-separated values to combine statuses. When the filter is omitted, \`draft\`, \`voided\`, \`cancelled\` and \`archived\` subscriptions are excluded.
46083
- `).option("--status.in <value>", `Comma-separated list of subscription statuses to include. Same values as \`status\`.`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--plan-id <value>", `plan_id`).option("--plan-id.not <value>", `plan_id__not`).option("--plan-id.equals <value>", `plan_id__equals`).option("--plan-id.contains <value>", `plan_id__contains`).option("--plan-id.starts-with <value>", `plan_id__startsWith`).option("--plan-id.end-with <value>", `plan_id__endWith`).option("--plan-id.is-null <value>", `plan_id__isNull`).option("--plan-id.is-not-null <value>", `plan_id__isNotNull`).option("--original-quote-id <value>", `original_quote_id`).option("--original-quote-id.not <value>", `original_quote_id__not`).option("--original-quote-id.equals <value>", `original_quote_id__equals`).option("--original-quote-id.contains <value>", `original_quote_id__contains`).option("--original-quote-id.starts-with <value>", `original_quote_id__startsWith`).option("--original-quote-id.end-with <value>", `original_quote_id__endWith`).option("--original-quote-id.is-null <value>", `original_quote_id__isNull`).option("--original-quote-id.is-not-null <value>", `original_quote_id__isNotNull`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--purchase-order <value>", `purchase_order`).option("--purchase-order.not <value>", `purchase_order__not`).option("--purchase-order.equals <value>", `purchase_order__equals`).option("--purchase-order.contains <value>", `purchase_order__contains`).option("--purchase-order.starts-with <value>", `purchase_order__startsWith`).option("--purchase-order.end-with <value>", `purchase_order__endWith`).option("--purchase-order.is-null <value>", `purchase_order__isNull`).option("--purchase-order.is-not-null <value>", `purchase_order__isNotNull`).option("--custom-properties <value>", `custom_properties`).option("--invoice-drafts <value>", `invoice_drafts`).option("--integration-entity-id <value>", `integration_entity_id`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).option("--cancel-at <value>", `cancel_at`).option("--cancel-at.not <value>", `cancel_at__not`).option("--cancel-at.equals <value>", `cancel_at__equals`).option("--cancel-at.lt <value>", `cancel_at__lt`).option("--cancel-at.lte <value>", `cancel_at__lte`).option("--cancel-at.gt <value>", `cancel_at__gt`).option("--cancel-at.gte <value>", `cancel_at__gte`).option("--cancel-at.is-null <value>", `cancel_at__isNull`).option("--cancel-at.is-not-null <value>", `cancel_at__isNotNull`).option("--contract-start.gte <value>", `Return only subscriptions whose active contract starts on or after this date.`).option("--contract-start.lte <value>", `Return only subscriptions whose active contract starts on or before this date.`).option("--contract-end.gte <value>", `Return only subscriptions whose active contract ends on or after this date.`).option("--contract-end.lte <value>", `Return only subscriptions whose active contract ends on or before this date.`).option("--renew-automatically <value>", `Return only subscriptions whose active contract renews automatically (\`true\`) or not (\`false\`).`).addHelpText("after", `
46697
+ `).option("--status.in <value>", `Comma-separated list of subscription statuses to include. Same values as \`status\`.`).option("--currency <value>", `currency`).option("--currency.not <value>", `currency__not`).option("--currency.equals <value>", `currency__equals`).option("--currency.contains <value>", `currency__contains`).option("--currency.starts-with <value>", `currency__startsWith`).option("--currency.end-with <value>", `currency__endWith`).option("--plan-id <value>", `plan_id`).option("--plan-id.not <value>", `plan_id__not`).option("--plan-id.equals <value>", `plan_id__equals`).option("--plan-id.contains <value>", `plan_id__contains`).option("--plan-id.starts-with <value>", `plan_id__startsWith`).option("--plan-id.end-with <value>", `plan_id__endWith`).option("--plan-id.is-null <value>", `plan_id__isNull`).option("--plan-id.is-not-null <value>", `plan_id__isNotNull`).option("--original-quote-id <value>", `original_quote_id`).option("--original-quote-id.not <value>", `original_quote_id__not`).option("--original-quote-id.equals <value>", `original_quote_id__equals`).option("--original-quote-id.contains <value>", `original_quote_id__contains`).option("--original-quote-id.starts-with <value>", `original_quote_id__startsWith`).option("--original-quote-id.end-with <value>", `original_quote_id__endWith`).option("--original-quote-id.is-null <value>", `original_quote_id__isNull`).option("--original-quote-id.is-not-null <value>", `original_quote_id__isNotNull`).option("--customer-id <value>", `customer_id`).option("--customer-id.not <value>", `customer_id__not`).option("--customer-id.equals <value>", `customer_id__equals`).option("--customer-id.contains <value>", `customer_id__contains`).option("--customer-id.starts-with <value>", `customer_id__startsWith`).option("--customer-id.end-with <value>", `customer_id__endWith`).option("--customer-id.is-null <value>", `customer_id__isNull`).option("--customer-id.is-not-null <value>", `customer_id__isNotNull`).option("--invoicing-entity-id <value>", `invoicing_entity_id`).option("--purchase-order <value>", `purchase_order`).option("--purchase-order.not <value>", `purchase_order__not`).option("--purchase-order.equals <value>", `purchase_order__equals`).option("--purchase-order.contains <value>", `purchase_order__contains`).option("--purchase-order.starts-with <value>", `purchase_order__startsWith`).option("--purchase-order.end-with <value>", `purchase_order__endWith`).option("--purchase-order.is-null <value>", `purchase_order__isNull`).option("--purchase-order.is-not-null <value>", `purchase_order__isNotNull`).option("--custom-properties <value>", `Filter by custom property values, as a JSON object mapping a custom property slug to the exact value to match. Suffix a slug with \`__contains\` for a case-sensitive substring match on text values. Several entries are combined with AND. Entries whose slug matches no custom property, or whose value is \`false\`, \`0\`, \`null\` or an empty string, are ignored.`).option("--invoice-drafts <value>", `invoice_drafts`).option("--integration-entity-id <value>", `integration_entity_id`).option("--updated-at <value>", `updated_at`).option("--updated-at.not <value>", `updated_at__not`).option("--updated-at.equals <value>", `updated_at__equals`).option("--updated-at.lt <value>", `updated_at__lt`).option("--updated-at.lte <value>", `updated_at__lte`).option("--updated-at.gt <value>", `updated_at__gt`).option("--updated-at.gte <value>", `updated_at__gte`).option("--cancel-at <value>", `cancel_at`).option("--cancel-at.not <value>", `cancel_at__not`).option("--cancel-at.equals <value>", `cancel_at__equals`).option("--cancel-at.lt <value>", `cancel_at__lt`).option("--cancel-at.lte <value>", `cancel_at__lte`).option("--cancel-at.gt <value>", `cancel_at__gt`).option("--cancel-at.gte <value>", `cancel_at__gte`).option("--cancel-at.is-null <value>", `cancel_at__isNull`).option("--cancel-at.is-not-null <value>", `cancel_at__isNotNull`).option("--contract-start.gte <value>", `Return only subscriptions whose active contract starts on or after this date.`).option("--contract-start.lte <value>", `Return only subscriptions whose active contract starts on or before this date.`).option("--contract-end.gte <value>", `Return only subscriptions whose active contract ends on or after this date.`).option("--contract-end.lte <value>", `Return only subscriptions whose active contract ends on or before this date.`).option("--renew-automatically <value>", `Return only subscriptions whose active contract renews automatically (\`true\`) or not (\`false\`).`).addHelpText("after", `
46084
46698
  Examples:
46085
46699
  hyperline subscriptions list
46086
46700
  hyperline subscriptions list --take <take> --activation-strategy <activation_strategy>`).action(async (opts) => {
@@ -47480,8 +48094,12 @@ function registerAllCommands(program2) {
47480
48094
  registerAi_BillingCommands(program2);
47481
48095
  registerAi_CostsCommands(program2);
47482
48096
  registerAnalyticsCommands(program2);
48097
+ registerApproval_WorkflowsCommands(program2);
47483
48098
  registerBank_AccountsCommands(program2);
48099
+ registerCatalogCommands(program2);
47484
48100
  registerCompaniesCommands(program2);
48101
+ registerContracts_ClausesCommands(program2);
48102
+ registerContracts_DocumentsCommands(program2);
47485
48103
  registerCouponsCommands(program2);
47486
48104
  registerCoupons_Promotion_CodesCommands(program2);
47487
48105
  registerCustomers_CreditsCommands(program2);
@@ -63562,7 +64180,25 @@ var de = {
63562
64180
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Diese Position wurde f\xFCr den anteiligen Zeitraum in Rechnung gestellt",
63563
64181
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Betrag von {{amount}} f\xFCr den anteiligen Zeitraum nicht in Rechnung gestellt",
63564
64182
  "subscriptions.updates.updatePrices": "Preise f\xFCr {{productName}} aktualisieren",
63565
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben"
64183
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 abgelaufenes Guthaben",
64184
+ "quotes.blockers.quote_not_draft": "Setzen Sie das Angebot auf Entwurf zur\xFCck, bevor Sie seine Konfigurationen \xE4ndern",
64185
+ "quotes.blockers.quote_expiration_date_missing": "Das Angebot muss ein Ablaufdatum haben, um zur Genehmigung gesendet zu werden",
64186
+ "quotes.blockers.quote_configuration_missing": "F\xFCgen Sie mindestens eine Konfiguration hinzu, bevor Sie das Angebot einreichen",
64187
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Abonnement\xE4nderungen m\xFCssen den Kunden des Angebots verwenden",
64188
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Aktivieren Sie mehrere Konfigurationen, bevor Sie einen untergeordneten Kunden zuweisen",
64189
+ "quotes.blockers.quote_configuration_customer_not_child": "W\xE4hlen Sie einen untergeordneten Kunden des Angebotskunden",
64190
+ "quotes.blockers.quote_configuration_type_mismatch": "Die verkn\xFCpfte Konfiguration entspricht nicht dem Konfigurationstyp",
64191
+ "quotes.blockers.quote_configuration_not_draft": "W\xE4hlen Sie eine Konfiguration im Entwurf",
64192
+ "quotes.blockers.quote_configuration_customer_mismatch": "Die Konfiguration muss zum Kunden der Konfiguration geh\xF6ren",
64193
+ "quotes.blockers.quote_configuration_currency_mismatch": "Die Konfiguration muss die W\xE4hrung des Angebots verwenden",
64194
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "Die Rechnung muss die Rechnungsstellungseinheit des Angebots verwenden",
64195
+ "quotes.blockers.quote_configuration_already_linked": "Die Konfiguration ist bereits mit einer Angebotskonfiguration verkn\xFCpft",
64196
+ "quotes.blockers.quote_configuration_not_subscription_update": "W\xE4hlen Sie eine Konfiguration f\xFCr eine Abonnement\xE4nderung",
64197
+ "quotes.blockers.quote_configuration_not_new_subscription": "W\xE4hlen Sie eine Konfiguration f\xFCr ein neues Abonnement",
64198
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Ein Abonnement kann in einem Angebot nur einmal ge\xE4ndert werden",
64199
+ "quotes.blockers.quote_draft_invoice_missing": "Das Angebot muss eine Rechnung im Entwurf haben, um abgeschlossen zu werden",
64200
+ "quotes.blockers.quote_draft_subscription_missing": "Das Angebot muss ein Abonnement im Entwurf haben, um abgeschlossen zu werden",
64201
+ "quotes.blockers.quote_expiry_after_transition_date": "Das Ablaufdatum des Angebots muss sp\xE4testens am Ende des aktuellen Abrechnungszeitraums liegen, oder am geplanten \xDCbergangsdatum, wenn dieses sp\xE4ter liegt"
63566
64202
  };
63567
64203
 
63568
64204
  // ../hyperline-i18n/build/locales/en.js
@@ -63612,7 +64248,25 @@ var en = {
63612
64248
  "accounting.revrec.closedPeriodFallbackNote": " (posted to next open period \u2014 target accounting period closed; original date {{originalDate}})",
63613
64249
  "einvoicing.paymentProcessed": "Payment processed",
63614
64250
  "einvoicing.paymentReceived": "Payment received",
63615
- "einvoicing.paymentFromWallet": "Payment from wallet"
64251
+ "einvoicing.paymentFromWallet": "Payment from wallet",
64252
+ "quotes.blockers.quote_not_draft": "Redraft the quote before changing its configurations",
64253
+ "quotes.blockers.quote_expiration_date_missing": "Quote must have an expiration date to be sent for approval",
64254
+ "quotes.blockers.quote_configuration_missing": "Add at least one configuration before submitting the quote",
64255
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Subscription updates must use the quote customer",
64256
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Enable multiple configurations before assigning a child customer",
64257
+ "quotes.blockers.quote_configuration_customer_not_child": "Select a child customer of the quote customer",
64258
+ "quotes.blockers.quote_configuration_type_mismatch": "The linked configuration does not match the configuration type",
64259
+ "quotes.blockers.quote_configuration_not_draft": "Select a draft configuration",
64260
+ "quotes.blockers.quote_configuration_customer_mismatch": "The configuration must belong to the configuration customer",
64261
+ "quotes.blockers.quote_configuration_currency_mismatch": "The configuration must use the quote currency",
64262
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "The invoice must use the quote invoicing entity",
64263
+ "quotes.blockers.quote_configuration_already_linked": "The configuration is already linked to a quote configuration",
64264
+ "quotes.blockers.quote_configuration_not_subscription_update": "Select a subscription update configuration",
64265
+ "quotes.blockers.quote_configuration_not_new_subscription": "Select a new subscription configuration",
64266
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "A subscription can only be updated once in a quote",
64267
+ "quotes.blockers.quote_draft_invoice_missing": "Quote must have a draft invoice to be finalized",
64268
+ "quotes.blockers.quote_draft_subscription_missing": "Quote must have a draft subscription to be finalized",
64269
+ "quotes.blockers.quote_expiry_after_transition_date": "The quote expiration date must be on or before the end of the current billing period, or the scheduled transition date when it falls later"
63616
64270
  };
63617
64271
 
63618
64272
  // ../hyperline-i18n/build/locales/es.js
@@ -63662,7 +64316,25 @@ var es = {
63662
64316
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta l\xEDnea ha sido facturada para el per\xEDodo prorrateado",
63663
64317
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importe de {{amount}} no facturado para el per\xEDodo prorrateado",
63664
64318
  "subscriptions.updates.updatePrices": "Actualizar precios para {{productName}}",
63665
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado"
64319
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo caducado",
64320
+ "quotes.blockers.quote_not_draft": "Vuelve a poner el presupuesto en borrador antes de cambiar sus configuraciones",
64321
+ "quotes.blockers.quote_expiration_date_missing": "El presupuesto debe tener una fecha de vencimiento para enviarse a aprobaci\xF3n",
64322
+ "quotes.blockers.quote_configuration_missing": "A\xF1ade al menos una configuraci\xF3n antes de enviar el presupuesto",
64323
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Las actualizaciones de suscripci\xF3n deben usar el cliente del presupuesto",
64324
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Activa las configuraciones m\xFAltiples antes de asignar un cliente hijo",
64325
+ "quotes.blockers.quote_configuration_customer_not_child": "Selecciona un cliente hijo del cliente del presupuesto",
64326
+ "quotes.blockers.quote_configuration_type_mismatch": "La configuraci\xF3n vinculada no coincide con el tipo de configuraci\xF3n",
64327
+ "quotes.blockers.quote_configuration_not_draft": "Selecciona una configuraci\xF3n en borrador",
64328
+ "quotes.blockers.quote_configuration_customer_mismatch": "La configuraci\xF3n debe pertenecer al cliente de la configuraci\xF3n",
64329
+ "quotes.blockers.quote_configuration_currency_mismatch": "La configuraci\xF3n debe usar la moneda del presupuesto",
64330
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "La factura debe usar la entidad de facturaci\xF3n del presupuesto",
64331
+ "quotes.blockers.quote_configuration_already_linked": "La configuraci\xF3n ya est\xE1 vinculada a una configuraci\xF3n de presupuesto",
64332
+ "quotes.blockers.quote_configuration_not_subscription_update": "Selecciona una configuraci\xF3n de actualizaci\xF3n de suscripci\xF3n",
64333
+ "quotes.blockers.quote_configuration_not_new_subscription": "Selecciona una configuraci\xF3n de nueva suscripci\xF3n",
64334
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Una suscripci\xF3n solo puede actualizarse una vez en un presupuesto",
64335
+ "quotes.blockers.quote_draft_invoice_missing": "El presupuesto debe tener una factura en borrador para finalizarse",
64336
+ "quotes.blockers.quote_draft_subscription_missing": "El presupuesto debe tener una suscripci\xF3n en borrador para finalizarse",
64337
+ "quotes.blockers.quote_expiry_after_transition_date": "La fecha de vencimiento del presupuesto debe ser, como m\xE1ximo, el final del periodo de facturaci\xF3n actual, o la fecha de transici\xF3n programada si es posterior"
63666
64338
  };
63667
64339
 
63668
64340
  // ../hyperline-i18n/build/locales/fr.js
@@ -63712,7 +64384,25 @@ var fr = {
63712
64384
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Cette ligne a \xE9t\xE9 factur\xE9e pour la p\xE9riode proratis\xE9e",
63713
64385
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Montant de {{amount}} non factur\xE9 pour la p\xE9riode proratis\xE9e",
63714
64386
  "subscriptions.updates.updatePrices": "Mise \xE0 jour des prix pour {{productName}}",
63715
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9"
64387
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 solde expir\xE9",
64388
+ "quotes.blockers.quote_not_draft": "Repassez le devis en brouillon avant de modifier ses configurations",
64389
+ "quotes.blockers.quote_expiration_date_missing": "Le devis doit avoir une date d'expiration pour \xEAtre envoy\xE9 en validation",
64390
+ "quotes.blockers.quote_configuration_missing": "Ajoutez au moins une configuration avant de soumettre le devis",
64391
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Les mises \xE0 jour d'abonnement doivent utiliser le client du devis",
64392
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Activez les configurations multiples avant d'assigner un client enfant",
64393
+ "quotes.blockers.quote_configuration_customer_not_child": "S\xE9lectionnez un client enfant du client du devis",
64394
+ "quotes.blockers.quote_configuration_type_mismatch": "La configuration li\xE9e ne correspond pas au type de configuration",
64395
+ "quotes.blockers.quote_configuration_not_draft": "S\xE9lectionnez une configuration en brouillon",
64396
+ "quotes.blockers.quote_configuration_customer_mismatch": "La configuration doit appartenir au client de la configuration",
64397
+ "quotes.blockers.quote_configuration_currency_mismatch": "La configuration doit utiliser la devise du devis",
64398
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "La facture doit utiliser l'entit\xE9 de facturation du devis",
64399
+ "quotes.blockers.quote_configuration_already_linked": "La configuration est d\xE9j\xE0 li\xE9e \xE0 une configuration de devis",
64400
+ "quotes.blockers.quote_configuration_not_subscription_update": "S\xE9lectionnez une configuration de mise \xE0 jour d'abonnement",
64401
+ "quotes.blockers.quote_configuration_not_new_subscription": "S\xE9lectionnez une configuration de nouvel abonnement",
64402
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Un abonnement ne peut \xEAtre mis \xE0 jour qu'une seule fois dans un devis",
64403
+ "quotes.blockers.quote_draft_invoice_missing": "Le devis doit avoir une facture en brouillon pour \xEAtre finalis\xE9",
64404
+ "quotes.blockers.quote_draft_subscription_missing": "Le devis doit avoir un abonnement en brouillon pour \xEAtre finalis\xE9",
64405
+ "quotes.blockers.quote_expiry_after_transition_date": "La date d'expiration du devis doit \xEAtre au plus tard la fin de la p\xE9riode de facturation en cours, ou la date de transition planifi\xE9e si elle est post\xE9rieure"
63716
64406
  };
63717
64407
 
63718
64408
  // ../hyperline-i18n/build/locales/it.js
@@ -63762,7 +64452,25 @@ var it = {
63762
64452
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Questa voce \xE8 stata fatturata per il periodo proporzionato",
63763
64453
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Importo di {{amount}} non fatturato per il periodo proporzionato",
63764
64454
  "subscriptions.updates.updatePrices": "Aggiorna prezzi per {{productName}}",
63765
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto"
64455
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo scaduto",
64456
+ "quotes.blockers.quote_not_draft": "Riporta il preventivo in bozza prima di modificarne le configurazioni",
64457
+ "quotes.blockers.quote_expiration_date_missing": "Il preventivo deve avere una data di scadenza per essere inviato per approvazione",
64458
+ "quotes.blockers.quote_configuration_missing": "Aggiungi almeno una configurazione prima di inviare il preventivo",
64459
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Gli aggiornamenti dell'abbonamento devono usare il cliente del preventivo",
64460
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Attiva le configurazioni multiple prima di assegnare un cliente figlio",
64461
+ "quotes.blockers.quote_configuration_customer_not_child": "Seleziona un cliente figlio del cliente del preventivo",
64462
+ "quotes.blockers.quote_configuration_type_mismatch": "La configurazione collegata non corrisponde al tipo di configurazione",
64463
+ "quotes.blockers.quote_configuration_not_draft": "Seleziona una configurazione in bozza",
64464
+ "quotes.blockers.quote_configuration_customer_mismatch": "La configurazione deve appartenere al cliente della configurazione",
64465
+ "quotes.blockers.quote_configuration_currency_mismatch": "La configurazione deve usare la valuta del preventivo",
64466
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "La fattura deve usare l'entit\xE0 di fatturazione del preventivo",
64467
+ "quotes.blockers.quote_configuration_already_linked": "La configurazione \xE8 gi\xE0 collegata a una configurazione del preventivo",
64468
+ "quotes.blockers.quote_configuration_not_subscription_update": "Seleziona una configurazione di aggiornamento dell'abbonamento",
64469
+ "quotes.blockers.quote_configuration_not_new_subscription": "Seleziona una configurazione di nuovo abbonamento",
64470
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Un abbonamento pu\xF2 essere aggiornato una sola volta in un preventivo",
64471
+ "quotes.blockers.quote_draft_invoice_missing": "Il preventivo deve avere una fattura in bozza per essere finalizzato",
64472
+ "quotes.blockers.quote_draft_subscription_missing": "Il preventivo deve avere un abbonamento in bozza per essere finalizzato",
64473
+ "quotes.blockers.quote_expiry_after_transition_date": "La data di scadenza del preventivo deve essere entro la fine del periodo di fatturazione corrente, o la data di transizione pianificata se successiva"
63766
64474
  };
63767
64475
 
63768
64476
  // ../hyperline-i18n/build/locales/lt.js
@@ -63812,7 +64520,25 @@ var lt = {
63812
64520
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "U\u017E \u0161i\u0105 eilut\u0119 proporcingam laikotarpiui s\u0105skaita fakt\u016Bra i\u0161ra\u0161yta",
63813
64521
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Proporcingam laikotarpiui nei\u0161ra\u0161yta {{amount}} suma",
63814
64522
  "subscriptions.updates.updatePrices": "Atnaujinti {{productName}} kainas",
63815
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis"
64523
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 nebegaliojantis likutis",
64524
+ "quotes.blockers.quote_not_draft": "Prie\u0161 keisdami pasi\u016Blymo konfig\u016Bracijas, gr\u0105\u017Einkite j\u012F \u012F juodra\u0161t\u012F",
64525
+ "quotes.blockers.quote_expiration_date_missing": "Pasi\u016Blymas turi tur\u0117ti galiojimo pabaigos dat\u0105, kad b\u016Bt\u0173 i\u0161si\u0173stas tvirtinti",
64526
+ "quotes.blockers.quote_configuration_missing": "Prie\u0161 pateikdami pasi\u016Blym\u0105, prid\u0117kite bent vien\u0105 konfig\u016Bracij\u0105",
64527
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Prenumeratos atnaujinimai turi naudoti pasi\u016Blymo klient\u0105",
64528
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Prie\u0161 priskirdami antrin\u012F klient\u0105, \u012Fjunkite kelias konfig\u016Bracijas",
64529
+ "quotes.blockers.quote_configuration_customer_not_child": "Pasirinkite pasi\u016Blymo kliento antrin\u012F klient\u0105",
64530
+ "quotes.blockers.quote_configuration_type_mismatch": "Susieta konfig\u016Bracija neatitinka konfig\u016Bracijos tipo",
64531
+ "quotes.blockers.quote_configuration_not_draft": "Pasirinkite konfig\u016Bracijos juodra\u0161t\u012F",
64532
+ "quotes.blockers.quote_configuration_customer_mismatch": "Konfig\u016Bracija turi priklausyti konfig\u016Bracijos klientui",
64533
+ "quotes.blockers.quote_configuration_currency_mismatch": "Konfig\u016Bracija turi naudoti pasi\u016Blymo valiut\u0105",
64534
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "S\u0105skaita fakt\u016Bra turi naudoti pasi\u016Blymo s\u0105skait\u0173 i\u0161ra\u0161ymo subjekt\u0105",
64535
+ "quotes.blockers.quote_configuration_already_linked": "Konfig\u016Bracija jau susieta su pasi\u016Blymo konfig\u016Bracija",
64536
+ "quotes.blockers.quote_configuration_not_subscription_update": "Pasirinkite prenumeratos atnaujinimo konfig\u016Bracij\u0105",
64537
+ "quotes.blockers.quote_configuration_not_new_subscription": "Pasirinkite naujos prenumeratos konfig\u016Bracij\u0105",
64538
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Prenumerat\u0105 pasi\u016Blyme galima atnaujinti tik vien\u0105 kart\u0105",
64539
+ "quotes.blockers.quote_draft_invoice_missing": "Pasi\u016Blymas turi tur\u0117ti s\u0105skaitos fakt\u016Bros juodra\u0161t\u012F, kad b\u016Bt\u0173 u\u017Ebaigtas",
64540
+ "quotes.blockers.quote_draft_subscription_missing": "Pasi\u016Blymas turi tur\u0117ti prenumeratos juodra\u0161t\u012F, kad b\u016Bt\u0173 u\u017Ebaigtas",
64541
+ "quotes.blockers.quote_expiry_after_transition_date": "Pasi\u016Blymo galiojimo pabaigos data turi b\u016Bti ne v\u0117lesn\u0117 nei dabartinio atsiskaitymo laikotarpio pabaiga arba suplanuota per\u0117jimo data, jei ji v\u0117lesn\u0117"
63816
64542
  };
63817
64543
 
63818
64544
  // ../hyperline-i18n/build/locales/nl.js
@@ -63862,7 +64588,25 @@ var nl = {
63862
64588
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Deze regel is gefactureerd voor de geproportioneerde periode",
63863
64589
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Bedrag van {{amount}} niet gefactureerd voor de geproportioneerde periode",
63864
64590
  "subscriptions.updates.updatePrices": "Prijzen bijwerken voor {{productName}}",
63865
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo"
64591
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 verlopen saldo",
64592
+ "quotes.blockers.quote_not_draft": "Zet de offerte terug naar concept voordat u de configuraties wijzigt",
64593
+ "quotes.blockers.quote_expiration_date_missing": "De offerte moet een vervaldatum hebben om ter goedkeuring te worden verzonden",
64594
+ "quotes.blockers.quote_configuration_missing": "Voeg ten minste \xE9\xE9n configuratie toe voordat u de offerte indient",
64595
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Abonnementswijzigingen moeten de klant van de offerte gebruiken",
64596
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Schakel meerdere configuraties in voordat u een onderliggende klant toewijst",
64597
+ "quotes.blockers.quote_configuration_customer_not_child": "Selecteer een onderliggende klant van de offerteklant",
64598
+ "quotes.blockers.quote_configuration_type_mismatch": "De gekoppelde configuratie komt niet overeen met het configuratietype",
64599
+ "quotes.blockers.quote_configuration_not_draft": "Selecteer een conceptconfiguratie",
64600
+ "quotes.blockers.quote_configuration_customer_mismatch": "De configuratie moet bij de klant van de configuratie horen",
64601
+ "quotes.blockers.quote_configuration_currency_mismatch": "De configuratie moet de valuta van de offerte gebruiken",
64602
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "De factuur moet de facturatie-entiteit van de offerte gebruiken",
64603
+ "quotes.blockers.quote_configuration_already_linked": "De configuratie is al gekoppeld aan een offerteconfiguratie",
64604
+ "quotes.blockers.quote_configuration_not_subscription_update": "Selecteer een configuratie voor een abonnementswijziging",
64605
+ "quotes.blockers.quote_configuration_not_new_subscription": "Selecteer een configuratie voor een nieuw abonnement",
64606
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Een abonnement kan maar \xE9\xE9n keer per offerte worden gewijzigd",
64607
+ "quotes.blockers.quote_draft_invoice_missing": "De offerte moet een conceptfactuur hebben om te worden afgerond",
64608
+ "quotes.blockers.quote_draft_subscription_missing": "De offerte moet een conceptabonnement hebben om te worden afgerond",
64609
+ "quotes.blockers.quote_expiry_after_transition_date": "De vervaldatum van de offerte moet uiterlijk het einde van de huidige factuurperiode zijn, of de geplande overgangsdatum als die later valt"
63866
64610
  };
63867
64611
 
63868
64612
  // ../hyperline-i18n/build/locales/pl.js
@@ -63912,7 +64656,25 @@ var pl = {
63912
64656
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Ta pozycja zosta\u0142a zafakturowana za okres proporcjonalny",
63913
64657
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Kwota {{amount}} niefakturowana za okres proporcjonalny",
63914
64658
  "subscriptions.updates.updatePrices": "Aktualizuj ceny dla {{productName}}",
63915
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo"
64659
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 wygas\u0142e saldo",
64660
+ "quotes.blockers.quote_not_draft": "Przywr\xF3\u0107 ofert\u0119 do wersji roboczej przed zmian\u0105 jej konfiguracji",
64661
+ "quotes.blockers.quote_expiration_date_missing": "Oferta musi mie\u0107 dat\u0119 wyga\u015Bni\u0119cia, aby zosta\u0142a wys\u0142ana do zatwierdzenia",
64662
+ "quotes.blockers.quote_configuration_missing": "Dodaj co najmniej jedn\u0105 konfiguracj\u0119 przed przes\u0142aniem oferty",
64663
+ "quotes.blockers.quote_configuration_subscription_update_customer": "Aktualizacje subskrypcji musz\u0105 u\u017Cywa\u0107 klienta oferty",
64664
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "W\u0142\u0105cz wiele konfiguracji przed przypisaniem klienta podrz\u0119dnego",
64665
+ "quotes.blockers.quote_configuration_customer_not_child": "Wybierz klienta podrz\u0119dnego klienta oferty",
64666
+ "quotes.blockers.quote_configuration_type_mismatch": "Powi\u0105zana konfiguracja nie odpowiada typowi konfiguracji",
64667
+ "quotes.blockers.quote_configuration_not_draft": "Wybierz konfiguracj\u0119 w wersji roboczej",
64668
+ "quotes.blockers.quote_configuration_customer_mismatch": "Konfiguracja musi nale\u017Ce\u0107 do klienta konfiguracji",
64669
+ "quotes.blockers.quote_configuration_currency_mismatch": "Konfiguracja musi u\u017Cywa\u0107 waluty oferty",
64670
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "Faktura musi u\u017Cywa\u0107 podmiotu fakturuj\u0105cego oferty",
64671
+ "quotes.blockers.quote_configuration_already_linked": "Konfiguracja jest ju\u017C powi\u0105zana z konfiguracj\u0105 oferty",
64672
+ "quotes.blockers.quote_configuration_not_subscription_update": "Wybierz konfiguracj\u0119 aktualizacji subskrypcji",
64673
+ "quotes.blockers.quote_configuration_not_new_subscription": "Wybierz konfiguracj\u0119 nowej subskrypcji",
64674
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Subskrypcj\u0119 mo\u017Cna zaktualizowa\u0107 w ofercie tylko raz",
64675
+ "quotes.blockers.quote_draft_invoice_missing": "Oferta musi mie\u0107 faktur\u0119 w wersji roboczej, aby zosta\u0142a sfinalizowana",
64676
+ "quotes.blockers.quote_draft_subscription_missing": "Oferta musi mie\u0107 subskrypcj\u0119 w wersji roboczej, aby zosta\u0142a sfinalizowana",
64677
+ "quotes.blockers.quote_expiry_after_transition_date": "Data wyga\u015Bni\u0119cia oferty musi przypada\u0107 najp\xF3\u017Aniej na koniec bie\u017C\u0105cego okresu rozliczeniowego lub na zaplanowan\u0105 dat\u0119 przej\u015Bcia, je\u015Bli jest p\xF3\u017Aniejsza"
63916
64678
  };
63917
64679
 
63918
64680
  // ../hyperline-i18n/build/locales/pt.js
@@ -63962,7 +64724,25 @@ var pt = {
63962
64724
  "subscriptions.updates.updateCount.description.prorata.not_committed.invoiced": "Esta linha foi faturada para o per\xEDodo proporcional",
63963
64725
  "subscriptions.updates.updateCount.description.prorata.not_committed.not_invoiced": "Valor de {{amount}} n\xE3o faturado para o per\xEDodo proporcional",
63964
64726
  "subscriptions.updates.updatePrices": "Atualizar pre\xE7os para {{productName}}",
63965
- "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado"
64727
+ "wallets.expiredBalanceInvoiceLineName": "{{walletName}} \u2013 saldo expirado",
64728
+ "quotes.blockers.quote_not_draft": "Volte a colocar o or\xE7amento em rascunho antes de alterar as suas configura\xE7\xF5es",
64729
+ "quotes.blockers.quote_expiration_date_missing": "O or\xE7amento deve ter uma data de expira\xE7\xE3o para ser enviado para aprova\xE7\xE3o",
64730
+ "quotes.blockers.quote_configuration_missing": "Adicione pelo menos uma configura\xE7\xE3o antes de submeter o or\xE7amento",
64731
+ "quotes.blockers.quote_configuration_subscription_update_customer": "As atualiza\xE7\xF5es de subscri\xE7\xE3o devem usar o cliente do or\xE7amento",
64732
+ "quotes.blockers.quote_configuration_multiple_configurations_disabled": "Ative as configura\xE7\xF5es m\xFAltiplas antes de atribuir um cliente filho",
64733
+ "quotes.blockers.quote_configuration_customer_not_child": "Selecione um cliente filho do cliente do or\xE7amento",
64734
+ "quotes.blockers.quote_configuration_type_mismatch": "A configura\xE7\xE3o associada n\xE3o corresponde ao tipo de configura\xE7\xE3o",
64735
+ "quotes.blockers.quote_configuration_not_draft": "Selecione uma configura\xE7\xE3o em rascunho",
64736
+ "quotes.blockers.quote_configuration_customer_mismatch": "A configura\xE7\xE3o deve pertencer ao cliente da configura\xE7\xE3o",
64737
+ "quotes.blockers.quote_configuration_currency_mismatch": "A configura\xE7\xE3o deve usar a moeda do or\xE7amento",
64738
+ "quotes.blockers.quote_configuration_invoicing_entity_mismatch": "A fatura deve usar a entidade de fatura\xE7\xE3o do or\xE7amento",
64739
+ "quotes.blockers.quote_configuration_already_linked": "A configura\xE7\xE3o j\xE1 est\xE1 associada a uma configura\xE7\xE3o de or\xE7amento",
64740
+ "quotes.blockers.quote_configuration_not_subscription_update": "Selecione uma configura\xE7\xE3o de atualiza\xE7\xE3o de subscri\xE7\xE3o",
64741
+ "quotes.blockers.quote_configuration_not_new_subscription": "Selecione uma configura\xE7\xE3o de nova subscri\xE7\xE3o",
64742
+ "quotes.blockers.quote_configuration_duplicate_subscription_update": "Uma subscri\xE7\xE3o s\xF3 pode ser atualizada uma vez num or\xE7amento",
64743
+ "quotes.blockers.quote_draft_invoice_missing": "O or\xE7amento deve ter uma fatura em rascunho para ser finalizado",
64744
+ "quotes.blockers.quote_draft_subscription_missing": "O or\xE7amento deve ter uma subscri\xE7\xE3o em rascunho para ser finalizado",
64745
+ "quotes.blockers.quote_expiry_after_transition_date": "A data de expira\xE7\xE3o do or\xE7amento deve ser, no m\xE1ximo, o fim do per\xEDodo de fatura\xE7\xE3o atual, ou a data de transi\xE7\xE3o agendada se for posterior"
63966
64746
  };
63967
64747
 
63968
64748
  // ../hyperline-i18n/build/language.js
@@ -64143,16 +64923,19 @@ var REDACTED_KEY_NAMES = /* @__PURE__ */ new Set([
64143
64923
  "credentials",
64144
64924
  "iban",
64145
64925
  "idtoken",
64926
+ "launchticket",
64146
64927
  "privatekey",
64147
64928
  "publictoken",
64148
64929
  "refreshtoken",
64930
+ // A workflow secret's value (core/workflows secrets).
64931
+ "secretvalue",
64149
64932
  "sessiontoken",
64150
64933
  "token",
64151
64934
  "tokenid",
64152
64935
  "verificationcode"
64153
64936
  ]);
64154
64937
  var REDACTED_KEY_SUFFIX_PATTERN = /(secret|password|passphrase|apikey)$/;
64155
- var REDACTED_KEY_CANDIDATE_PATTERN = /token|key|secret|pass|assertion|verifier|credential|authorization|cookie|iban|cardnumber|code|connectionurl/i;
64938
+ var REDACTED_KEY_CANDIDATE_PATTERN = /token|ticket|key|secret|pass|assertion|verifier|credential|authorization|cookie|iban|cardnumber|code|connectionurl/i;
64156
64939
  var URL_ONLY_REDACTED_KEYS = /* @__PURE__ */ new Set(["key"]);
64157
64940
  var OAUTH_CODE_KEY = "code";
64158
64941
  var OAUTH_CODE_CONTEXT_KEYS = ["state", "grant_type"];
@@ -66914,69 +67697,6 @@ var Decimal = P.constructor = clone2(DEFAULTS);
66914
67697
  LN10 = new Decimal(LN10);
66915
67698
  PI = new Decimal(PI);
66916
67699
 
66917
- // ../hyperline-lib/build/utils/config/usStates.js
66918
- var usStates = [
66919
- "AA",
66920
- "AE",
66921
- "AK",
66922
- "AL",
66923
- "AP",
66924
- "AR",
66925
- "AS",
66926
- "AZ",
66927
- "CA",
66928
- "CO",
66929
- "CT",
66930
- "DC",
66931
- "DE",
66932
- "FL",
66933
- "GA",
66934
- "GU",
66935
- "HI",
66936
- "IA",
66937
- "ID",
66938
- "IL",
66939
- "IN",
66940
- "KS",
66941
- "KY",
66942
- "LA",
66943
- "MA",
66944
- "MD",
66945
- "ME",
66946
- "MI",
66947
- "MN",
66948
- "MO",
66949
- "MP",
66950
- "MS",
66951
- "MT",
66952
- "NC",
66953
- "ND",
66954
- "NE",
66955
- "NH",
66956
- "NJ",
66957
- "NM",
66958
- "NV",
66959
- "NY",
66960
- "OH",
66961
- "OK",
66962
- "OR",
66963
- "PA",
66964
- "PR",
66965
- "RI",
66966
- "SC",
66967
- "SD",
66968
- "TN",
66969
- "TX",
66970
- "UT",
66971
- "VA",
66972
- "VI",
66973
- "VT",
66974
- "WA",
66975
- "WI",
66976
- "WV",
66977
- "WY"
66978
- ];
66979
-
66980
67700
  // ../hyperline-lib/build/utils/dates.js
66981
67701
  var import_shared2 = __toESM(require_shared(), 1);
66982
67702
  var PERIOD_BOUND_DRIFT_TOLERANCE_MS = 2 * 60 * 1e3;
@@ -67001,7 +67721,8 @@ var dateRealignmentModeSchema = external_exports.enum([
67001
67721
  "utc_midnight_import",
67002
67722
  "dst_hour_drift",
67003
67723
  "month_start_drift",
67004
- "manual_phase_end_midnight"
67724
+ "manual_phase_end_midnight",
67725
+ "customer_timezone_change"
67005
67726
  ]).default("utc_midnight_import");
67006
67727
  var DST_HOUR_SHIFT_BY_LOCAL_MILLISECOND_OF_DAY = /* @__PURE__ */ new Map([
67007
67728
  [23 * MILLISECONDS_PER_HOUR, MILLISECONDS_PER_HOUR],
@@ -67051,8 +67772,14 @@ var authorizedOperators = [
67051
67772
  var NullFilterValueSchema = BooleanSchema.or(external_exports.literal("")).optional();
67052
67773
 
67053
67774
  // ../hyperline-lib/build/http/dto/state.js
67054
- var StateSchema = external_exports.enum(usStates).openapi({
67055
- description: "Only for US country. Second part of subdivision code in ISO format. See [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US).",
67775
+ var StateSchema = external_exports.string().openapi({
67776
+ description: `State or province of the address, stored as its code (the second part of the ISO 3166-2 code, e.g. \`CA\` for \`US-CA\`) for:
67777
+ - United States: state, see [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US)
67778
+ - Canada: province or territory, see [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA)
67779
+ - Italy: province, see [ISO 3166-2:IT](https://en.wikipedia.org/wiki/ISO_3166-2:IT)
67780
+ - Brazil: state, see [ISO 3166-2:BR](https://en.wikipedia.org/wiki/ISO_3166-2:BR)
67781
+
67782
+ A code or a name is accepted (e.g. \`ON\` or \`Ontario\`); a value that matches neither for these countries is rejected. For any other country, the state is ignored.`,
67056
67783
  example: "CA"
67057
67784
  });
67058
67785
 
@@ -67166,9 +67893,10 @@ var toLogRequest = (config4) => {
67166
67893
  };
67167
67894
 
67168
67895
  // ../hyperline-lib/build/httpClient/publicUrlFetch.js
67896
+ import { lookup as lookupCallback } from "node:dns";
67169
67897
  import { lookup } from "node:dns/promises";
67170
67898
  import { isIP } from "node:net";
67171
- import { Agent } from "undici";
67899
+ import { Agent, fetch as fetch2 } from "undici";
67172
67900
  var PINNED_DISPATCHER_TTL_MS = 5 * 60 * 1e3;
67173
67901
  var DEFAULT_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
67174
67902
 
@@ -67188,10 +67916,15 @@ import { createHash as createHash4 } from "node:crypto";
67188
67916
  var TTL_MS = 5 * 6e4;
67189
67917
 
67190
67918
  // ../hyperline-mcp/build/requestBuilder.js
67191
- function buildRequestConfig(path2, args, method, queryParamKeys = []) {
67919
+ function buildRequestConfig({ path: path2, args, method, queryParamKeys = [], arrayBody = false }) {
67192
67920
  const { url: url2, usedKeys } = replacePathParams(path2, args);
67193
67921
  const remaining = removeUsedKeys(args, usedKeys);
67194
- const { params, data } = separateParamsAndBody(remaining, method, queryParamKeys);
67922
+ const { params, data } = separateParamsAndBody({
67923
+ args: remaining,
67924
+ method,
67925
+ queryParamKeys,
67926
+ arrayBody
67927
+ });
67195
67928
  return { url: url2, params, data };
67196
67929
  }
67197
67930
  function replacePathParams(path2, args) {
@@ -67222,7 +67955,7 @@ var PathParamError = class extends Error {
67222
67955
  function removeUsedKeys(args, usedKeys) {
67223
67956
  return Object.fromEntries(Object.entries(args).filter(([key]) => !usedKeys.has(key)));
67224
67957
  }
67225
- function separateParamsAndBody(args, method, queryParamKeys) {
67958
+ function separateParamsAndBody({ args, method, queryParamKeys, arrayBody }) {
67226
67959
  const isBodyMethod = ["POST", "PUT", "PATCH"].includes(method);
67227
67960
  if (!isBodyMethod) {
67228
67961
  return { params: args };
@@ -67230,8 +67963,7 @@ function separateParamsAndBody(args, method, queryParamKeys) {
67230
67963
  const queryKeySet = new Set(queryParamKeys);
67231
67964
  const params = Object.fromEntries(Object.entries(args).filter(([key]) => queryKeySet.has(key)));
67232
67965
  const data = Object.fromEntries(Object.entries(args).filter(([key]) => !queryKeySet.has(key)));
67233
- const dataKeys = Object.keys(data);
67234
- if (dataKeys.length === 1 && dataKeys[0] === "items" && Array.isArray(data.items)) {
67966
+ if (arrayBody && Array.isArray(data.items)) {
67235
67967
  return { params, data: data.items };
67236
67968
  }
67237
67969
  return { params, data };
@@ -67249,6 +67981,62 @@ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/
67249
67981
  // ../hyperline-mcp/build/server/server.js
67250
67982
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
67251
67983
 
67984
+ // build/multipart.js
67985
+ import { readFile as readFile2 } from "node:fs/promises";
67986
+ import { basename, extname } from "node:path";
67987
+ var MIMETYPES_BY_EXTENSION = {
67988
+ ".csv": "text/csv",
67989
+ ".doc": "application/msword",
67990
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
67991
+ ".gif": "image/gif",
67992
+ ".jpeg": "image/jpeg",
67993
+ ".jpg": "image/jpeg",
67994
+ ".json": "application/json",
67995
+ ".pdf": "application/pdf",
67996
+ ".png": "image/png",
67997
+ ".svg": "image/svg+xml",
67998
+ ".txt": "text/plain",
67999
+ ".xls": "application/vnd.ms-excel",
68000
+ ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
68001
+ ".xml": "application/xml"
68002
+ };
68003
+ function getMimetypeFromPath(filePath) {
68004
+ return MIMETYPES_BY_EXTENSION[extname(filePath).toLowerCase()] ?? "application/octet-stream";
68005
+ }
68006
+ function appendFormValue({ formData, key, value }) {
68007
+ if (value === void 0) {
68008
+ return;
68009
+ }
68010
+ if (value === null) {
68011
+ formData.append(key, "");
68012
+ return;
68013
+ }
68014
+ if (Array.isArray(value)) {
68015
+ for (const [index, item] of value.entries()) {
68016
+ appendFormValue({ formData, key: `${key}[${index}]`, value: item });
68017
+ }
68018
+ return;
68019
+ }
68020
+ if (typeof value === "object") {
68021
+ throw new Error(`--${key} cannot be sent alongside files: a multipart request only carries scalar fields.`);
68022
+ }
68023
+ formData.append(key, String(value));
68024
+ }
68025
+ async function buildMultipartBody({ data, files }) {
68026
+ const formData = new FormData();
68027
+ for (const [key, value] of Object.entries(data)) {
68028
+ appendFormValue({ formData, key, value });
68029
+ }
68030
+ const fileUploads = Object.entries(files).flatMap(([fieldName, filePaths]) => filePaths.map((filePath) => ({ fieldName, filePath })));
68031
+ const fileContents = await Promise.all(fileUploads.map(({ filePath }) => readFile2(filePath)));
68032
+ for (const [index, { fieldName, filePath }] of fileUploads.entries()) {
68033
+ formData.append(fieldName, new Blob([new Uint8Array(fileContents[index])], {
68034
+ type: getMimetypeFromPath(filePath)
68035
+ }), basename(filePath));
68036
+ }
68037
+ return formData;
68038
+ }
68039
+
67252
68040
  // build/output.js
67253
68041
  function formatOutput({ data, format: format2 }) {
67254
68042
  if (format2 === "json") {
@@ -67308,16 +68096,25 @@ function createCLIContext({ apiKey, baseUrl, outputFormat, source, companyId })
67308
68096
  return {
67309
68097
  baseUrl,
67310
68098
  outputFormat,
67311
- async execute({ method, path: path2, args, queryParamKeys = [], body, baseUrlOverride }) {
67312
- const { url: url2, params, data } = buildRequestConfig(path2, args, method, queryParamKeys);
68099
+ async execute({ method, path: path2, args, queryParamKeys = [], body, files, baseUrlOverride }) {
68100
+ const { url: url2, params, data } = buildRequestConfig({
68101
+ path: path2,
68102
+ args,
68103
+ method,
68104
+ queryParamKeys
68105
+ });
67313
68106
  const requestData = body ?? data;
67314
68107
  const hasData = Array.isArray(requestData) ? requestData.length > 0 : requestData != null && Object.keys(requestData).length > 0;
68108
+ const hasFiles = Object.values(files ?? {}).some((filePaths) => filePaths.length > 0);
67315
68109
  try {
67316
68110
  const response = await httpClient.request({
67317
68111
  method,
67318
68112
  url: url2,
67319
68113
  params,
67320
- data: hasData ? requestData : void 0,
68114
+ data: hasFiles ? await buildMultipartBody({
68115
+ data: requestData ?? {},
68116
+ files: files ?? {}
68117
+ }) : hasData ? requestData : void 0,
67321
68118
  ...baseUrlOverride ? { baseURL: baseUrlOverride } : {},
67322
68119
  headers: {
67323
68120
  "Hyperline-Source": source,