173 lines
6.3 KiB
TypeScript
173 lines
6.3 KiB
TypeScript
import type { AdvanceFiscalPeriod } from '@/lib/irpc-ppc-obligation';
|
|
import {
|
|
newPecPlan,
|
|
calculatePecPlan,
|
|
type PecPlan,
|
|
} from '@/lib/irpc-pec-plan';
|
|
import {
|
|
fractionPresentation,
|
|
type FiscalFraction,
|
|
} from '@/lib/fiscal-rational';
|
|
export function SimulationIrpcPecPlan({
|
|
plan,
|
|
total,
|
|
notApplicable,
|
|
year,
|
|
period,
|
|
onChange,
|
|
}: {
|
|
plan?: PecPlan;
|
|
total: FiscalFraction | null;
|
|
notApplicable: boolean;
|
|
year: string;
|
|
period?: AdvanceFiscalPeriod;
|
|
onChange: (p: PecPlan) => void;
|
|
}) {
|
|
if (!plan)
|
|
return (
|
|
<div className="rounded border p-3">
|
|
<p>
|
|
Prepare os montantes por prestação ou a opção de pagamento
|
|
único,sem registar pagamento.
|
|
</p>
|
|
<button
|
|
type="button"
|
|
disabled={
|
|
!total || notApplicable || BigInt(total.numerator) <= 0n
|
|
}
|
|
onClick={() => onChange(newPecPlan(period))}
|
|
>
|
|
Simular tesouraria PEC
|
|
</button>
|
|
</div>
|
|
);
|
|
const m = calculatePecPlan(plan, total, notApplicable, year, period),
|
|
patch = (p: Partial<PecPlan>) => onChange({ ...plan, ...p });
|
|
const field = (
|
|
key: 'reference' | 'june' | 'august' | 'october',
|
|
label: string,
|
|
) => (
|
|
<label className="block">
|
|
{label}
|
|
<input
|
|
aria-label={label}
|
|
value={plan[key]}
|
|
onChange={(e) => patch({ [key]: e.target.value })}
|
|
/>
|
|
</label>
|
|
);
|
|
return (
|
|
<section
|
|
aria-label="Projecção de tesouraria PEC"
|
|
className="rounded border p-3"
|
|
>
|
|
<h6>Projecção PEC</h6>
|
|
{m.pending.length ? (
|
|
<p role="status">{m.pending.join(' ')}</p>
|
|
) : (
|
|
<p>
|
|
Soma reconciliada:{' '}
|
|
{m.rows
|
|
.map(
|
|
(r) =>
|
|
r.month +
|
|
': ' +
|
|
fractionPresentation(r.amount).decimal +
|
|
' MZN',
|
|
)
|
|
.join('; ')}
|
|
. Prazo legal não validado.
|
|
</p>
|
|
)}
|
|
{m.needsPeriodConfirmation && !m.calendarPending && (
|
|
<button
|
|
type="button"
|
|
className="rounded border p-2"
|
|
onClick={() =>
|
|
patch({
|
|
periodFrom: m.contextFrom,
|
|
periodTo: m.contextTo,
|
|
})
|
|
}
|
|
>
|
|
Conferi a distribuição para {m.contextFrom} — {m.contextTo}
|
|
</button>
|
|
)}
|
|
<details open={m.pending.length > 0}>
|
|
<summary>Alterar projecção PEC</summary>
|
|
<label className="block">
|
|
Opção de preparação PEC
|
|
<select
|
|
aria-label="Opção de preparação PEC"
|
|
value={plan.mode}
|
|
onChange={(e) =>
|
|
patch({ mode: e.target.value as PecPlan['mode'] })
|
|
}
|
|
>
|
|
<option value="">Por escolher</option>
|
|
<option value="three">
|
|
Distribuir a estimativa por três meses
|
|
</option>
|
|
<option value="single">
|
|
Concentrar a estimativa num mês
|
|
</option>
|
|
</select>
|
|
</label>
|
|
{field('reference', 'Fundamento do projecção PEC')}
|
|
{plan.mode === 'three' && (
|
|
<>
|
|
{field(
|
|
'june',
|
|
m.calendarPending
|
|
? 'PEC primeiro montante — mês por confirmar'
|
|
: m.nonCivil
|
|
? 'PEC 6.º mês (' + m.months[0] + ') — MZN'
|
|
: 'PEC Junho — MZN',
|
|
)}
|
|
{field(
|
|
'august',
|
|
m.calendarPending
|
|
? 'PEC segundo montante — mês por confirmar'
|
|
: m.nonCivil
|
|
? 'PEC 8.º mês (' + m.months[1] + ') — MZN'
|
|
: 'PEC Agosto — MZN',
|
|
)}
|
|
{field(
|
|
'october',
|
|
m.calendarPending
|
|
? 'PEC terceiro montante — mês por confirmar'
|
|
: m.nonCivil
|
|
? 'PEC 10.º mês (' + m.months[2] + ') — MZN'
|
|
: 'PEC Outubro — MZN',
|
|
)}
|
|
</>
|
|
)}
|
|
{plan.mode === 'single' && (
|
|
<label className="block">
|
|
Mês previsto do PEC único
|
|
<input
|
|
aria-label="Mês previsto do PEC único"
|
|
type="month"
|
|
value={plan.singleMonth}
|
|
onChange={(e) =>
|
|
patch({ singleMonth: e.target.value })
|
|
}
|
|
/>
|
|
</label>
|
|
)}
|
|
</details>
|
|
<p>
|
|
O mês escolhido é uma hipótese de tesouraria para avaliar a
|
|
viabilidade. A reconciliação da soma não valida os prazos
|
|
legais,emite guia ou regista pagamento. Alterar a estimativa
|
|
exige reconferir o plano. Guarde pelo rascunho e recalcule o
|
|
fecho para actualizar o relatório.
|
|
</p>
|
|
<details>
|
|
<summary>Fonte do projecção PEC</summary>
|
|
<p>{m.source}</p>
|
|
</details>
|
|
</section>
|
|
);
|
|
}
|