import { useState } from 'react'; import { ispcActivities, ispcEligibilityBook, saveIspcEligibilityBook, recordIspcEligibility, ispcEligibilityCurrent, ispcReuseDiff, ispcEligibilityReportRows, type IspcEligibilityInput, type IspcEligibilityBook, } from '@/lib/ispc-eligibility'; const factLabels: Partial> = { territory: 'Exerce a actividade em território nacional', organizedRequired: 'Está obrigado a possuir contabilidade organizada para os impostos sobre o rendimento', sharesInIspc: 'Tem participações noutras sociedades comerciais em ISPC', sharesAnonymous: 'Tem participações em sociedades anónimas ou sociedades cujos sócios não são identificáveis', otherActivities: 'Exerce outras actividades fora dos âmbitos identificados', unlistedServices: 'Presta serviços fora dos previstos na Lei', forecastConfirmed: 'Previsão da declaração de início confirmada pela AT (ou pressuposto expresso na simulação)', generalRegimeChosen: 'Optou pela aplicação de IVA/IRPS/IRPC com permanência mínima de três anos', generalThreeYearsCompleted: 'Já cumpriu o período mínimo de três anos dessa opção', }; export function SimulationIspcEligibility({ draft, onChange, }: { draft: Record; onChange: (field: string, value: string) => void; }) { const [error, setError] = useState(''), [reusePreview, setReusePreview] = useState | null>(null); if (draft.fiscal_component !== 'ispc') return null; let book: IspcEligibilityBook; try { book = ispcEligibilityBook(draft); } catch (e) { return

{String(e)}

; } const i = book.input, save = (next: IspcEligibilityBook) => { try { onChange( 'modelo_a_snapshot', saveIspcEligibilityBook(draft, next), ); setError(''); } catch (e) { setError(String(e)); } }, change = (patch: Partial) => save({ ...book, input: { ...i, ...patch } }), diff = ispcReuseDiff(draft, book), service = i.activities.some((a) => ['services12', 'liberal15'].includes(a), ), liberal = i.activities.includes('liberal15'), earlyOutside = i.activities.includes('other') || i.territory === 'no' || i.mode === 'occasional'; const fact = (field: keyof typeof factLabels) => ( ); const text = ( field: keyof IspcEligibilityInput, label: string, type = 'text', ) => ( ); return (

ISPC — enquadramento e opção

Avaliação preliminar para 2026, em MZN, segundo a Lei 9/2025. Distingue condições de acesso, opção e cálculo do imposto. Guarde esta avaliação e prossiga no apuramento trimestral abaixo.

{error &&

{error}

} {diff.length > 0 && ( )} {reusePreview && ( )}
{text( 'entityRef', 'Entidade de referência (reutilizável; sem NUIT obrigatório para preparar)', )} {text('assessmentDate', 'Data de avaliação', 'date')} {fact('territory')}
Actividades do contribuinte

Identifique todas as actividades, incluindo as exercidas fora desta oportunidade. Não inferimos o regime pelo sector ou pela nacionalidade.

{ispcActivities.map(([kind, label]) => ( ))} {text( 'activityDescription', 'Descrição da actividade e natureza dos serviços, quando existam', )}
{!earlyOutside && ( <>
Volume anual de referência {text('referenceYear', 'Ano do valor de referência')} {text( 'annualReference', 'Volume anual de referência em MZN', )} {text( 'annualReferenceRef', 'Origem do valor ou pressuposto (opcional)', )}

Não copiar receita trimestral ou do ano em curso como receita do ano anterior. Alterar a origem não reinterpreta o valor já editado; reveja o montante e o ano.

{i.basis === 'start_forecast' && ( <> {fact('forecastConfirmed')} {text( 'forecastConfirmationRef', 'Referência da confirmação da previsão, se efectiva', )} )}
Condições aplicáveis ao contribuinte {text( 'establishments', 'Número de estabelecimentos da actividade, incluindo fora deste dossier', )} {fact('organizedRequired')} {fact('sharesInIspc')} {fact('sharesAnonymous')} {fact('otherActivities')} {service && fact('unlistedServices')} {liberal && ( <> {text( 'liberalDaysSameEntity', 'Maior duração anual dos serviços à mesma entidade, em dias', )} {text( 'liberalClientRef', 'Referência do cliente/contrato ou pressuposto da duração', )}

O limite de 183 dias refere-se aos serviços do artigo 8(1)c. A permanência liberal tem limite próprio de cinco anos; a contagem transitória começa em 2026.

)} {fact('generalRegimeChosen')} {i.generalRegimeChosen === 'yes' && ( <> {fact('generalThreeYearsCompleted')} {text( 'generalRegimeRef', 'Referência da opção e do cumprimento dos três anos', )} )}
Opção — separada da compatibilidade {i.option === 'opted' && ( <> {text('optionReference', 'Referência da opção')} {text('optionDate', 'Data da opção', 'date')} )}
)} {book.result && (

{ispcEligibilityCurrent(draft, book) ? 'Resultado correspondente às entradas guardadas.' : 'Entradas alteradas; resultado histórico preservado. Reveja e guarde nova avaliação.'}

)} {ispcEligibilityReportRows(draft).map((r, index) => (

{r[1]}: {r[2]} {r[3]}

))}
); }