21 lines
3.4 KiB
TypeScript
21 lines
3.4 KiB
TypeScript
export const irpcSpecialCombinationsVersion='IRPC-normal-adjustments/14';
|
|
export const specialCombinationsSource='CBF4/13,compilação oficial APIEX pp66/70:benefícios específicos não cumuláveis entre si ou com genéricos,salvo excepção expressa;CBF16 é genérico. CIRPC12/14 e61(1):cooperativa abrangida,redução50% da taxa geral32%=16%,base integralmente elegível,sem rendimentos sujeitos a retenção. Recorte de combinação destes tratamentos já qualificados:primeiro a diferença fiscalCBF16,depois a matéria colectável e a taxa16%;imposto autónomo61(4) separado a35%,sem redução cooperativa. Não se aplica automaticamente benefício específico,outro benefício ou excepção sem correspondência.';
|
|
export type SpecialCombinationsInput={version:1;reference:string;specificState:''|'absent'|'known';specificReference:string;specificException:''|'absent'|'claimed';otherState:''|'absent'|'known';otherReference:string};
|
|
export const newSpecialCombinations=():SpecialCombinationsInput=>({version:1,reference:'',specificState:'',specificReference:'',specificException:'',otherState:'',otherReference:''});
|
|
export function validateSpecialCombinations(i:SpecialCombinationsInput){
|
|
if(!i||i.version!==1||['reference','specificReference','otherReference'].some(k=>typeof i[k as 'reference']!=='string')||!['','absent','known'].includes(i.specificState)||!['','absent','claimed'].includes(i.specificException)||!['','absent','known'].includes(i.otherState))throw Error('Mapa de cumulações não recuperável;históricos conservados.');
|
|
}
|
|
export function qualifySpecialCombinations(i:SpecialCombinationsInput,genericRequested=true){
|
|
validateSpecialCombinations(i);const pending:string[]=[];let incompatible=false;
|
|
if(!i.reference.trim())pending.push('Falta suporte da combinação dos tratamentos registados no mesmo sujeito/projecto/período.');
|
|
if(!i.specificState||!i.specificReference.trim())pending.push('Benefícios específicosCBF:identifique presença ou ausência documentada;localização não prova estatuto.');
|
|
if(!i.otherState||!i.otherReference.trim())pending.push('Outros benefícios além dos tratamentosL7 registados:identifique presença ou ausência com suporte.');
|
|
if(i.specificState==='absent'&&i.specificException)pending.push('Ausência de benefício específico contradiz excepção preenchida;reconcilie a declaração.');
|
|
if(i.specificState==='known'){
|
|
if(i.specificException==='absent'&&genericRequested){incompatible=true;pending.push('IncompatibilidadeCBF4/13:benefício específico declarado e genéricoCBF16 sem excepção expressa;nenhum benefício é escolhido ou removido automaticamente.');}
|
|
else pending.push(i.specificException==='absent'?'Benefício específico declarado sem cálculo próprio correspondido;não é ignorado na totalização.':i.specificException==='claimed'?'Excepção expressa invocada:ligar artigo,âmbito,período e limites à combinação antes de calcular;esta excepção ainda não está correspondida.':'Benefício específico declarado:identifique excepção expressa ou ausência;sem presumir acumulação.');
|
|
}
|
|
if(i.otherState==='known')pending.push('Outro benefício declarado ainda sem cálculo/ordem/limite correspondidos;sem o aplicar ou ignorar por presunção.');
|
|
return{status:incompatible?'incompatible' as const:pending.length?'indeterminate' as const:'compatible' as const,ready:pending.length===0,pending,source:specialCombinationsSource};
|
|
}
|