import { useState } from 'react'; import { depreciationCatalog, newNormalDepreciation, newDepreciationAsset, reuseNormalAssets, type DepreciationAsset, } from '@/lib/irpc-normal-depreciation'; import { normalFinancialSource, type NormalBook } from '@/lib/irpc-normal'; import { fiscalMoney } from '@/lib/irpc-normal-schedules'; import { addFractions, subtractFractions, fractionPresentation, } from '@/lib/fiscal-rational'; export function SimulationIrpcDepreciation({ draft, book, save, }: { draft: Record; book: NormalBook; save: (b: NormalBook) => void; }) { const [error, setError] = useState(''), input = book.depreciation, source = normalFinancialSource(draft); if (!input) return (
{!!book.schedules?.assets.length && ( )}
); const patch = (id: string, p: Partial) => save({ ...book, depreciation: { ...input, assets: input.assets.map((a) => a.id === id ? { ...a, ...p } : a, ), }, }); const field = ( a: DepreciationAsset, n: number, k: keyof DepreciationAsset, label: string, ) => ( ); const choice = ( a: DepreciationAsset, n: number, k: | 'specificRate' | 'consistentMethod' | 'newTangible' | 'switchToStraight' | 'priorFullQuotas' | 'vehicleException' | 'limitedRights' | 'individual', label: string, ) => ( ); return (
Amortizações — tabelas, métodos, duodécimos e quotas anteriores

Decreto72/2013 eCIRPC26/27. Reutiliza a depreciação financeira e os activos do mapa inicial; os originais/históricos ficam conservados. O novo mapa substitui exclusivamente o cálculo de amortizações, sem somar novamente o mapa inicial. Custo histórico e condições ordinárias documentados; reavaliações, turnos intensivos, concessões e outros casos especiais permanecem separados.

Depreciação contabilística a repartir:{' '} {source?.accountingLines.find((l) => l.code === 'depreciation') ?.total ?? 'Em falta'}{' '} {source?.currency}. O catálogo apresenta apenas os códigos correspondidos; outra categoria permanece identificada, sem taxa livre.

{error &&

{error}

} {input.assets.map((a, index) => { const n = index + 1, entry = Object.hasOwn(depreciationCatalog, a.category) ? depreciationCatalog[ a.category as keyof typeof depreciationCatalog ] : null; return (
Activo fiscal {n} —{' '} {a.description || 'Por identificar'} {field( a, n, 'assetKey', 'Identificação única do activo', )} {field(a, n, 'description', 'Descrição')} {field( a, n, 'document', 'Documento, pressuposto ou mapa de origem', )} {field( a, n, 'line', 'Linha distinta do documento/mapa', )} {entry && (

Taxa máxima: {entry.rate}%; taxas constantes cobertas: {Number(entry.rate) / 2}% a {entry.rate}%; vida útil mínima:{' '} {100 / Number(entry.rate)}anos, máxima:{' '} {200 / Number(entry.rate)}anos. Coeficiente degressivo máximo:{' '} {100 / Number(entry.rate) < 5 ? '1,5' : 100 / Number(entry.rate) <= 6 ? '2' : '2,5'} , apenas nos activos elegíveis. Fonte:tabela {entry.table}/{entry.code},PDF{entry.page}.

)} {field(a, n, 'cost', 'Custo histórico documentado MZN')} {field( a, n, 'accounting', 'Depreciação contabilística do exercício MZN', )} {a.category !== 'nondepreciable' && ( <> {entry && choice( a, n, 'specificRate', 'Existe taxa específica da tabelaI para o activo/actividade', )} {field(a, n, 'residual', 'Valor residual MZN')} {entry?.kind === 'building' && field( a, n, 'land', 'Terreno/parte não depreciável incluídos no custo MZN', )} {a.method === 'constant' && field( a, n, 'rate', 'Taxa constante escolhida %', )} {a.method === 'declining' && ( <> {choice( a, n, 'newTangible', 'Activo tangível novo adquirido a terceiros ou construído/produzido', )} {field( a, n, 'factor', 'Coeficiente degressivo escolhido (máximo1,5/2/2,5)', )} {choice( a, n, 'switchToStraight', 'Aplicar saldo/vida útil restante8(2) quando mais favorável', )} {a.switchToStraight === 'yes' && choice( a, n, 'priorFullQuotas', 'Condição de quotas anteriores do artigo8(2) integralmente documentada', )} )} {a.method === 'low_value' ? ( <> {choice( a, n, 'individual', 'Activo individual, fora de conjunto depreciado como um todo', )}

Art17:até20000MZN, sem amortização fiscal anterior e entrada emuso neste período; a dedução não excede o contabilizado e o saldo fiscal.

) : ( )} {field( a, n, 'start', 'Entrada em funcionamento/utilização AAAA-MM-DD', )} {(a.exitState === 'known' || a.exitDate) && field( a, n, 'exitDate', 'Data do evento AAAA-MM-DD', )} {choice( a, n, 'consistentMethod', 'Método uniforme desde o início, sem mudança ou excepção por corresponder', )} {entry?.kind === 'vehicle' && choice( a, n, 'vehicleException', 'Afectação a serviço público de transportes/locação na actividade normal', )} {entry?.kind === 'software' && choice( a, n, 'limitedRights', 'Aquisição onerosa e utilização exclusiva por tempo limitado', )} {field( a, n, 'previousAccounting', 'Quotas contabilísticas anteriores desde a utilização MZN', )} {field( a, n, 'previousFiscal', 'Quotas fiscais anteriormente deduzidas MZN', )} {field( a, n, 'priorAvailable', 'Parcela anterior temporariamente tributada, recuperável MZN', )} {field( a, n, 'previousReference', 'Suporte das quotas anteriores e da recuperabilidade fiscal', )} {[ 'previousAccounting', 'previousFiscal', 'priorAvailable', ].every( (k) => !a[k as 'previousFiscal'] || /^0(?:\.0+)?$/.test( a[k as 'previousFiscal'], ), ) && ( )}

Quota anterior recuperável exige contabilização e tributação temporária demonstradas. Não inclui encargos permanentemente excluídos ou quota nunca contabilizada. O cálculo apresenta o saldo posterior aritmético; não consome saldos oficiais.

)} {field( a, n, 'reference', 'Suporte do activo, categoria, condições e período', )}
); })}
); }