* feat(assets): atomic asset disposal workflow (avyttring, utrangering, verksamhetsoverlatelse)
Disposal books depreciation to the disposal date, clears cost and
accumulated depreciation, books gain (3973) or loss (7973), applies
output VAT on third-party sales, honors the ML 5 kap. 38 §
verksamhetsoverlatelse exemption, and recalculates ML 15 kap. jamkning
server-side from tax years and original input VAT. The voucher, the
disposal-date depreciation schedule and the immutable register state
commit in one dedicated commit_asset_disposal RPC transaction that
delegates voucher numbering to commit_journal_entry.
Fixes#325
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(assets): harden disposal per review and pg-real findings
- commit_asset_disposal now uses the NULL-safe caller_is_company_member()
guard (tenant-guard ratchet) and passes the allowed 'user_accept'
commit_method instead of the unlisted 'asset_disposal' value
- disposal metadata invariants validated in the RPC (non-negative
proceeds/VAT, VAT requires a treatment, VAT <= gross, scrap carries no
proceeds) since the RPC is independently callable
- new FK and CHECK constraints added NOT VALID + VALIDATE CONSTRAINT so
the migration never blocks writes on the hot journal_entries table
- disposeAsset paginates fiscal periods and depreciation schedules with
fetchAllRows; jamkning_remaining_years keeps a valid 0 (?? not ||)
- engine imports shared AssetDisposalType/AssetJamkningDirection/
VatTreatment unions; post-commit reload retries once and logs before
surfacing, so a transient read cannot masquerade as a failed disposal
- dispose page parses Swedish-formatted amounts (125 000,50) and blocks
submission on unparseable proceeds
- assets pg tests write disposal attributes in the disposal transition
itself and gain a regression test that the register is frozen after
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>