61 lines
3.0 KiB
TypeScript
61 lines
3.0 KiB
TypeScript
import { isApiSimulationResultSnapshotV1 } from "./simulation-contract.ts";
|
|
|
|
export function fiscalQaRows(value: unknown): Array<[string, string]> {
|
|
if (!isApiSimulationResultSnapshotV1(value)) return [];
|
|
const snapshot = value as unknown as Record<string, unknown>;
|
|
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<string, unknown> | undefined;
|
|
const rule = provenance?.rule as Record<string, unknown> | undefined;
|
|
const source = rule?.source as Record<string, unknown> | undefined;
|
|
const parameters = rule?.parameters as
|
|
Record<string, Record<string, unknown>> | 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";
|
|
return [
|
|
["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)],
|
|
["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.",
|
|
],
|
|
];
|
|
}
|