Files
Investidor-V2/resources/js/components/simulation-modelo-a.tsx
T

166 lines
7.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import {
modeloAFields,
modeloAPurchaseReferences,
modeloAReference,
} from '@/lib/iva-modelo-a';
export function SimulationModeloA({
draft,
}: {
draft: Record<string, unknown>;
}) {
let purchases: ReturnType<typeof modeloAPurchaseReferences> = [];
let error = '';
try {
purchases = modeloAPurchaseReferences(draft);
} catch (cause) {
error =
cause instanceof Error
? cause.message
: 'Não foi possível consultar as aquisições projectadas.';
}
return (
<section
aria-label="Correspondência com o Modelo A"
className="space-y-3 rounded border p-3"
>
<h4 className="font-semibold">
Modelo A — correspondência da simulação
</h4>
<p>{modeloAReference.status}</p>
<p>
Esta correspondência descreve a componente de vendas01/02.
Consulte o bloco de compras e apuramento parcial para os
campos08–10 e14–18, que só são determinados com as parcelas
necessárias completas. O IVA das vendas não é imposto final a
pagar.
</p>
<details>
<summary>
Aquisições já projectadas — sem dedução presumida
</summary>
<p>
Reutilizam-se os valores das compras/encomendas para
existências do plano. O mês da encomenda não prova a data da
factura, recepção ou pagamento. Valores declarados ainda sem
indicação de base líquida/IVA incluído não são tratados como
base tributável. IVA suportado e IVA dedutível continuam por
determinar; zero de compras não prova inexistência de outras
aquisições.
</p>
{error && <p role="alert">{error}</p>}
{!purchases.length && !error && (
<p>
Sem agenda de compras recuperável do plano empresarial.
</p>
)}
{!!purchases.length && (
<div className="overflow-x-auto">
<table className="min-w-full text-sm">
<caption>
Pressupostos actuais de compras; sem resultado
fiscal guardado
</caption>
<thead>
<tr>
{[
'Mês do plano',
'Compras declaradas',
'Sem IVA',
'IVA suportado',
'Com IVA',
'IVA dedutível',
].map((name) => (
<th
className="p-2 text-left"
key={name}
>
{name}
</th>
))}
</tr>
</thead>
<tbody>
{purchases.map((row) => (
<tr key={row.month}>
<th className="p-2" scope="row">
{row.month}
</th>
<td>
{row.declared ?? 'Sem informação'}
</td>
<td>Por classificar</td>
<td>Indeterminado</td>
<td>Por classificar</td>
<td>Indeterminado</td>
</tr>
))}
</tbody>
</table>
</div>
)}
</details>
<details>
<summary>
Ver campos, cálculos, fundamentos e cobertura do Modelo A
</summary>
<p>
{modeloAReference.file}. {modeloAReference.edition} SHA256:{' '}
{modeloAReference.sha256}.
</p>
<p>
O exemplar contém divergências de numeração/remissões,
registadas no confronto documental. Não foram corrigidas no
original. A existência de um campo não activa uma regra
fiscal.
</p>
<div className="overflow-x-auto">
<table className="min-w-full text-sm">
<caption>
Campo do Modelo A → finalidade → origem → cálculo →
fundamento → cobertura
</caption>
<thead>
<tr>
{[
'Campo',
'Finalidade',
'Origem dos dados',
'Cálculo',
'Fundamento',
'Estado',
].map((name) => (
<th className="p-2 text-left" key={name}>
{name}
</th>
))}
</tr>
</thead>
<tbody>
{modeloAFields.map((field) => (
<tr key={field.field}>
{[
field.field,
field.purpose,
field.origin,
field.calculation,
field.basis,
field.status,
].map((value, index) => (
<td
className="border-t p-2 align-top"
key={index}
>
{value}
</td>
))}
</tr>
))}
</tbody>
</table>
</div>
</details>
</section>
);
}