import type { OperationTreatment } from './iva-operations.ts'; export const specialRegimeOptions = [ ['economic_zone', 'Zona económica especial'], ['free_zone', 'Zona franca'], ['free_warehouse', 'Depósito franco'], ['general_free_warehouse', 'Depósito geral franco'], ['customs_warehouse', 'Depósito de regime aduaneiro'], ['duty_free_shop', 'Loja franca'], ['transit', 'Trânsito'], ['drawback', 'Draubaque'], ['temporary_import', 'Importação temporária'], ] as const; export type SpecialRegime = '' | (typeof specialRegimeOptions)[number][0]; const zoneRegimes: readonly string[] = specialRegimeOptions .slice(0, 6) .map(([id]) => id); const transitRegimes: readonly string[] = [ 'transit', 'drawback', 'temporary_import', ]; const source = 'CIVA republicado Lei13/2016, BR156/10.º suplemento,14(1)(b/c/d) e condição inicial de14(1),PDF13/p.1426(271);19(1)(b)(iv),PDF15/p.1426(273). Lei22/2022art.1,PDF1, e Lei10/2025art.1,PDF12–13/p.2180(12)–(13),não alteram14 nem19(1)(b)(iv). Âmbito2026/MZN; não calcula importação14(1)(a), aquisição14(2), saída de regime, direitos aduaneiros ou dedução automática de compras.'; const make = ( id: string, label: string, letter: string, conditions: string[], ): OperationTreatment => ({ id, label, field: '05', rate: 0, article: `CIVA arts.14(1)(${letter}),19(1)(b)(iv)`, source, logicVersion: 'special-regimes/1', conditions: [ 'Transmissão de bens ou prestação de serviços abrangida pelo CIVA em Moçambique, com territorialidade identificada; não o próprio acto de importação nem aquisição pelo beneficiário', 'Os bens a que a operação se refere não têm utilização nem consumo finais nas áreas mencionadas em14(1); destino efectivo ou pressuposto expresso da projecção identificado, sem o presumir pela localização no mapa', ...conditions, ], }); export const specialRegimeTreatments: OperationTreatment[] = [ make( 'regime_dispatch_goods', 'Bens expedidos para zona ou depósito elegível', 'b', [ 'Transmissão de bens expedidos ou transportados para zona ou depósito mencionado em14(1)(a); bens, destino e regime identificados no documento ou pressuposto expresso. A indicação de loja franca por si não comprova esse destino: identifique a zona ou depósito aplicável a esta expedição', 'A colocação/introdução dos bens corresponde ao regime escolhido, sob controlo alfandegário e disposições especificamente aplicáveis de14(1)(a); não basta o endereço do destinatário ou o cadastro da zona', ], ), make( 'regime_dispatch_transport', 'Transporte directamente conexo à expedição para zona ou depósito', 'b', [ 'Prestação de serviço de transporte directamente conexa à transmissão de bens expedidos ou transportados para zona ou depósito de14(1)(a); transmissão, bens, destino e ligação concreta identificados. A indicação de loja franca por si não comprova esse destino: identifique a zona ou depósito aplicável a esta expedição', 'Regime de destino e disposições especificamente aplicáveis de14(1)(a) identificados; preço desta linha é apenas o transporte, sem duplicar o valor dos bens; não qualquer serviço ao destinatário', ], ), make( 'regime_internal_goods', 'Transmissão de bens dentro de regime de zona ou depósito', 'c', [ 'Transmissão de bens efectuada num regime de14(1)(a),com bens, regime e controlo/disposições aplicáveis identificados no documento ou pressuposto expresso', 'Os bens permanecem nessa situação no momento/período da operação; não saída do regime nem venda para consumo final na área', ], ), make( 'regime_internal_services', 'Serviço directamente conexo à transmissão de bens em regime', 'c', [ 'Prestação de serviços directamente conexa a transmissão de bens efectuada em regime de14(1)(a); bens, transmissão, regime e ligação concreta identificados, não qualquer serviço executado na zona', 'Os bens permanecem nessa situação no momento/período da operação; preço desta linha é apenas o serviço, sem duplicar o valor dos bens; não saída do regime nem consumo final', ], ), make( 'regime_transit_goods', 'Bens em trânsito, draubaque ou importação temporária', 'd', [ 'Transmissão de bens que se encontram no regime escolhido de trânsito, draubaque ou importação temporária; bens e enquadramento identificados no documento ou pressuposto expresso, não o próprio acto de importação', 'A operação continua considerada abrangida pelo regime no momento/período indicado; não regime terminado nem mera passagem geográfica dos bens', ], ), make( 'regime_transit_transport', 'Transporte directamente conexo a bens em trânsito, draubaque ou importação temporária', 'd', [ 'Prestação de serviço de transporte directamente conexa à transmissão de bens em trânsito, draubaque ou importação temporária; bens, operação e ligação concreta identificados', 'A operação continua abrangida pelo regime no momento/período indicado; preço desta linha é apenas o transporte, sem duplicar o valor dos bens; não transporte genérico nem regime terminado', ], ), ]; export function isSpecialRegime(id: string): boolean { return specialRegimeTreatments.some((rule) => rule.id === id); } export function specialRegimesFor( id: string, ): Array<(typeof specialRegimeOptions)[number]> { const allowed = id.startsWith('regime_transit_') ? transitRegimes : zoneRegimes; return isSpecialRegime(id) ? specialRegimeOptions.filter(([value]) => allowed.includes(value)) : []; } export function specialRegimeIssue(id: string, regime: unknown): string | null { if (!isSpecialRegime(id)) return null; if (!specialRegimesFor(id).some(([value]) => value === regime)) return 'Identifique o regime aplicável a esta operação do artigo14(1). Regime desconhecido ou de outra alínea não comprova isenção; a localização não o substitui. Conserve preço, moeda e período; apuramento indeterminado.'; return null; }