import { SimulationFxSelection } from '@/components/simulation-fx-selection'; import { rawNormalFinancialSource, type NormalBook } from '@/lib/irpc-normal'; import { newNormalPeriodFx, mapNormalPeriodFx, type NormalPeriodFxInput, } from '@/lib/irpc-normal-period-fx'; import { irpcFxSources, irpcFxRow, updateIrpcFx } from '@/lib/irpc-fx'; export function SimulationIrpcPeriodFx({ draft, book, save, }: { draft: Record; book: NormalBook; save: (b: NormalBook) => void; }) { const raw = rawNormalFinancialSource(draft), i = book.periodsFx; if (!i) return ( ); const patch = (p: Partial) => save({ ...book, periodsFx: { ...i, ...p } }), model = mapNormalPeriodFx(draft, i, raw), sources = irpcFxSources(draft); const text = ( k: | 'from' | 'to' | 'planStart' | 'reference' | 'conversionReference' | 'mznMapsReference', label: string, ) => ( ); return (
Período fiscal e conversão do plano — simulação L6

Reutiliza os meses e valores originais do plano. Seleccione apenas os meses do período documentado;sem anualizar o resultado. Os mapas,activos e saldos fiscais permanecem emMZN e exigem reconciliação explícita. A conversão cambial para simulação usa o mecanismo existente; não confirma automaticamente a regra fiscal de conversão anual.

{text('from', 'Início do período fiscal (AAAA-MM-DD)')} {text('to', 'Fim do período fiscal (AAAA-MM-DD)')} {text('planStart', 'Primeiro mês civil do plano (AAAA-MM-01)')} {text( 'reference', 'Suporte do evento,período e correspondência dos meses', )} {book.schedules && ( )} {text( 'mznMapsReference', 'Reconciliação dos mapas,parcelas,activos e saldos existentes em MZN para este período', )} {raw?.currency !== 'MZN' && ( <> {text( 'conversionReference', 'Pressuposto documentado da conversão mensal para simulação', )} {[...new Set(model.rows.map((r) => r.period))].map( (period) => { const date = model.rows.find( (r) => r.period === period, )?.date, entry = i.months.find( (m) => m.period === period, ) ?? { period, currency: raw?.currency ?? '' }; const change = (p: Partial) => patch({ months: [ ...i.months.filter( (m) => m.period !== period, ), { ...entry, ...p }, ], }); return (
Mês{period} — {date} — {raw?.currency} { if (p.fxSelection) change({ ...updateIrpcFx( entry, p.fxSelection, ), currency: raw?.currency ?? '', }); }} />
); }, )} )} {i.months .filter((m) => !model.rows.some((r) => r.period === m.period)) .map((m) => (

Selecção conservada do mês{m.period},fora do período actual.{' '}

))}

{model.months}meses;resultado convertido: {model.source?.accountingProfitBeforeTax ?? 'Indeterminado'}{' '} MZN. {model.pending.join(' | ')}

Meses parciais,limites anuais por corresponder e contagem de perdas41(5) afectam apenas os respectivos casos. Colecta não equivale ao saldo final a pagar.

); }