import { isApiSimulationResultSnapshotV1 } from './simulation-contract.ts'; import { modeloAComponentRows } from './iva-modelo-a.ts'; export function fiscalQaRows(value: unknown): Array<[string, string]> { if (!isApiSimulationResultSnapshotV1(value)) return []; const snapshot = value as unknown as Record; if ( !['fiscal_rule_qa_preview', 'fiscal_rule_published'].includes( String(snapshot.scenario_kind), ) ) return []; const published = snapshot.scenario_kind === 'fiscal_rule_published'; const provenance = snapshot.fiscal_provenance as | Record | undefined; const rule = provenance?.rule as Record | undefined; const source = rule?.source as Record | undefined; const parameters = rule?.parameters as | Record> | undefined; const intermediate = snapshot.intermediate as Record< string, unknown > | null; const text = (item: unknown) => typeof item === 'string' || typeof item === 'number' ? String(item) : 'não disponível'; const monthly = snapshot.monthly_projection as | { rows?: Array>; cash_treatment?: string } | undefined; return [ ...modeloAComponentRows(snapshot), ...(monthly?.rows ? ([ [ 'Projecção mensal', 'Vendas tributáveis sem IVA → taxa aplicada → IVA calculado → total com IVA; não é apuramento final', ], ...monthly.rows.map((row) => [ `Mês ${text(row.date)}`, `Vendas declaradas: ${text(row.sales_declared)}; base líquida: ${text(row.net_sales)}; taxa: ${row.rate == null ? 'não aplicada' : `${text(row.rate)}%`}; IVA: ${text(row.vat)}; total com IVA: ${text(row.gross_sales)}; ${row.status === 'calculated' ? 'calculado' : row.status === 'missing_sales' ? 'sem informação de vendas' : row.status === 'unsupported_basis' ? 'base líquida não determinada' : 'enquadramento ou regra indeterminados'}`, ]), [ 'Tratamento na tesouraria', monthly.cash_treatment ?? 'IVA separado; não é custo nem imposto a pagar', ], ] as Array<[string, string]>) : []), [ 'Relatório', published ? 'IVA pela versão publicada; ver enquadramento abaixo' : 'Pré-visualização fiscal QA de rascunho — sem activação', ], [ 'IVA calculado (exacto; não é saldo a pagar)', value.result.value ?? 'Indeterminado', ], ['Explicação', value.result.explanation], ['Base tributável declarada', text(snapshot.base)], ['Taxa cadastrada (%)', text(parameters?.IVA_GENERAL_RATE?.value)], ['Moeda explícita', text(value.context.currency)], [ monthly ? 'Início da projecção mensal' : 'Data de exigibilidade declarada', value.context.reference_date, ], [ 'Enquadramento', provenance?.scope_status === 'undetermined' ? 'Indeterminado: falta declaração do enquadramento' : 'Declarado pelo utilizador; não validado juridicamente', ], [ 'Regra / versão / estado', `${text(rule?.rule_code)} / ${text(rule?.rule_version)} / ${published ? 'publicada no momento da admissão' : 'rascunho'}`, ], [ 'Vigência cadastrada', `${text(rule?.valid_from)} até ${rule?.valid_until === null ? 'sem termo indicado' : text(rule?.valid_until)}`, ], [ 'Fonte da taxa', `${text(source?.diploma)} — ${text(source?.article)}`, ], ['Hash do exemplar da taxa', text(rule?.source_sha256)], ['Representação racional exacta', text(intermediate?.result)], [ 'Arredondamento', 'Não aplicado. Valor calculado preservado sem truncar ou arredondar; apresentação monetária separada.', ], [ 'Limitações', published ? 'Cobertura de 2026; operação interna geral em MZN; sem excepções, deduções, declaração ou saldo a pagar.' : 'Regra não publicada; cobertura demonstrada em 2026; sem deduções, declaração ou saldo a pagar.', ], ]; }