Files
Investidor-V2/resources/js/lib/irpc-pec-correction.ts
T
2026-11-11 10:55:53 +02:00

81 lines
2.7 KiB
TypeScript

export const pecCorrectionVersion = 'IRPC-PEC-turnover-correction/1';
export const pecCorrectionSource =
'RIRPC,Decreto9/2008,art29(3),BR16/I16-04-2008:volume de negócios determinado pelas vendas/serviços até ao final do exercício anterior,podendo ser rectificado no ano seguinte se distinto do usado no cálculo. Recorte:correcção documental do volume2025 na simulação2026;original,fundamento e diferença conservados. Não é declaração fiscal rectificativa submetida.';
export type PecCorrection = {
version: 1;
apply: '' | 'yes' | 'no';
originalTurnover: string;
revisedTurnover: string;
subjectNuit: string;
turnoverYear: string;
reference: string;
};
export const newPecCorrection = (
originalTurnover: string,
subjectNuit: string,
): PecCorrection => ({
version: 1,
apply: '',
originalTurnover,
revisedTurnover: '',
subjectNuit,
turnoverYear: '2025',
reference: '',
});
export function validatePecCorrection(c: PecCorrection) {
if (
!c ||
c.version !== 1 ||
!['', 'yes', 'no'].includes(c.apply) ||
[
'originalTurnover',
'revisedTurnover',
'subjectNuit',
'turnoverYear',
'reference',
].some(
(k) =>
typeof (c as unknown as Record<string, unknown>)[k] !==
'string',
)
)
throw Error('Rectificação PEC não recuperável;original preservado.');
}
export function correctedPecTurnover(
c: PecCorrection | undefined,
original: string,
subjectNuit: string,
previousYear: string,
) {
if (!c) return { value: original, pending: [] as string[], applied: false };
validatePecCorrection(c);
if (c.apply === 'no')
return { value: original, pending: [] as string[], applied: false };
const pending: string[] = [];
if (c.apply !== 'yes')
pending.push(
'PEC:escolha aplicar a rectificação ou conservar o volume original.',
);
if (
c.originalTurnover !== original ||
c.subjectNuit !== subjectNuit ||
c.turnoverYear !== previousYear ||
previousYear !== '2025'
)
pending.push(
'PEC:origem,titular ou exercício da rectificação divergem da base;reconfira sem sobrescrever os valores.',
);
if (
!/^\d{1,18}(\.\d{1,2})?$/.test(c.revisedTurnover) ||
!c.reference.trim()
)
pending.push(
'PEC:rectificação exige volume corrigido2025 em MZN e fonte/fundamento;valor desconhecido não equivale a zero.',
);
return {
value: pending.length ? '' : c.revisedTurnover,
pending,
applied: pending.length === 0,
};
}