import type { MrftaModel } from './irpc-mrfta.ts'; import { closureFingerprint } from './iva-closure.ts'; import { fractionPresentation, type FiscalFraction, } from './fiscal-rational.ts'; // Groups are working sheets, never a decision to split an official declaration. export function mrftaCases(m: MrftaModel) { return m.lines.map((line) => ({ key: closureFingerprint([m.period, line.rubric, line.rate, line.cer]), period: m.period, rubric: line.rubric, rate: line.rate, cer: line.cer, ids: [...line.ids], documents: [...line.documents], references: [...line.references], base: structuredClone(line.base), tax: structuredClone(line.tax), paid: structuredClone(line.paid), pending: !line.cer || !/^\d+$/.test(line.cer) || !line.ids.every((id) => m.input.codes.find((c) => c.rowId === id)?.reference.trim(), ) ? 'CER ou referência por corresponder;sem preenchimento presumido.' : 'CER transcrito com referência do caso;sem validação por catálogo oficial. Código provisório ou de simulação não é correspondência oficial.', officialSeparation: 'A correspondência de linhas/anexos/declaração oficial permanece por resolver quando há taxas/CER distintos na mesma rubrica.', })); } export function mrftaCaseHtml(m: MrftaModel, key: string): string { const c = mrftaCases(m).find((c) => c.key === key); if (!c) throw Error('Caso MRFTA não encontrado;reprepare as entradas actuais.'); const esc = (v: unknown) => String(v).replace( /[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', })[c]!, ); const money = (v: FiscalFraction | null) => { if (!v) return 'Indeterminado'; const p = fractionPresentation(v); return (p.approximate ? '≈' : '') + p.decimal + ' MZN'; }; return `MRFTA — ficha de caso

MRFTA — ficha de trabalho por caso

Não é uma declaração autónoma,guia,anexo oficial ou submissão. Não funde taxas nem substitui o total do período.

Período:${esc(c.period)};rubrica:${esc(c.rubric)};taxa:${c.rate}%;CER:${esc(c.cer || 'Por corresponder')}.

Base:${esc(money(c.base))};imposto:${esc(money(c.tax))};entregas:${esc(money(c.paid))}.

Documentos:${esc(c.documents.join(';'))};origens:${esc(c.ids.join(';'))}.

${esc(c.references.join(' | '))}

${esc(c.pending)}

${esc(c.officialSeparation)}

Pendências do período — conservadas

${esc(m.source)}`; }