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

56 lines
3.0 KiB
Markdown

# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
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`](https://crates.io/crates/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.