Files
invoiceninja-cli/CHANGELOG.md
T
awkawbandClaude Sonnet 5 1236a15ebb
CI / test (push) Canceled after 0s
CI / Build on the declared MSRV (push) Canceled after 0s
CI / Latest stable (advisory) (push) Canceled after 0s
Add entity action and PDF download to invoices/quotes/credits/purchase-orders
These four resources are the only ones with the SDK's
entity_action_methods! route. Adds:

- `action <id> <action>` - mark_sent, mark_paid, archive, restore,
  clone_to_invoice, clone_to_quote, auto_bill, delete (routed), returning
  the updated record.
- `download <id>...` - the rendered PDF, to stdout or `--out <path>`;
  more than one id streams a single merged PDF (Invoice Ninja's bulk
  download action).

New EntityResourceArgs/EntityAction in cli.rs rather than extending the
existing ResourceArgs/Action: Rust enums don't compose, and every
resource's `run` match on Action needs to stay exhaustive without a
catch-all arm for variants it doesn't support.

Found and fixed along the way: the Download variant's --output <path>
field collided by name with the global --output table|json flag,
causing clap to panic at runtime trying to downcast the wrong type.
Renamed to --out.

Extended tests/nixos-test.nix to exercise action/download for real
against the VM. That caught a test-ordering bug of its own - asserting
mark_sent on an invoice *after* paying it off, which correctly doesn't
revert status_id from paid back to sent - fixed by reordering the
subtests. nix flake check passes clean.

Also backfills two CHANGELOG.md gaps from earlier sessions: the VM test
and CI additions had never actually been logged there.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-26 17:29:00 -04:00

3.0 KiB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning. Pre-1.0, per GOALS.md, a minor release can still break flags or output — this file is where that gets written down instead of discovered at the command line.

[Unreleased]

Added

  • 33 resources, every one of them with a simple list/get/create/ update/delete API in the SDK (resource_methods!/crud_methods!, no bulk/uploads/entity-actions) — see invoiceninja-cli --help for the full list. list takes --all for every page, --status, and --param key=value for anything ListParams doesn't have a typed setter for. quotes and credits are invoices under different endpoints — Invoice Ninja stores all three in the same table, distinguished by entity_type, so Quote and Credit are type aliases for Invoice in the SDK and commands/quotes.rs/commands/credits.rs are otherwise identical to commands/invoices.rs. Likewise recurring_quotes/RecurringQuote mirror recurring_invoices/ RecurringInvoice.
  • update fetches the current record, shallow-merges the caller's --data/--file JSON on top, and writes the merged result back, rather than sending the patch alone — Invoice Ninja's PUT is a full replace. See CLAUDE.md and the comment in src/body.rs.
  • --output json on every command for the model's full Serialize output (including extra), suitable as input to a later update/create; the default table view is a convenience subset of columns.
  • Global --base-url, --token, and --api-password flags, each with a matching environment variable (IN_BASE_URL, IN_API_TOKEN, IN_API_PASSWORD); both secrets are hidden from --help and any echoed default.
  • Depends on invoiceninja-sdk 0.2.0 from crates.io.
  • A flake.nix with devShells.default, packages.default (built with a pinned toolchain), and overlays.default (for pulling invoiceninja-cli into another flake's own pkgs).
  • CI on GitHub Actions, mirroring invoiceninja-sdk's own ci.yml: a pinned-toolchain test job, a build-only msrv job on the declared 1.88 floor, and an advisory stable job.
  • nixosConfigurations.invoiceninja-test-nginx/-caddy (re-exported from invoiceninja-nixos) and an automated checks.invoiceninja-cli nixosTest that boots a real Invoice Ninja instance and runs this CLI's own binary against it. See CLAUDE.md's "Testing against a real server".
  • invoices/quotes/credits/purchase-orders gain action <id> <action> (entity actions — mark_sent, mark_paid, archive, restore, clone_to_invoice, clone_to_quote, auto_bill, delete) and download <id>... (the rendered PDF, to stdout or --out <path>; more than one id streams a single merged PDF). These four are the only resources with the SDK's entity_action_methods! route.