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>
Five more resources following clients.rs's template exactly, same as
the previous batch. credits.rs is otherwise identical to quotes.rs
since Credit is also a type alias for Invoice in the SDK (same table,
distinguished by entity_type upstream).
Verified against a live local server: full create/list/get/update/
delete round trip for all five.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>