Bug/customer invoice bug (#628)
* fix(supplier-invoices): self-assess reverse-charge VAT + link payments to vouchers Reverse-charge supplier invoices now carry a per-item reverse_charge_rate (0.06/0.12/0.25). Under omvänd skattskyldighet the supplier charges 0% VAT, so the line vat_rate stays 0 and the buyer self-assesses fiktiv moms at the statutory rate. Centralizes rate resolution (resolveReverseChargeRate) and the ruta 20-24 basis-account guard (isReverseChargeBasisAccount) in vat-entries so the booking engine and review-dialog preview can no longer drift. Adds the link_supplier_invoice_voucher pending operation: mark a leverantorsfaktura paid by linking an existing posted verifikat that debits 2440, with no new journal entry. Exposes find-candidates/link MCP tools and the bulk-reconcile helper, scoped under suppliers:read/write. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(vat): report yearly VAT over the rakenskapsar, not the calendar year Annual VAT (helarsmoms) is filed per beskattningsar/rakenskapsar (SFL 26 kap), which can be extended or shortened up to 18 months. The previous Jan-Dec calendar span silently dropped part of an extended first year. calculateVatDeclaration now accepts a fiscalPeriodId and resolves the period's actual bounds for yearly; monthly/quarterly stay calendar. The reports UI passes the selected fiscal period, defaults the periodicity from the company's moms_period setting, and carries the period into the ruta drill-down. full-archive export threads the period id through too. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(migration): resolve supplier invoice status from payment amounts The provider's lifecycle status and its payment status are computed independently upstream and can contradict each other (e.g. a Fortnox invoice marked booked but fully paid). Both the arcim entity-mapper and the Fortnox mapper now let payment state win: fully paid -> paid, partial -> partially_paid, otherwise the mapped lifecycle status, with credit notes forced terminal. Balance is compared numerically (never strict === 0) so float drift or a residual ore resolves cleanly, and an absent Balance is treated as unpaid. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(enable-banking): only ingest booked transactions to stop re-import drift Pending entries are skipped during sync: a pending row is unstable across syncs (a later 'synka nu' returns it still pending or finally booked, often with a different effective date). Because both the dedup external_id and the content-dedup key are date-derived, that drift minted a new id and re-imported a transaction that already existed - observed in production as the same amount+description landing twice with different dates. Gating the import set on a stable booking_date removes the drift at the source and leaves booked rows' ids byte-identical. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore(gitignore): ignore local SIE test fixtures tests/fixtures/sie/ may contain real or scrubbed company data and must never be committed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(invoice): handle errors during registration journal entry creation and ensure invoice rollback feat(tests): add test for reverse charge rate handling on supplier invoice line items feat(fortnox): ensure paid status reflects zero balance for fully paid invoices chore(migrations): add reverse_charge_rate to supplier_invoice_items and backfill link_supplier_invoice_voucher --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
358c25094d
commit
f6ee0c2a82
@@ -657,6 +657,10 @@ export interface SupplierInvoiceItem {
|
||||
vat_code: string | null
|
||||
vat_rate: number
|
||||
vat_amount: number
|
||||
// Self-assessed VAT rate for omvänd skattskyldighet (0.06/0.12/0.25), null
|
||||
// for non-RC lines. The supplier charges no VAT so vat_rate stays 0; this
|
||||
// rate drives the fiktiv-moms + basbelopp booking. See the booking engine.
|
||||
reverse_charge_rate: number | null
|
||||
|
||||
created_at: string
|
||||
}
|
||||
@@ -965,6 +969,9 @@ export interface CreateSupplierInvoiceItemInput {
|
||||
vat_rate?: number
|
||||
// Manual override. See CreateSupplierInvoiceItemSchema for rationale.
|
||||
vat_amount?: number
|
||||
// Self-assessed VAT rate for omvänd skattskyldighet (0.06/0.12/0.25). When
|
||||
// set, the engine books fiktiv moms at this rate while vat_rate stays 0.
|
||||
reverse_charge_rate?: number
|
||||
vat_code?: string
|
||||
// Legacy fields (backward compat, ignored when amount is set)
|
||||
quantity?: number
|
||||
@@ -1573,6 +1580,9 @@ export type PendingOperationType =
|
||||
| 'generate_agi'
|
||||
// Mark invoice paid by linking an existing posted verifikat (no new JE)
|
||||
| 'link_invoice_voucher'
|
||||
// Supplier-side mirror: mark a leverantörsfaktura paid by linking an existing
|
||||
// posted verifikat that debits 2440 (no new JE)
|
||||
| 'link_supplier_invoice_voucher'
|
||||
// PR #603/#607: allocate 1 bank tx across N customer or supplier invoices
|
||||
| 'match_batch_allocate'
|
||||
// PR #606/#610: bulk-book N bank txs into 1 combined verifikat
|
||||
|
||||
Reference in New Issue
Block a user