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)[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, }; }