Skip to content

ATS-ACC-TRX-001Issue customer bills and numbered quotes: Capability Test Specification

Markdown

ATS-ACC-TRX-001

Issue customer bills and numbered quotes: Capability Test Specification

Markdown
  • DocumentProposed

KindAcceptance test setProduct areaAccountingModuleTransactionsRevision1

Read atservices-accounting f47cb263react-console baf6dae3

Coverage

  • Rule covered
  • Transition gap: FND-ACC-TRX-066
  • Validation covered
  • Permission gap: FND-ACC-TRX-066
  • Edge gap: FND-ACC-TRX-066
  • Failure covered
  • Boundary covered
  • Concurrency covered
  • Invariant covered
  • Interaction covered

Test Scenarios

18 scenarios proving CAP-ACC-TRX-001; 15 bound to an existing test.

01 Obsolete draft saves preserve the newer statevalidationapinegativetest
Proves
BR-CAP-ACC-TRX-001-01 INV-DOM-ACC-TRX-001-01
Preconditions
Version two already supersedes the editor’s version one.
Steps
[ { "do": "Submit a replacement using the first version.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it refuses an update at a version the draft has moved past (stale)" } ]
Expected
The stale refusal retains version two unchanged.
Data
A contact, sellable product and unit.
Bound to
Source
services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it refuses an update at a version the draft has moved past (stale)
02 Draft context cannot switch unitsboundaryapinegativetest
Proves
BR-CAP-ACC-TRX-001-02 INV-DOM-ACC-TRX-001-02
Preconditions
The draft belongs to Alpha.
Steps
[ { "do": "Save it against Beta instead.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it refuses a change of business unit: a draft keeps its unit (business_unit_mismatch)" } ]
Expected
Unit mismatch retains the Alpha draft.
Data
Two configured business units.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it refuses a change of business unit: a draft keeps its unit (business_unit_mismatch)
Source
services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it refuses a change of business unit: a draft keeps its unit (business_unit_mismatch)
03 Invalid product choices create no draftvalidationapinegativetest
Proves
BR-CAP-ACC-TRX-001-03
Preconditions
A USD invoice faces inactive, foreign-unit, unsellable and EUR-priced products.
Steps
[ { "do": "Attempt creation separately with each invalid product.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it refuses an inactive product (product_not_sellable)" } ]
Expected
Each refusal identifies the problem and leaves no draft.
Data
Sellable and invalid products across two units.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it refuses a line priced in another currency than the invoice’s (currency_mismatch)
Source
services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it refuses an inactive product (product_not_sellable)
04 Rounded lines reconcile with their documentboundaryapitest
Proves
BR-CAP-ACC-TRX-001-04 INV-DOM-ACC-TRX-001-03
Preconditions
JPY and KWD pricing support fractional extensions.
Steps
[ { "do": "Issue half-unit extensions, then submit noninteger money and excessive discount.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it totals the rounded lines (3422), not a rounding of the unrounded sum (3421)" } ]
Expected
Extensions round away from zero once and sum exactly; invalid money and discount fail.
Data
Yen and dinar financial contexts.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it rounds each line’s extension once, half away from zero: 832.5 to 833 and 50.5 to 51
services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it totals the rounded lines (3422), not a rounding of the unrounded sum (3421)
services-accounting:modules/transactions/tests/e2e/invoices.e2e.spec.js#it answers 400 to an amount that is not a whole number of minor units
services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it refuses a discount above the line’s extended amount (over_application)
Source
services-accounting:modules/transactions/tests/integration/services/invoices/rounding.integration.spec.js#it totals the rounded lines (3422), not a rounding of the unrounded sum (3421)
05 Due-date precedence is explicitruleapitest
Proves
BR-CAP-ACC-TRX-001-05
Preconditions
Thirty-day terms exist and one customer defaults to forty-five days.
Steps
[ { "do": "Create requested-terms, customer-default, explicit-date and earlier-date drafts.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it takes the bill-to’s default terms when the request names none, the due date 45 days after the invoice date" } ]
Expected
Dates follow the selected precedence and the earlier date is rejected.
Data
Two term definitions and a customer override.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it takes the due date from the terms: thirty days after the invoice date
services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it takes the bill-to’s default terms when the request names none, the due date 45 days after the invoice date
services-accounting:modules/transactions/tests/integration/services/invoices/create-draft.integration.spec.js#it REGRESSION — refuses a due date before the invoice date with a 400, not the database’s CHECK
Source
services-accounting:modules/transactions/tests/integration/services/invoices/customer-terms-precedence.integration.spec.js#it takes the bill-to’s default terms when the request names none, the due date 45 days after the invoice date
06 Incomplete or reversed service dates failvalidationapinegativetest
Proves
BR-CAP-ACC-TRX-001-06
Preconditions
A dues line can carry service dates.
Steps
[ { "do": "Submit an end before its start, then omit the end.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it refuses a period ending before it starts with a 400 naming the service period" } ]
Expected
Neither draft is retained and each refusal identifies its period.
Data
A configured dues product and unit.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it refuses a period ending before it starts with a 400 naming the service period
Source
services-accounting:modules/transactions/tests/integration/services/invoices/service-period-order.integration.spec.js#it refuses a period ending before it starts with a 400 naming the service period
07 Ineligible posting context blocks issuefailureapinegativetest
Proves
BR-CAP-ACC-TRX-001-07 INV-DOM-ACC-TRX-001-04
Preconditions
Available cases include closed and foreign batches, uncovered dates and no assignment rule.
Steps
[ { "do": "Attempt issue in each invalid context.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it refuses the issue when the unit has no assignment rules (batch_required), the draft unchanged" } ]
Expected
Batch and period refusals preserve draft status without numbering.
Data
Invalid batches and fiscal dates.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it refuses the issue when the unit has no assignment rules (batch_required), the draft unchanged
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it issues in the active batch of the recurring batch the rules choose
Source
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it refuses the issue when the unit has no assignment rules (batch_required), the draft unchanged
08 Workspace invoice numbering advances independentlyruleapitest
Proves
BR-CAP-ACC-TRX-001-08 INV-DOM-ACC-TRX-001-05
Preconditions
The workspace has issued no invoices.
Steps
[ { "do": "Issue two separate bills.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it numbers the tenant’s first invoice 1,000,000" } ]
Expected
Their references are one million and one million plus one.
Data
A newly provisioned workspace.
Bound to
Source
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it numbers the tenant’s first invoice 1,000,000
09 Account selection waits for postingruleapitest
Proves
BR-CAP-ACC-TRX-001-09
Preconditions
One product has account setup and another lacks it.
Steps
[ { "do": "Issue both as lines of the same invoice.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it resolves no account on a line of a product with no setup either (the unit’s defaults are the posting’s to read)" } ]
Expected
Neither line receives ledger accounts during issue.
Data
Configured and unconfigured products.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it resolves no account on a line, even of a product with an accounting setup: the setup’s tax class alone is settled
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it resolves no account on a line of a product with no setup either (the unit’s defaults are the posting’s to read)
Source
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it resolves no account on a line of a product with no setup either (the unit’s defaults are the posting’s to read)
10 Direct mutation cannot alter issued contentinvariantunitnegativetest
Proves
BR-CAP-ACC-TRX-001-10 INV-DOM-ACC-TRX-001-06
Preconditions
A real invoice has been issued.
Steps
[ { "do": "Attempt application-role changes to product, amounts and tax class, then delete its line and header.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it refuses a change of an issued line’s amounts (RHA04)" } ]
Expected
Database protection rejects each direct mutation.
Data
Application-role database access.
Bound to
Source
services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it refuses a change of an issued line’s amounts (RHA04)
11 Monetary position determines standingtransitionapitest
Proves
BR-CAP-ACC-TRX-001-11 INV-DOM-ACC-TRX-001-07
Preconditions
Separate invoices are unpaid, partly settled, fully settled and zero-total.
Steps
[ { "do": "Read each after the relevant financial action.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it is paid at once, its line with it" } ]
Expected
The first two remain open and the latter two are paid.
Data
Receipts and zero-value billing fixtures.
Bound to
Source
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it is paid at once, its line with it
12 Quote recognition retains document identitytransitionapitest
Proves
BR-CAP-ACC-TRX-001-12 INV-DOM-ACC-TRX-001-08
Preconditions
A draft is marked pro forma.
Steps
[ { "do": "Issue and convert it, retry conversion, and compare deletion of an unconverted quote and real bill.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it gives it no batch, no accounting date and no recognition (FC-06)" } ]
Expected
Quote issue creates no debt; conversion keeps the number; repeat conversion and real-bill deletion fail.
Data
An eligible open posting batch.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it gives it no batch, no accounting date and no recognition (FC-06)
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it makes it a real invoice in the batch, its receivable recognized, its number kept
Source
services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it gives it no batch, no accounting date and no recognition (FC-06)
13 Issue freezes applicable tax treatmentinvariantapitest
Proves
BR-CAP-ACC-TRX-001-13 INV-DOM-ACC-TRX-001-16
Preconditions
New York tax rules, an exempt organization and an addressless party exist.
Steps
[ { "do": "Issue ordinary, shipped, exempt and addressless staff charges.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it writes one tax line per rate on the dues line, naming the zone and the rate and no account" } ]
Expected
Frozen per-rate tax follows the applicable address, exemption produces no tax and the addressless taxable case fails.
Data
Tax classes and geographical rules.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it writes one tax line per rate on the dues line, naming the zone and the rate and no account
services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it freezes the tax lines with the invoice: the application role can neither change nor delete one
services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax-ship-to.integration.spec.js#it taxes the shipped line at the ship-to address: the Westchester zone’s County tax
services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it carries the exemption of an organization CRM says is tax exempt: no tax lines, is_tax_exempt true
services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it refuses the issue of a staff invoice to a party with no address (D-T4), naming the code, and writes nothing
Source
services-accounting:modules/transactions/tests/integration/services/invoices/issue-tax.integration.spec.js#it writes one tax line per rate on the dues line, naming the zone and the rate and no account
14 Creation selects a valid fee policyruleapitest
Proves
BR-CAP-ACC-TRX-001-14
Preconditions
The unit defaults to optional processing fees.
Steps
[ { "do": "Create required-policy, unspecified-policy and invalid-policy invoices.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it stamps the body’s policy on the invoice, and the unit’s default (optional) when the body names none" } ]
Expected
The first retains required, the next optional, and invalid policy fails.
Data
A business unit with fee configuration.
Bound to
services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it stamps the body’s policy on the invoice, and the unit’s default (optional) when the body names none
services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it refuses a policy that is not none, required or optional (400, the contract’s own refusal naming the field)
Source
services-accounting:modules/transactions/tests/e2e/card-fees.e2e.spec.js#it stamps the body’s policy on the invoice, and the unit’s default (optional) when the body names none
15 Automatic deferral can require a complete periodvalidationapinegativeproposed
Proves
BR-CAP-ACC-TRX-001-15
Preconditions
An automatically deferred line lacks dates and mandatory periods are enabled.
Steps
[ { "do": "Attempt issue, supply both dates and issue again.", "provenance": "proposed", "source": "services-accounting:modules/transactions/services/invoices/invoice-service-periods.ts:requireServicePeriods" } ]
Expected
The first attempt remains unnumbered and the complete period permits issue.
Data
Automatic deferral setup and an eligible period and batch.
Source
services-accounting:modules/transactions/services/invoices/invoice-service-periods.ts:requireServicePeriods
16 Issue preserves or selects the conversion rateruleapiproposed
Proves
BR-CAP-ACC-TRX-001-16
Preconditions
A foreign-currency draft can use a stored or configured dated rate.
Steps
[ { "do": "Issue separate drafts with both, configured only and neither.", "provenance": "proposed", "source": "services-accounting:modules/transactions/services/invoices/invoice-issue.ts:exchangeRateOf" } ]
Expected
Stored rate wins, inverse configured rate follows, and no available rate leaves none stored.
Data
Foreign-currency configuration and dated rates.
Source
services-accounting:modules/transactions/services/invoices/invoice-issue.ts:exchangeRateOf
17 A revised service bill reaches the customerinteractionapiproposed
Proves
BR-CAP-ACC-TRX-001-01 BR-CAP-ACC-TRX-001-07 BR-CAP-ACC-TRX-001-10 BR-CAP-ACC-TRX-001-12 BR-CAP-ACC-TRX-002-01 BR-CAP-ACC-TRX-002-03 BR-CAP-ACC-TRX-005-02 BR-CAP-ACC-TRX-005-06 BR-CAP-ACC-TRX-016-01 BR-CAP-ACC-TRX-016-02 BR-CAP-ACC-TRX-020-02 BR-CAP-ACC-TRX-020-03
Preconditions
An isolated workspace has eligible customers, products, matching accounts, an open period and two open batches. Each branch owns separate financial records.
Steps
[ { "do": "Commerce creates an 80.00 bill. Staff add an eligible 20.00 charge before posting, inspect available actions, render the revised bill and submit it for delivery.", "provenance": "proposed", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it refuses an update at a version the draft has moved past (stale); services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it refuses the issue when the unit has no assignment rules (batch_required), the draft unchanged; services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it refuses a change of an issued line’s amounts (RHA04); services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it gives it no batch, no accounting date and no recognition (FC-06); rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03" } ]
Expected
The customer document shows 100.00 and the revised content; the action list reflects the issued bill; the service retry creates no second bill.
Data
Separate command keys, two customers, invoice lines, receipts and credit; controlled processor outcomes and a fixed calendar where the branch requires them.
Source
services-accounting:modules/transactions/tests/integration/services/invoices/update-draft.integration.spec.js#it refuses an update at a version the draft has moved past (stale); services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it refuses the issue when the unit has no assignment rules (batch_required), the draft unchanged; services-accounting:modules/transactions/tests/integration/db/invoices.table.integration.spec.js#it refuses a change of an issued line’s amounts (RHA04); services-accounting:modules/transactions/tests/integration/services/invoices/issue.integration.spec.js#it gives it no batch, no accounting date and no recognition (FC-06); rhythm-v2-docs:specs/accounting/transactions/design/workflows/WF-ACC-TRX-001-create-and-issue-an-invoice.md#WF-ACC-TRX-001; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-01; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-07; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-10; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-001-bill-a-customer-with-an-invoice.md#BR-CAP-ACC-TRX-001-12; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-01; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-002-correct-or-cancel-an-issued-invoice-before-its-batch-posts.md#BR-CAP-ACC-TRX-002-03; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-02; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-005-send-a-customer-their-invoice.md#BR-CAP-ACC-TRX-005-06; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-01; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-016-find-transactions-and-see-what-can-be-done-next.md#BR-CAP-ACC-TRX-016-02; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-02; rhythm-v2-docs:specs/accounting/transactions/planning/capabilities/CAP-ACC-TRX-020-let-commerce-and-the-processor-work-with-accounting-safely.md#BR-CAP-ACC-TRX-020-03
18 Competing issues retain one invoice effectconcurrencyapitest
Proves
BR-CAP-ACC-TRX-001-08 INV-DOM-ACC-TRX-006-06
Preconditions
Two callers hold the same eligible draft and submit the same issue key at once.
Steps
[ { "do": "Race the two issue requests and inspect the invoice’s issue events and receivable facts.", "provenance": "test", "source": "services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it issues the invoice once and refuses the other issue invoice_not_draft; services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it appends one set of facts" } ]
Expected
One request issues the invoice and the other is refused because the draft has already moved; only one set of financial facts remains.
Data
Branch-owned records in one configured workspace, valid accounting context and controlled requests at the stated boundary.
Bound to
services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it issues the invoice once and refuses the other issue invoice_not_draft
Source
services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it issues the invoice once and refuses the other issue invoice_not_draft; services-accounting:modules/transactions/tests/integration/services/invoices/idempotency.integration.spec.js#it appends one set of facts

The Markdown files under specs/ in rhythmsoftware/rhythm-v2-docs are the canonical source of truth. This reader is a generated, read-only projection of them.