fix(vat): complete account treatment enforcement (#1593)

* fix(vat): complete account treatment enforcement

* docs(api): refresh account endpoint skill

* fix(mcp): preserve ruta 05 compatibility

* test(vat): seed migration constraint fixtures

* docs(vat): clarify treatment precedence

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Mattsson
2026-08-15 23:45:04 +02:00
committed by GitHub
co-authored by Claude Fable 5
parent edfdbe2d2a
commit 86f0b70fdd
43 changed files with 1017 additions and 359 deletions
@@ -22,7 +22,7 @@ export function AccountVatTreatmentSelect({
const t = useTranslations('chart_of_accounts')
const isRelevant = accountClass === 3 ||
(accountClass !== null && accountClass >= 4 && accountClass <= 6)
const treatments = accountClass === null ? [] : vatTreatmentsForAccountClass(accountClass)
const treatments = vatTreatmentsForAccountClass(accountClass)
return (
<div className="space-y-2">
+15 -2
View File
@@ -22,6 +22,7 @@ import { getErrorMessage as getUserErrorMessage } from '@/lib/errors/get-error-m
import { AccountVatTreatmentSelect } from './AccountVatTreatmentSelect'
import {
defaultRateForVatTreatment,
isVatTreatmentAllowedForAccountClass,
type AccountVatTreatment,
} from '@/lib/vat/account-vat-treatment'
@@ -72,6 +73,8 @@ export function AddAccountDialog({
const num = (initialAccountNumber ?? '').replace(/\D/g, '').slice(0, 4)
setAccountNumber(num)
setAccountName(initialAccountName ?? '')
setDefaultVatRate('none')
setDefaultVatTreatment('none')
setError('')
setInactiveConflict(false)
if (num.length === 4) {
@@ -209,6 +212,16 @@ export function AddAccountDialog({
onChange={(e) => {
const v = e.target.value.replace(/\D/g, '').slice(0, 4)
setAccountNumber(v)
const nextClass = v.length > 0 ? Number(v[0]) : null
if (
defaultVatTreatment !== 'none' &&
(nextClass === null || !isVatTreatmentAllowedForAccountClass(
defaultVatTreatment,
nextClass,
))
) {
setDefaultVatTreatment('none')
}
// The conflict is about a specific number; editing it makes
// the reactivate offer stale.
setInactiveConflict(false)
@@ -274,9 +287,9 @@ export function AddAccountDialog({
accountClass={derived ? Number(accountNumber.charAt(0)) : null}
onValueChange={(treatment) => {
setDefaultVatTreatment(treatment)
if (treatment !== 'none') {
if (treatment !== 'none' && defaultVatRate === 'none') {
const rate = defaultRateForVatTreatment(treatment, Number(accountNumber.charAt(0)))
setDefaultVatRate(rate === null ? 'none' : String(rate))
if (rate !== null) setDefaultVatRate(String(rate))
}
}}
/>
+2 -2
View File
@@ -327,9 +327,9 @@ export function EditAccountDialog({ open, onOpenChange, account, onSaved }: Edit
accountClass={account.account_class}
onValueChange={(treatment) => {
setDefaultVatTreatment(treatment)
if (treatment !== 'none') {
if (treatment !== 'none' && defaultVatRate === 'none') {
const rate = defaultRateForVatTreatment(treatment, account.account_class)
setDefaultVatRate(rate === null ? 'none' : String(rate))
if (rate !== null) setDefaultVatRate(String(rate))
}
}}
/>