1360 lines
62 KiB
TypeScript
1360 lines
62 KiB
TypeScript
import { inputText } from './input-text.ts';
|
||
import { acquisitionScope } from './iva-acquisitions.ts';
|
||
import {
|
||
internationalShipEligibility,
|
||
internationalAircraftEligibility,
|
||
} from './iva-international-assets.ts';
|
||
|
||
type Choice = '' | 'yes' | 'no';
|
||
export const importExemptionVersion = 'import-exemptions/1';
|
||
export const importExemptionSource =
|
||
'CIVA republicado pela Lei13/2016, BR156/10.º suplemento, art.12(1)(d/f),PDF11/p.1426(269). Lei22/2022,PDF2/p.2252(26),mantém d/f; Lei10/2025,PDF12–13/p.2180(12–13),mantém d/f. Cobertura2026/MZN; classificação do IVA na importação,sem cálculo de direitos aduaneiros ou dedução no campo11.';
|
||
export const importBeneficiaryVersion = 'import-beneficiaries/1';
|
||
export const importBeneficiarySource =
|
||
'CIVA republicado pela Lei13/2016, BR156/10.º suplemento, art.12(1)(j/l),PDF11/p.1426(269). Lei22/2022,PDF2/p.2252(26),e Lei10/2025,PDF13/p.2180(13),mantêm j/l. Cobertura2026/MZN; importação de objectos de arte e veículo de combate a incêndios nas condições próprias,sem dedução no campo11 nem cálculo de direitos aduaneiros.';
|
||
export const importAssetVersion = 'import-assets/1';
|
||
export const importAssetSource =
|
||
'CIVA republicado pela Lei13/2016, BR156/10.º suplemento, art.12(1)(h/i),PDF11/p.1426(269),por referência a13(1)(f/g),PDF12/p.1426(270),e actividades de13(1)(c/d). Lei22/2022,PDF2/p.2252(26),e Lei10/2025,PDF13/p.2180(13),mantêm h/i;13 não alterado nesses diplomas. Cobertura2026/MZN; importação de embarcação/avião elegível ou objecto incorporado/utilizado na respectiva exploração,sem dedução no campo11,base aduaneira ou cálculo de direitos aduaneiros.';
|
||
export const importCustomsVersion = 'import-customs-regimes/1';
|
||
export const importCustomsSource =
|
||
'CIVA republicado pela Lei13/2016, BR156/10.º suplemento, art.12(1)(c),PDF11/p.1426(269): importações de bens nos regimes de trânsito, importação temporária ou draubaque que sejam isentas totalmente de direitos aduaneiros. Lei22/2022,PDF2/p.2252(26),e Lei10/2025,PDF13/p.2180(13),mantêm c) por remissão,sem nova redacção expandida neste recorte. Cobertura2026/MZN; classificação de IVA na importação,sem cálculo de direitos,base aduaneira,saída de regime ou dedução no campo11.';
|
||
export const importSpecialRegimeVersion = 'import-special-regimes/1';
|
||
export const importSpecialRegimeSource =
|
||
'CIVA republicado pela Lei13/2016, BR156/10.º suplemento, art.14(1)(a) e condição inicial14(1),PDF13/p.1426(271). Lei22/2022 e Lei10/2025 não alteram14 neste acervo. Importações sob controlo alfandegário e disposições especificamente aplicáveis, enquanto os bens permanecem nos regimes enumerados, sem utilização nem consumo finais nas áreas mencionadas. Cobertura2026/MZN; sem dedução/campo11, cálculo de direitos ou saída do regime.';
|
||
export const importSupplyVersion = 'import-onboard-supplies/1';
|
||
export const importSupplySource =
|
||
'CIVA republicado pela Lei13/2016,BR156/10.º suplemento,12(1)(g),12(3)(a)(i–iv)/(b),PDF11–12/p.1426(269–270),e definição13(3). Lei22/2022PDF2/p.2252(26) e Lei10/2025PDF13/p.2180(13) mantêm g/3 por remissão. Cobertura2026/MZN; abastecimentos importados na janela própria,consumidos ou a bordo de embarcação de navegação internacional marítima/fluvial/lacustre ou avião de navegação aérea internacional;exclusões próprias de provisões e depósitos normais. Sem exigir companhia principalmente internacional,sem dedução/campo11,direitos ou base aduaneira.';
|
||
export const importServiceVersion = 'import-included-services/1';
|
||
export const importInvestmentVersion = 'import-investment-equipment/1';
|
||
export const importDevelopmentVersion = 'import-un-development/1';
|
||
export const importDevelopmentSource =
|
||
'CIVA republicado Lei13/2016,12(2)(c),PDF11/p.1426(269): materiais/equipamentos de projectos de desenvolvimento financiados pelas agências e instituições especializadas das Nações Unidas,devidamente acreditadas junto do Governo Moçambicano,destinados exclusivamente à implementação dos projectos;isenção ou redução de IVA na mesma proporção da redução de direitos. Art12(4),PDF12/p.1426(270): despacho favorável do Ministro que superintende Finanças,requerimento prévio da entidade promotora com lista discriminada e plano de importações;concessão pelos serviços aduaneiros segundo o plano e após confronto com a lista aprovada. Lei22/2022PDF2–3 eLei10/2025PDF13 mantêm12(2)/4 por remissão. Cobertura2026/MZN;sem calcular direitos/base aduaneira/taxa normal ou dedução/campo11;pedido não equivale a concessão.';
|
||
export const importDevelopmentFields = [
|
||
['developmentProject', 'Projecto de desenvolvimento identificado'],
|
||
[
|
||
'developmentAgency',
|
||
'Agência ou instituição especializada das Nações Unidas e referência da acreditação',
|
||
],
|
||
[
|
||
'developmentDecisionRef',
|
||
'Despacho favorável / pressuposto expresso da projecção',
|
||
],
|
||
[
|
||
'developmentListRef',
|
||
'Lista discriminada aprovada / referência da previsão',
|
||
],
|
||
['developmentPlanRef', 'Plano de importações / referência da previsão'],
|
||
[
|
||
'developmentScope',
|
||
'Âmbito nesta importação: bens, operação, período e condições abrangidos',
|
||
],
|
||
[
|
||
'developmentRightsRef',
|
||
'Fundamento da isenção ou redução de direitos / pressuposto expresso',
|
||
],
|
||
] as const;
|
||
const developmentConditions = [
|
||
[
|
||
'developmentMaterials',
|
||
'Os bens desta importação são materiais ou equipamentos do projecto de desenvolvimento identificado',
|
||
],
|
||
[
|
||
'developmentUNFunding',
|
||
'O projecto é financiado pela agência ou instituição especializada das Nações Unidas identificada; não basta financiamento externo genérico',
|
||
],
|
||
[
|
||
'developmentAccredited',
|
||
'A agência ou instituição especializada identificada está devidamente acreditada junto do Governo Moçambicano',
|
||
],
|
||
[
|
||
'developmentExclusiveUse',
|
||
'Os materiais ou equipamentos destinam-se exclusivamente à implementação deste projecto',
|
||
],
|
||
[
|
||
'developmentFavourableDecision',
|
||
'Existe despacho favorável do Ministro que superintende a área de Finanças para este âmbito, ou esse despacho é pressuposto expresso da projecção; requerimento apresentado não equivale a decisão favorável',
|
||
],
|
||
[
|
||
'developmentPriorRequest',
|
||
'A entidade promotora apresentou requerimento prévio acompanhado de lista discriminada dos bens a importar e respectivo plano de importações, ou estes elementos são pressupostos expressos da projecção',
|
||
],
|
||
[
|
||
'developmentCustomsConformity',
|
||
'A concessão pelos serviços aduaneiros para esta importação segue o plano e o confronto com a lista aprovada no despacho, ou tal conformidade é pressuposto expresso da projecção; não se estende a outros bens ou operações',
|
||
],
|
||
] as const;
|
||
export const importInvestmentSource =
|
||
'CIVA republicado Lei13/2016,12(1)(k),PDF11/p.1426(269): importações de bens de equipamento classificados na classe K da Pauta Aduaneira destinados a investimentos em empreendimentos autorizados ao abrigo da Lei de Investimentos e respectivo Regulamento. Lei22/2022,PDF2/p.2252(26),e Lei10/2025,PDF13/p.2180(13),mantêm k por remissão. Cobertura2026/MZN; classificação do IVA desta importação nas condições próprias,sem conceder autorização de investimento,classificar automaticamente mercadorias,estender o âmbito da autorização,calcular direitos/base aduaneira ou dedução/campo11.';
|
||
export const importServiceSource =
|
||
'CIVA republicado Lei13/2016,12(1)(e),PDF11/p.1426(269): prestações de serviços cujo valor esteja incluído na base tributável da importação de bens,conforme16. Art16(1)/16(1)(b)/16(2),PDF14/p.1426(272): valor aduaneiro e despesas acessórias até primeiro destino,do documento de transporte ou,na falta,primeira ruptura de carga no interior do País. Lei22/2022PDF1–2 e Lei10/2025PDF12–13 mantêm e por remissão e não alteram16. Cobertura2026/MZN; IVA do serviço,sem calcular base aduaneira,direitos,IVA dos bens,dedução/campo11 ou rectificação automática de factura.';
|
||
export const importExemptionRules = [
|
||
{
|
||
id: 'un_development_exemption',
|
||
branch: 'P060',
|
||
label: 'Projecto de desenvolvimento ONU — isenção integral',
|
||
article: '12(2)(c)/12(4)',
|
||
conditions: [
|
||
...developmentConditions,
|
||
[
|
||
'developmentFullRightsExemption',
|
||
'Esta importação beneficia de isenção integral de direitos no fundamento identificado; uma redução parcial não equivale a isenção integral de IVA',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'un_development_reduction',
|
||
branch: 'P060',
|
||
label: 'Projecto de desenvolvimento ONU — redução proporcional',
|
||
article: '12(2)(c)/12(4)',
|
||
conditions: [
|
||
...developmentConditions,
|
||
[
|
||
'developmentRightsReduction',
|
||
'Esta importação beneficia da redução parcial de direitos na percentagem identificada; não é uma taxa aduaneira nem a fracção de direitos ainda a pagar',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'authorized_investment_equipment',
|
||
branch: 'P056',
|
||
label: 'Equipamento classe K para empreendimento autorizado',
|
||
article: '12(1)(k)',
|
||
conditions: [
|
||
[
|
||
'investmentEquipment',
|
||
'Os bens importados são bens de equipamento; não basta uma compra de materiais, consumíveis ou serviços para um investimento',
|
||
],
|
||
[
|
||
'investmentClassK',
|
||
'Os bens de equipamento identificados estão classificados na classe K da Pauta Aduaneira; uma descrição genérica ou código isolado não é classificação automática pelo portal',
|
||
],
|
||
[
|
||
'investmentAuthorized',
|
||
'O empreendimento está autorizado ao abrigo da Lei de Investimentos e respectivo Regulamento; a referência identifica a autorização aplicável ou o pressuposto expresso da projecção, não apenas um pedido apresentado',
|
||
],
|
||
[
|
||
'investmentDestination',
|
||
'Estes bens destinam-se ao investimento no empreendimento autorizado identificado; a operação, período e condições correspondem ao âmbito aplicável da autorização, sem o estender automaticamente a outros bens ou operações',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'service_in_customs_value',
|
||
branch: 'P050',
|
||
label: 'Serviço já compreendido no valor aduaneiro',
|
||
article: '12(1)(e)',
|
||
conditions: [
|
||
[
|
||
'serviceImportLinked',
|
||
'A prestação está ligada à importação de bens identificada na referência própria; não basta tratar-se de serviço prestado a um importador',
|
||
],
|
||
[
|
||
'serviceFullValueIncluded',
|
||
'O valor integral do serviço desta linha está incluído na base tributável da importação identificada, nos termos do artigo16; documento ou pressuposto discrimina a inclusão, não apenas a intenção de a incluir',
|
||
],
|
||
[
|
||
'serviceInCustomsValue',
|
||
'O valor deste serviço já está compreendido no valor aduaneiro que integra a base do artigo16(1); não é uma nova parcela a somar pelo simulador',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'accessory_service_first_destination',
|
||
branch: 'P050',
|
||
label: 'Serviço acessório até ao primeiro destino',
|
||
article: '12(1)(e)',
|
||
conditions: [
|
||
[
|
||
'serviceImportLinked',
|
||
'A prestação está ligada à importação de bens identificada na referência própria; não basta tratar-se de serviço prestado a um importador',
|
||
],
|
||
[
|
||
'serviceFullValueIncluded',
|
||
'O valor integral do serviço desta linha está incluído na base tributável da importação identificada, nos termos do artigo16; documento ou pressuposto discrimina a inclusão, não apenas a intenção de a incluir',
|
||
],
|
||
[
|
||
'serviceAccessoryCost',
|
||
'O serviço é uma despesa acessória da importação (embalagem, transporte, seguro ou outro encargo) adicionada à base por ainda não estar compreendida no valor aduaneiro, conforme16(1)(b)',
|
||
],
|
||
[
|
||
'serviceToFirstDestination',
|
||
'A despesa verifica-se até ao primeiro lugar de destino no interior do País: o constante do documento de transporte ou, na sua falta, o local da primeira ruptura de carga no interior do País, conforme16(2); destino e percurso identificados no fundamento',
|
||
],
|
||
],
|
||
},
|
||
|
||
{
|
||
id: 'ship_provisions_import',
|
||
branch: 'P052',
|
||
label: 'Embarcação internacional — Provisões de bordo',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalShip',
|
||
'A embarcação identificada efectua navegação marítima, fluvial ou lacustre internacional; não basta pertencer a uma empresa marítima',
|
||
],
|
||
[
|
||
'supplyProvisions',
|
||
'São provisões de bordo: produtos destinados exclusivamente ao consumo da tripulação e dos passageiros',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
[
|
||
'supplyNoDismantleOtherUse',
|
||
'As provisões não se encontram em embarcação a desmantelar ou utilizada para fins diferentes da navegação internacional, durante essa situação',
|
||
],
|
||
[
|
||
'supplyNoFloatingHospitality',
|
||
'As provisões não se encontram em embarcação utilizada em hotel, restaurante, sala de jogos flutuante ou fim semelhante, durante permanência em porto ou águas territoriais/interiores nacionais',
|
||
],
|
||
[
|
||
'supplyNoRecreation',
|
||
'As provisões não se encontram em embarcação de recreio durante permanência em porto ou águas territoriais/interiores nacionais',
|
||
],
|
||
[
|
||
'supplyNoCoastalFishing',
|
||
'As provisões não se encontram em embarcação de pesca costeira',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'ship_fuel_import',
|
||
branch: 'P052',
|
||
label: 'Embarcação internacional — Combustíveis ou carburantes',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalShip',
|
||
'A embarcação identificada efectua navegação marítima, fluvial ou lacustre internacional; não basta pertencer a uma empresa marítima',
|
||
],
|
||
[
|
||
'supplyFuel',
|
||
'São combustíveis ou carburantes destinados ao funcionamento das máquinas de propulsão ou de outros aparelhos de uso técnico instalados a bordo',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
[
|
||
'supplyNormalTanks',
|
||
'Os combustíveis/carburantes importados são os contidos nos depósitos normais; depósitos suplementares ou externos não cumprem esta condição',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'ship_technical_products_import',
|
||
branch: 'P052',
|
||
label: 'Embarcação internacional — Lubrificantes e outros produtos de funcionamento técnico',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalShip',
|
||
'A embarcação identificada efectua navegação marítima, fluvial ou lacustre internacional; não basta pertencer a uma empresa marítima',
|
||
],
|
||
[
|
||
'supplyTechnicalProducts',
|
||
'São lubrificantes ou outros produtos, distintos dos combustíveis/carburantes, destinados ao funcionamento das máquinas de propulsão ou de outros aparelhos de uso técnico instalados a bordo',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'ship_cargo_accessories_import',
|
||
branch: 'P052',
|
||
label: 'Embarcação internacional — Produtos acessórios para mercadorias transportadas',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalShip',
|
||
'A embarcação identificada efectua navegação marítima, fluvial ou lacustre internacional; não basta pertencer a uma empresa marítima',
|
||
],
|
||
[
|
||
'supplyCargoAccessories',
|
||
'São produtos acessórios destinados à preparação, tratamento e conservação das mercadorias transportadas a bordo',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'aircraft_provisions_import',
|
||
branch: 'P052',
|
||
label: 'Avião internacional — Provisões de bordo',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalAircraft',
|
||
'O avião identificado efectua navegação aérea internacional; não se exige que a companhia se dedique principalmente ao tráfego internacional neste ramo',
|
||
],
|
||
[
|
||
'supplyProvisions',
|
||
'São provisões de bordo: produtos destinados exclusivamente ao consumo da tripulação e dos passageiros',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'aircraft_fuel_import',
|
||
branch: 'P052',
|
||
label: 'Avião internacional — Combustíveis ou carburantes',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalAircraft',
|
||
'O avião identificado efectua navegação aérea internacional; não se exige que a companhia se dedique principalmente ao tráfego internacional neste ramo',
|
||
],
|
||
[
|
||
'supplyFuel',
|
||
'São combustíveis ou carburantes destinados ao funcionamento das máquinas de propulsão ou de outros aparelhos de uso técnico instalados a bordo',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
[
|
||
'supplyNormalTanks',
|
||
'Os combustíveis/carburantes importados são os contidos nos depósitos normais; depósitos suplementares ou externos não cumprem esta condição',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'aircraft_technical_products_import',
|
||
branch: 'P052',
|
||
label: 'Avião internacional — Lubrificantes e outros produtos de funcionamento técnico',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalAircraft',
|
||
'O avião identificado efectua navegação aérea internacional; não se exige que a companhia se dedique principalmente ao tráfego internacional neste ramo',
|
||
],
|
||
[
|
||
'supplyTechnicalProducts',
|
||
'São lubrificantes ou outros produtos, distintos dos combustíveis/carburantes, destinados ao funcionamento das máquinas de propulsão ou de outros aparelhos de uso técnico instalados a bordo',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'aircraft_cargo_accessories_import',
|
||
branch: 'P052',
|
||
label: 'Avião internacional — Produtos acessórios para mercadorias transportadas',
|
||
article: '12(1)(g)',
|
||
conditions: [
|
||
[
|
||
'supplyInternationalAircraft',
|
||
'O avião identificado efectua navegação aérea internacional; não se exige que a companhia se dedique principalmente ao tráfego internacional neste ramo',
|
||
],
|
||
[
|
||
'supplyCargoAccessories',
|
||
'São produtos acessórios destinados à preparação, tratamento e conservação das mercadorias transportadas a bordo',
|
||
],
|
||
[
|
||
'supplyImportWindow',
|
||
'Os bens são importados desde a entrada no território nacional até à chegada ao porto ou aeroporto nacionais de destino, ou durante a permanência nesses locais pelo período normal necessário ao cumprimento das tarefas; trajecto e datas constam do fundamento',
|
||
],
|
||
[
|
||
'supplyOnboard',
|
||
'Os bens importados são consumidos ou encontram-se a bordo da embarcação ou avião identificados no fundamento factual',
|
||
],
|
||
],
|
||
},
|
||
|
||
{
|
||
id: 'special_economic_zone_import',
|
||
branch: 'P080',
|
||
label: 'Importação — Zona económica especial',
|
||
article: '14(1)(a)',
|
||
conditions: [
|
||
[
|
||
'specialEconomicZone',
|
||
'Os bens importados são colocados no regime de zona económica especial identificado no documento; a localização geográfica, por si só, não comprova o regime',
|
||
],
|
||
[
|
||
'specialCustomsControl',
|
||
'Esta importação encontra-se sob controlo alfandegário',
|
||
],
|
||
[
|
||
'specialApplicableProvisions',
|
||
'A importação está sujeita às disposições especificamente aplicáveis ao regime identificado; indicar no fundamento factual o regime e documento aplicáveis',
|
||
],
|
||
[
|
||
'specialRegimePermanence',
|
||
'Os bens permanecem sob o regime identificado no período desta classificação',
|
||
],
|
||
[
|
||
'specialNoFinalUseConsumption',
|
||
'Os bens não têm utilização nem consumo finais nas áreas mencionadas no regime',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'free_zone_import',
|
||
branch: 'P080',
|
||
label: 'Importação — Zona franca',
|
||
article: '14(1)(a)',
|
||
conditions: [
|
||
[
|
||
'freeZone',
|
||
'Os bens importados são colocados no regime de zona franca identificado no documento',
|
||
],
|
||
[
|
||
'specialCustomsControl',
|
||
'Esta importação encontra-se sob controlo alfandegário',
|
||
],
|
||
[
|
||
'specialApplicableProvisions',
|
||
'A importação está sujeita às disposições especificamente aplicáveis ao regime identificado; indicar no fundamento factual o regime e documento aplicáveis',
|
||
],
|
||
[
|
||
'specialRegimePermanence',
|
||
'Os bens permanecem sob o regime identificado no período desta classificação',
|
||
],
|
||
[
|
||
'specialNoFinalUseConsumption',
|
||
'Os bens não têm utilização nem consumo finais nas áreas mencionadas no regime',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'free_warehouse_import',
|
||
branch: 'P080',
|
||
label: 'Importação — Depósito franco',
|
||
article: '14(1)(a)',
|
||
conditions: [
|
||
[
|
||
'freeWarehouse',
|
||
'Os bens importados são colocados no regime de depósito franco identificado no documento',
|
||
],
|
||
[
|
||
'specialCustomsControl',
|
||
'Esta importação encontra-se sob controlo alfandegário',
|
||
],
|
||
[
|
||
'specialApplicableProvisions',
|
||
'A importação está sujeita às disposições especificamente aplicáveis ao regime identificado; indicar no fundamento factual o regime e documento aplicáveis',
|
||
],
|
||
[
|
||
'specialRegimePermanence',
|
||
'Os bens permanecem sob o regime identificado no período desta classificação',
|
||
],
|
||
[
|
||
'specialNoFinalUseConsumption',
|
||
'Os bens não têm utilização nem consumo finais nas áreas mencionadas no regime',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'general_free_warehouse_import',
|
||
branch: 'P080',
|
||
label: 'Importação — Depósito geral franco',
|
||
article: '14(1)(a)',
|
||
conditions: [
|
||
[
|
||
'generalFreeWarehouse',
|
||
'Os bens importados são colocados no regime de depósito geral franco identificado no documento',
|
||
],
|
||
[
|
||
'specialCustomsControl',
|
||
'Esta importação encontra-se sob controlo alfandegário',
|
||
],
|
||
[
|
||
'specialApplicableProvisions',
|
||
'A importação está sujeita às disposições especificamente aplicáveis ao regime identificado; indicar no fundamento factual o regime e documento aplicáveis',
|
||
],
|
||
[
|
||
'specialRegimePermanence',
|
||
'Os bens permanecem sob o regime identificado no período desta classificação',
|
||
],
|
||
[
|
||
'specialNoFinalUseConsumption',
|
||
'Os bens não têm utilização nem consumo finais nas áreas mencionadas no regime',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'customs_warehouse_import',
|
||
branch: 'P080',
|
||
label: 'Importação — Depósito de regime aduaneiro',
|
||
article: '14(1)(a)',
|
||
conditions: [
|
||
[
|
||
'customsWarehouse',
|
||
'Os bens importados são introduzidos no depósito de regime aduaneiro identificado no documento',
|
||
],
|
||
[
|
||
'specialCustomsControl',
|
||
'Esta importação encontra-se sob controlo alfandegário',
|
||
],
|
||
[
|
||
'specialApplicableProvisions',
|
||
'A importação está sujeita às disposições especificamente aplicáveis ao regime identificado; indicar no fundamento factual o regime e documento aplicáveis',
|
||
],
|
||
[
|
||
'specialRegimePermanence',
|
||
'Os bens permanecem sob o regime identificado no período desta classificação',
|
||
],
|
||
[
|
||
'specialNoFinalUseConsumption',
|
||
'Os bens não têm utilização nem consumo finais nas áreas mencionadas no regime',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'duty_free_shop_import',
|
||
branch: 'P080',
|
||
label: 'Importação — Loja franca',
|
||
article: '14(1)(a)',
|
||
conditions: [
|
||
[
|
||
'dutyFreeShop',
|
||
'Os bens importados são introduzidos na loja franca identificada no documento',
|
||
],
|
||
[
|
||
'specialCustomsControl',
|
||
'Esta importação encontra-se sob controlo alfandegário',
|
||
],
|
||
[
|
||
'specialApplicableProvisions',
|
||
'A importação está sujeita às disposições especificamente aplicáveis ao regime identificado; indicar no fundamento factual o regime e documento aplicáveis',
|
||
],
|
||
[
|
||
'specialRegimePermanence',
|
||
'Os bens permanecem sob o regime identificado no período desta classificação',
|
||
],
|
||
[
|
||
'specialNoFinalUseConsumption',
|
||
'Os bens não têm utilização nem consumo finais nas áreas mencionadas no regime',
|
||
],
|
||
],
|
||
},
|
||
|
||
{
|
||
id: 'reimport_same_state',
|
||
branch: 'P049',
|
||
label: 'Reimportação por quem exportou, no mesmo estado',
|
||
article: '12(1)(d)',
|
||
conditions: [
|
||
[
|
||
'sameExporter',
|
||
'A reimportação é efectuada por quem exportou os bens',
|
||
],
|
||
[
|
||
'sameState',
|
||
'Os bens regressam no mesmo estado em que foram exportados',
|
||
],
|
||
[
|
||
'customsExempt',
|
||
'Esta reimportação beneficia de isenção de direitos aduaneiros',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'central_bank_gold',
|
||
branch: 'P051',
|
||
label: 'Importação de ouro pelo Banco de Moçambique',
|
||
article: '12(1)(f)',
|
||
conditions: [
|
||
['gold', 'Os bens importados são ouro'],
|
||
[
|
||
'centralBank',
|
||
'A importação é efectuada pelo Banco de Moçambique',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'author_art_import',
|
||
branch: 'P055',
|
||
label: 'Objectos de arte pelos artistas-autores, herdeiros ou legatários',
|
||
article: '12(1)(j)',
|
||
conditions: [
|
||
['artObjects', 'Os bens importados são objectos de arte'],
|
||
[
|
||
'eligibleArtImporter',
|
||
'A importação é efectuada pelos próprios artistas-autores, residentes no território nacional, seus herdeiros ou legatários; a identidade, residência e relação aplicáveis estão identificadas no fundamento factual',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'fire_brigade_vehicle',
|
||
branch: 'P057',
|
||
label: 'Veículo de combate a incêndios por corporação de bombeiros',
|
||
article: '12(1)(l)',
|
||
conditions: [
|
||
[
|
||
'fireVehicle',
|
||
'O bem importado é um veículo de combate a incêndios',
|
||
],
|
||
[
|
||
'fireBrigade',
|
||
'A importação é efectuada por uma corporação de bombeiros',
|
||
],
|
||
[
|
||
'exclusiveOwnUse',
|
||
'O veículo destina-se exclusivamente a ser utilizado na actividade própria da corporação',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'eligible_ship_import',
|
||
branch: 'P053',
|
||
label: 'Importação de embarcação elegível',
|
||
article: '12(1)(h)',
|
||
conditions: [
|
||
['eligibleShip', internationalShipEligibility],
|
||
[
|
||
'importedShip',
|
||
'O bem importado é a própria embarcação elegível identificada; não um serviço nem qualquer bem adquirido pelo operador',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'ship_operation_object_import',
|
||
branch: 'P053',
|
||
label: 'Importação de objecto incorporado ou utilizado na exploração de embarcação elegível',
|
||
article: '12(1)(h)',
|
||
conditions: [
|
||
['eligibleShip', internationalShipEligibility],
|
||
[
|
||
'shipObjectLink',
|
||
'O objecto importado está incorporado na embarcação elegível identificada ou é utilizado na sua exploração; objecto, embarcação e ligação concreta identificados no documento ou pressuposto, não um fornecimento genérico ao operador',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'eligible_aircraft_import',
|
||
branch: 'P054',
|
||
label: 'Importação de avião de companhia principalmente internacional',
|
||
article: '12(1)(i)',
|
||
conditions: [
|
||
['eligibleAircraft', internationalAircraftEligibility],
|
||
[
|
||
'importedAircraft',
|
||
'O bem importado é o próprio avião elegível identificado; não um serviço nem qualquer bem adquirido pela companhia',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'aircraft_operation_object_import',
|
||
branch: 'P054',
|
||
label: 'Importação de objecto incorporado ou utilizado na exploração de avião elegível',
|
||
article: '12(1)(i)',
|
||
conditions: [
|
||
['eligibleAircraft', internationalAircraftEligibility],
|
||
[
|
||
'aircraftObjectLink',
|
||
'O objecto importado está incorporado no avião elegível identificado ou é utilizado na sua exploração; objecto, avião e ligação concreta identificados no documento ou pressuposto, não um fornecimento genérico à companhia',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'customs_transit_import',
|
||
branch: 'P048',
|
||
label: 'Importação de bens em trânsito com isenção total de direitos',
|
||
article: '12(1)(c)',
|
||
conditions: [
|
||
[
|
||
'customsTransit',
|
||
'Os bens identificados são importados sob regime de trânsito; regime e operação constam do documento ou pressuposto expresso, não apenas passagem geográfica',
|
||
],
|
||
[
|
||
'fullCustomsExemption',
|
||
'Esta importação beneficia de isenção total de direitos aduaneiros, identificada no fundamento factual; redução parcial ou mera suspensão não comprovam esta condição',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'customs_temporary_import',
|
||
branch: 'P048',
|
||
label: 'Importação temporária de bens com isenção total de direitos',
|
||
article: '12(1)(c)',
|
||
conditions: [
|
||
[
|
||
'customsTemporary',
|
||
'Os bens identificados são importados sob regime de importação temporária; regime e operação constam do documento ou pressuposto expresso, não apenas intenção de utilização temporária',
|
||
],
|
||
[
|
||
'fullCustomsExemption',
|
||
'Esta importação beneficia de isenção total de direitos aduaneiros, identificada no fundamento factual; redução parcial ou mera suspensão não comprovam esta condição',
|
||
],
|
||
],
|
||
},
|
||
{
|
||
id: 'customs_drawback_import',
|
||
branch: 'P048',
|
||
label: 'Importação de bens em draubaque com isenção total de direitos',
|
||
article: '12(1)(c)',
|
||
conditions: [
|
||
[
|
||
'customsDrawback',
|
||
'Os bens identificados são importados sob regime de draubaque; regime e operação constam do documento ou pressuposto expresso, não qualquer promessa de restituição futura',
|
||
],
|
||
[
|
||
'fullCustomsExemption',
|
||
'Esta importação beneficia de isenção total de direitos aduaneiros, identificada no fundamento factual; redução parcial ou mera suspensão não comprovam esta condição',
|
||
],
|
||
],
|
||
},
|
||
] as const;
|
||
type Condition =
|
||
| 'developmentMaterials'
|
||
| 'developmentUNFunding'
|
||
| 'developmentAccredited'
|
||
| 'developmentExclusiveUse'
|
||
| 'developmentFavourableDecision'
|
||
| 'developmentPriorRequest'
|
||
| 'developmentCustomsConformity'
|
||
| 'developmentFullRightsExemption'
|
||
| 'developmentRightsReduction'
|
||
| 'investmentEquipment'
|
||
| 'investmentClassK'
|
||
| 'investmentAuthorized'
|
||
| 'investmentDestination'
|
||
| 'serviceImportLinked'
|
||
| 'serviceFullValueIncluded'
|
||
| 'serviceInCustomsValue'
|
||
| 'serviceAccessoryCost'
|
||
| 'serviceToFirstDestination'
|
||
| 'supplyCargoAccessories'
|
||
| 'supplyFuel'
|
||
| 'supplyImportWindow'
|
||
| 'supplyInternationalAircraft'
|
||
| 'supplyInternationalShip'
|
||
| 'supplyNoCoastalFishing'
|
||
| 'supplyNoDismantleOtherUse'
|
||
| 'supplyNoFloatingHospitality'
|
||
| 'supplyNoRecreation'
|
||
| 'supplyNormalTanks'
|
||
| 'supplyOnboard'
|
||
| 'supplyProvisions'
|
||
| 'supplyTechnicalProducts'
|
||
| 'specialEconomicZone'
|
||
| 'freeZone'
|
||
| 'freeWarehouse'
|
||
| 'generalFreeWarehouse'
|
||
| 'customsWarehouse'
|
||
| 'dutyFreeShop'
|
||
| 'specialCustomsControl'
|
||
| 'specialApplicableProvisions'
|
||
| 'specialRegimePermanence'
|
||
| 'specialNoFinalUseConsumption'
|
||
| 'sameExporter'
|
||
| 'sameState'
|
||
| 'customsExempt'
|
||
| 'gold'
|
||
| 'centralBank'
|
||
| 'artObjects'
|
||
| 'eligibleArtImporter'
|
||
| 'fireVehicle'
|
||
| 'fireBrigade'
|
||
| 'exclusiveOwnUse'
|
||
| 'eligibleShip'
|
||
| 'importedShip'
|
||
| 'shipObjectLink'
|
||
| 'eligibleAircraft'
|
||
| 'importedAircraft'
|
||
| 'aircraftObjectLink'
|
||
| 'customsTransit'
|
||
| 'customsTemporary'
|
||
| 'customsDrawback'
|
||
| 'fullCustomsExemption';
|
||
function beneficiaryImport(id: string): boolean {
|
||
return id === 'author_art_import' || id === 'fire_brigade_vehicle';
|
||
}
|
||
function assetImport(id: string): boolean {
|
||
return [
|
||
'eligible_ship_import',
|
||
'ship_operation_object_import',
|
||
'eligible_aircraft_import',
|
||
'aircraft_operation_object_import',
|
||
].includes(id);
|
||
}
|
||
function customsImport(id: string): boolean {
|
||
return [
|
||
'customs_transit_import',
|
||
'customs_temporary_import',
|
||
'customs_drawback_import',
|
||
].includes(id);
|
||
}
|
||
function specialRegimeImport(id: string): boolean {
|
||
return [
|
||
'special_economic_zone_import',
|
||
'free_zone_import',
|
||
'free_warehouse_import',
|
||
'general_free_warehouse_import',
|
||
'customs_warehouse_import',
|
||
'duty_free_shop_import',
|
||
].includes(id);
|
||
}
|
||
function supplyImport(id: string): boolean {
|
||
return [
|
||
'ship_provisions_import',
|
||
'ship_fuel_import',
|
||
'ship_technical_products_import',
|
||
'ship_cargo_accessories_import',
|
||
'aircraft_provisions_import',
|
||
'aircraft_fuel_import',
|
||
'aircraft_technical_products_import',
|
||
'aircraft_cargo_accessories_import',
|
||
].includes(id);
|
||
}
|
||
export function isImportService(id: string): boolean {
|
||
return [
|
||
'service_in_customs_value',
|
||
'accessory_service_first_destination',
|
||
].includes(id);
|
||
}
|
||
export function isDevelopmentImport(id: string): boolean {
|
||
return ['un_development_exemption', 'un_development_reduction'].includes(
|
||
id,
|
||
);
|
||
}
|
||
export function importRuleSource(id: string): string {
|
||
return isDevelopmentImport(id)
|
||
? importDevelopmentSource
|
||
: id === 'authorized_investment_equipment'
|
||
? importInvestmentSource
|
||
: isImportService(id)
|
||
? importServiceSource
|
||
: supplyImport(id)
|
||
? importSupplySource
|
||
: specialRegimeImport(id)
|
||
? importSpecialRegimeSource
|
||
: customsImport(id)
|
||
? importCustomsSource
|
||
: assetImport(id)
|
||
? importAssetSource
|
||
: beneficiaryImport(id)
|
||
? importBeneficiarySource
|
||
: importExemptionSource;
|
||
}
|
||
export type ImportExemptionRow = {
|
||
id: string;
|
||
treatment: string;
|
||
description: string;
|
||
period: string;
|
||
origin: 'projected' | 'effective';
|
||
currency: string;
|
||
declaredValue: string;
|
||
goodsCode: string;
|
||
originCountry: string;
|
||
importer: string;
|
||
documentRef: string;
|
||
documentDate: string;
|
||
evidence: string;
|
||
conditions: Partial<Record<Condition, Choice>>;
|
||
serviceImportRef?: string;
|
||
serviceBaseRef?: string;
|
||
serviceFirstDestination?: string;
|
||
serviceProvider?: string;
|
||
investmentAuthorizationRef?: string;
|
||
investmentScope?: string;
|
||
} & Partial<
|
||
Record<
|
||
| (typeof importDevelopmentFields)[number][0]
|
||
| 'developmentReductionPercent'
|
||
| 'developmentNormalVat'
|
||
| 'developmentNormalVatRef',
|
||
string
|
||
>
|
||
>;
|
||
type ImportResult = {
|
||
id: string;
|
||
status: 'exempt' | 'reduced' | 'not_applicable' | 'indeterminate';
|
||
importVat: string | null;
|
||
serviceVat?: string | null;
|
||
reason: string;
|
||
};
|
||
export type ImportExemptionCalculation = {
|
||
version: string;
|
||
revision: number;
|
||
calculatedAt: string;
|
||
opportunity: string;
|
||
location: string;
|
||
sourceKey: string;
|
||
source: string;
|
||
inputs: ImportExemptionRow[];
|
||
rows: ImportResult[];
|
||
};
|
||
export type ImportExemptionBook = {
|
||
rows: ImportExemptionRow[];
|
||
result?: ImportExemptionCalculation;
|
||
history?: ImportExemptionCalculation[];
|
||
};
|
||
type Store = {
|
||
version: 1;
|
||
books: Record<string, unknown>;
|
||
importExemptions?: Record<string, ImportExemptionBook>;
|
||
[key: string]: unknown;
|
||
};
|
||
function store(draft: Record<string, unknown>): Store {
|
||
const value: Store = draft.modelo_a_snapshot
|
||
? JSON.parse(inputText(draft.modelo_a_snapshot))
|
||
: { version: 1, books: {} };
|
||
if (
|
||
value?.version !== 1 ||
|
||
!value.books ||
|
||
typeof value.books !== 'object' ||
|
||
Array.isArray(value.books)
|
||
)
|
||
throw new Error(
|
||
'Dados fiscais não recuperáveis; originais preservados, sem substituição.',
|
||
);
|
||
if (
|
||
value.importExemptions !== undefined &&
|
||
(!value.importExemptions ||
|
||
typeof value.importExemptions !== 'object' ||
|
||
Array.isArray(value.importExemptions))
|
||
)
|
||
throw new Error(
|
||
'Importações guardadas não recuperáveis; originais preservados.',
|
||
);
|
||
for (const book of Object.values(value.importExemptions ?? {})) {
|
||
if (
|
||
Array.isArray(book?.rows) &&
|
||
book.rows.some(
|
||
(row) =>
|
||
row &&
|
||
[
|
||
...importDevelopmentFields.map(([key]) => key),
|
||
'developmentReductionPercent',
|
||
'developmentNormalVat',
|
||
'developmentNormalVatRef',
|
||
].some(
|
||
(key) =>
|
||
row[key as keyof ImportExemptionRow] !==
|
||
undefined &&
|
||
typeof row[key as keyof ImportExemptionRow] !==
|
||
'string',
|
||
),
|
||
)
|
||
)
|
||
throw new Error(
|
||
'Referências do projecto de desenvolvimento não recuperáveis; originais preservados.',
|
||
);
|
||
if (
|
||
Array.isArray(book?.rows) &&
|
||
book.rows.some(
|
||
(row) =>
|
||
row &&
|
||
['investmentAuthorizationRef', 'investmentScope'].some(
|
||
(key) =>
|
||
row[key as keyof ImportExemptionRow] !==
|
||
undefined &&
|
||
typeof row[key as keyof ImportExemptionRow] !==
|
||
'string',
|
||
),
|
||
)
|
||
)
|
||
throw new Error(
|
||
'Referências do investimento não recuperáveis; originais preservados.',
|
||
);
|
||
if (
|
||
Array.isArray(book?.rows) &&
|
||
book.rows.some(
|
||
(row) =>
|
||
row &&
|
||
[
|
||
'serviceImportRef',
|
||
'serviceBaseRef',
|
||
'serviceFirstDestination',
|
||
'serviceProvider',
|
||
].some(
|
||
(key) =>
|
||
row[key as keyof ImportExemptionRow] !==
|
||
undefined &&
|
||
typeof row[key as keyof ImportExemptionRow] !==
|
||
'string',
|
||
),
|
||
)
|
||
)
|
||
throw new Error(
|
||
'Referências do serviço associado à importação não recuperáveis; originais preservados.',
|
||
);
|
||
if (
|
||
!book ||
|
||
!Array.isArray(book.rows) ||
|
||
(book.history !== undefined && !Array.isArray(book.history)) ||
|
||
book.rows.some(
|
||
(row) =>
|
||
!row ||
|
||
[
|
||
'id',
|
||
'treatment',
|
||
'description',
|
||
'period',
|
||
'origin',
|
||
'currency',
|
||
'declaredValue',
|
||
'goodsCode',
|
||
'originCountry',
|
||
'importer',
|
||
'documentRef',
|
||
'documentDate',
|
||
'evidence',
|
||
].some(
|
||
(k) =>
|
||
typeof row[k as keyof ImportExemptionRow] !==
|
||
'string',
|
||
) ||
|
||
!row.conditions ||
|
||
typeof row.conditions !== 'object' ||
|
||
Array.isArray(row.conditions),
|
||
)
|
||
)
|
||
throw new Error(
|
||
'Linhas de importação não recuperáveis; sem substituição por lista vazia.',
|
||
);
|
||
}
|
||
return value;
|
||
}
|
||
export function importExemptionBook(
|
||
draft: Record<string, unknown>,
|
||
): ImportExemptionBook {
|
||
return (
|
||
store(draft).importExemptions?.[acquisitionScope(draft)] ?? { rows: [] }
|
||
);
|
||
}
|
||
export function saveImportExemptionBook(
|
||
draft: Record<string, unknown>,
|
||
book: ImportExemptionBook,
|
||
): string {
|
||
const current = store(draft),
|
||
encoded = JSON.stringify({
|
||
...current,
|
||
importExemptions: {
|
||
...current.importExemptions,
|
||
[acquisitionScope(draft)]: book,
|
||
},
|
||
});
|
||
store({ ...draft, modelo_a_snapshot: encoded });
|
||
return encoded;
|
||
}
|
||
export function newImportExemption(
|
||
id: string,
|
||
currency: string,
|
||
): ImportExemptionRow {
|
||
return {
|
||
id,
|
||
treatment: '',
|
||
description: '',
|
||
period: '',
|
||
origin: 'projected',
|
||
currency,
|
||
declaredValue: '',
|
||
goodsCode: '',
|
||
originCountry: '',
|
||
importer: '',
|
||
documentRef: '',
|
||
documentDate: '',
|
||
evidence: '',
|
||
conditions: {},
|
||
};
|
||
}
|
||
function validDate(value: string): boolean {
|
||
const d = new Date(value + 'T00:00:00Z');
|
||
return (
|
||
/^\d{4}-\d{2}-\d{2}$/.test(value) &&
|
||
Number.isFinite(d.getTime()) &&
|
||
d.toISOString().slice(0, 10) === value
|
||
);
|
||
}
|
||
export function evaluateImportExemption(
|
||
row: ImportExemptionRow,
|
||
currency: unknown,
|
||
): ImportResult {
|
||
const result: ImportResult = {
|
||
id: row.id,
|
||
status: 'indeterminate',
|
||
importVat: null,
|
||
reason: '',
|
||
...(isImportService(row.treatment) ? { serviceVat: null } : {}),
|
||
};
|
||
const stop = (
|
||
reason: string,
|
||
status: ImportResult['status'] = 'indeterminate',
|
||
) => ({ ...result, status, reason });
|
||
const rule = importExemptionRules.find((r) => r.id === row.treatment);
|
||
if (!rule)
|
||
return stop(
|
||
'Escolha o ramo aplicável; referência desconhecida ou em falta não concede isenção.',
|
||
);
|
||
if (currency !== 'MZN' || row.currency !== currency)
|
||
return stop(
|
||
'Moeda fora do âmbito MZN ou divergente do projecto; valores conservados, sem conversão.',
|
||
);
|
||
if (!/^2026-(0[1-9]|1[0-2])$/.test(row.period))
|
||
return stop(
|
||
isImportService(row.treatment)
|
||
? 'Indique o período do serviço em2026; a importação é identificada separadamente, sem inferir o mês do orçamento.'
|
||
: 'Indique o período da importação em2026; não é inferido do mês do orçamento.',
|
||
);
|
||
if (!['projected', 'effective'].includes(row.origin))
|
||
return stop('Indique dados efectivos ou pressupostos de projecção.');
|
||
const failed = rule.conditions.filter(
|
||
([key]) => row.conditions[key] === 'no',
|
||
);
|
||
if (failed.length)
|
||
return stop(
|
||
'Não se aplica esta isenção: ' +
|
||
failed.map(([, label]) => label).join('; ') +
|
||
'. O IVA fora deste fundamento permanece por enquadrar, sem taxa presumida.',
|
||
'not_applicable',
|
||
);
|
||
const missing = rule.conditions.filter(
|
||
([key]) => row.conditions[key] !== 'yes',
|
||
);
|
||
if (missing.length)
|
||
return stop(
|
||
'Condições por indicar: ' +
|
||
missing.map(([, label]) => label).join('; ') +
|
||
'. Desconhecido não significa não aplicável nem IVA zero.',
|
||
);
|
||
if (
|
||
isDevelopmentImport(row.treatment) &&
|
||
importDevelopmentFields.some(([key]) => !row[key]?.trim())
|
||
)
|
||
return stop(
|
||
'Identifique projecto, agência/acreditação, despacho favorável, lista aprovada, plano, âmbito desta importação e fundamento aduaneiro, ou os pressupostos expressos da projecção. Reutilize as referências documentais disponíveis; não é exigido novo certificado.',
|
||
);
|
||
if (
|
||
row.treatment === 'authorized_investment_equipment' &&
|
||
(!row.investmentAuthorizationRef?.trim() ||
|
||
!row.investmentScope?.trim())
|
||
)
|
||
return stop(
|
||
'Identifique a autorização aplicável ao empreendimento e o seu âmbito nesta importação, ou os pressupostos expressos da projecção. Um pedido em preparação ou apresentado não equivale a autorização.',
|
||
);
|
||
if (
|
||
isImportService(row.treatment) &&
|
||
(!row.serviceImportRef?.trim() ||
|
||
!row.serviceBaseRef?.trim() ||
|
||
!row.declaredValue.trim() ||
|
||
(row.treatment === 'accessory_service_first_destination' &&
|
||
!row.serviceFirstDestination?.trim()))
|
||
)
|
||
return stop(
|
||
'Identifique a importação de bens, a referência da base que inclui o valor do serviço e o montante desta linha; no serviço acessório, indique o primeiro destino e o fundamento documental ou pressuposto.',
|
||
);
|
||
if (
|
||
!row.description.trim() ||
|
||
!row.importer.trim() ||
|
||
!row.documentRef.trim() ||
|
||
!row.evidence.trim()
|
||
)
|
||
return stop(
|
||
isImportService(row.treatment)
|
||
? 'Identifique o serviço, importador destinatário, documento/previsão e fundamento factual da inclusão; sem exigir segunda validação da fonte oficial.'
|
||
: 'Identifique bens, importador, documento aduaneiro ou previsão e o fundamento factual das condições; não é exigida segunda validação da fonte oficial.',
|
||
);
|
||
if (!validDate(row.documentDate))
|
||
return stop(
|
||
'Data do documento/previsão em falta ou inválida; o período da importação é indicado separadamente.',
|
||
);
|
||
if (
|
||
row.declaredValue.trim() &&
|
||
!/^\d{1,15}(\.\d{1,6})?$/.test(row.declaredValue.trim())
|
||
)
|
||
return stop(
|
||
'Valor declarado/previsional inválido; conserve o original e reveja, sem presumir base aduaneira ou imposto normal.',
|
||
);
|
||
if (row.treatment === 'un_development_reduction') {
|
||
const normal = developmentDecimal(row.developmentNormalVat),
|
||
percent = developmentDecimal(row.developmentReductionPercent);
|
||
if (percent === null)
|
||
return stop(
|
||
'Indique a percentagem da redução de direitos identificada no fundamento; não é inferida da taxa aduaneira, do financiador ou do valor dos bens.',
|
||
);
|
||
if (percent === 0n)
|
||
return stop(
|
||
'Redução de direitos de0% não concede benefício proporcional de IVA neste fundamento; não se presume o imposto normal.',
|
||
'not_applicable',
|
||
);
|
||
if (percent >= 100000000n)
|
||
return stop(
|
||
'A redução parcial deve ser superior a0% e inferior a100%; para isenção integral use o tratamento próprio e as suas condições.',
|
||
);
|
||
if (normal === null || !row.developmentNormalVatRef?.trim())
|
||
return stop(
|
||
'Indique o IVA desta importação sem benefício e a sua referência documental ou pressuposto; montante desconhecido não é zero e o portal não presume taxa/base aduaneira.',
|
||
);
|
||
const vat = developmentExactMoney(normal * (100000000n - percent));
|
||
return {
|
||
...result,
|
||
status: 'reduced',
|
||
importVat: vat,
|
||
reason: `Redução proporcional ${rule.article} nas condições ${row.origin === 'projected' ? 'expressamente assumidas na projecção' : 'efectivas declaradas'}. IVA informado sem benefício ${row.developmentNormalVat}MZN × (1 − ${row.developmentReductionPercent}/100) = ${vat}MZN. Proporção da redução de direitos, não taxa de IVA; aritmética decimal exacta, sem arredondamento fiscal presumido. Não calcula direitos/base aduaneira nem dedução.`,
|
||
};
|
||
}
|
||
if (isImportService(row.treatment))
|
||
return {
|
||
...result,
|
||
status: 'exempt',
|
||
serviceVat: '0.00',
|
||
reason: `Isenção do serviço ${rule.article} nas condições ${row.origin === 'projected' ? 'expressamente assumidas na projecção' : 'efectivas declaradas'}. IVA do serviço:0.00MZN; não é o IVA dos bens importados, não soma novamente o serviço à base nem corrige factura ou dedução.`,
|
||
};
|
||
return {
|
||
...result,
|
||
status: 'exempt',
|
||
importVat: '0.00',
|
||
reason: `Isenção ${rule.article} nas condições ${row.origin === 'projected' ? 'expressamente assumidas na projecção' : 'efectivas declaradas'}. IVA na importação:0.00MZN por isenção, sem inferir direitos aduaneiros, certificação pela AT ou dedução.`,
|
||
};
|
||
}
|
||
function developmentDecimal(raw: unknown): bigint | null {
|
||
if (typeof raw !== 'string' || !/^\d{1,15}(\.\d{1,6})?$/.test(raw.trim()))
|
||
return null;
|
||
const [whole, decimal = ''] = raw.trim().split('.');
|
||
return BigInt(whole) * 1000000n + BigInt(decimal.padEnd(6, '0'));
|
||
}
|
||
function developmentExactMoney(numerator: bigint): string {
|
||
const scale = 100000000000000n;
|
||
return `${numerator / scale}.${(numerator % scale).toString().padStart(14, '0').replace(/0+$/, '').padEnd(2, '0')}`;
|
||
}
|
||
function key(
|
||
draft: Record<string, unknown>,
|
||
book: ImportExemptionBook,
|
||
): string {
|
||
const base = {
|
||
version: importExemptionVersion,
|
||
scope: acquisitionScope(draft),
|
||
location: draft.selection_labels ?? {},
|
||
currency: draft.currency,
|
||
rows: book.rows,
|
||
};
|
||
return JSON.stringify({
|
||
...base,
|
||
...(book.rows.some((row) => isDevelopmentImport(row.treatment))
|
||
? { developmentVersion: importDevelopmentVersion }
|
||
: {}),
|
||
...(book.rows.some(
|
||
(row) => row.treatment === 'authorized_investment_equipment',
|
||
)
|
||
? { investmentVersion: importInvestmentVersion }
|
||
: {}),
|
||
...(book.rows.some((row) => beneficiaryImport(row.treatment))
|
||
? { beneficiaryVersion: importBeneficiaryVersion }
|
||
: {}),
|
||
...(book.rows.some((row) => assetImport(row.treatment))
|
||
? { assetVersion: importAssetVersion }
|
||
: {}),
|
||
...(book.rows.some((row) => customsImport(row.treatment))
|
||
? { customsVersion: importCustomsVersion }
|
||
: {}),
|
||
...(book.rows.some((row) => specialRegimeImport(row.treatment))
|
||
? { specialRegimeVersion: importSpecialRegimeVersion }
|
||
: {}),
|
||
...(book.rows.some((row) => supplyImport(row.treatment))
|
||
? { supplyVersion: importSupplyVersion }
|
||
: {}),
|
||
...(book.rows.some((row) => isImportService(row.treatment))
|
||
? { serviceVersion: importServiceVersion }
|
||
: {}),
|
||
});
|
||
}
|
||
export function importExemptionCurrent(
|
||
draft: Record<string, unknown>,
|
||
book: ImportExemptionBook,
|
||
): boolean {
|
||
return !!book.result && book.result.sourceKey === key(draft, book);
|
||
}
|
||
export function recordImportExemptions(
|
||
draft: Record<string, unknown>,
|
||
book: ImportExemptionBook,
|
||
): ImportExemptionBook {
|
||
if (
|
||
!book.rows.length ||
|
||
new Set(book.rows.map((r) => r.id)).size !== book.rows.length
|
||
)
|
||
throw new Error(
|
||
'Indique importações com identificadores distintos; versões anteriores conservadas.',
|
||
);
|
||
const result: ImportExemptionCalculation = {
|
||
version: importExemptionVersion,
|
||
revision: (book.result?.revision ?? 0) + 1,
|
||
calculatedAt: new Date().toISOString(),
|
||
opportunity: acquisitionScope(draft),
|
||
location: JSON.stringify(draft.selection_labels ?? {}),
|
||
sourceKey: key(draft, book),
|
||
source: [
|
||
...new Set(book.rows.map((row) => importRuleSource(row.treatment))),
|
||
].join(' | '),
|
||
inputs: structuredClone(book.rows),
|
||
rows: book.rows.map((row) =>
|
||
evaluateImportExemption(row, draft.currency),
|
||
),
|
||
};
|
||
return {
|
||
...book,
|
||
result,
|
||
history: [
|
||
...(book.history ?? []),
|
||
...(book.result ? [book.result] : []),
|
||
],
|
||
};
|
||
}
|
||
export function importExemptionReportRows(
|
||
draft: Record<string, unknown>,
|
||
): Array<[string, string, string, string]> {
|
||
try {
|
||
const book = importExemptionBook(draft),
|
||
result = book.result;
|
||
if (!result) return [];
|
||
const context = `${result.opportunity}; ${result.location}; ${importExemptionCurrent(draft, book) ? 'Resultado actual' : 'Entradas alteradas; resultado histórico conservado'}; versão${result.revision}; ${result.calculatedAt}; ${result.source}`;
|
||
return result.inputs.map((row, index) => [
|
||
'IVA mensal',
|
||
`${isImportService(row.treatment) ? 'Serviço associado à importação' : 'Importação'} ${importExemptionRules.find((r) => r.id === row.treatment)?.branch ?? row.treatment} — ${row.period} — ${row.id}`,
|
||
`${row.description}; ${isImportService(row.treatment) ? 'IVA do serviço' : 'IVA na importação'}: ${(isImportService(row.treatment) ? result.rows[index].serviceVat : result.rows[index].importVat) ?? 'Indeterminado'} ${row.currency}; ${result.rows[index].reason}`,
|
||
`${context}; ${row.origin === 'projected' ? 'Projecção' : 'Dados efectivos declarados'}; importador ${row.importer}; valor declarado/previsional ${row.declaredValue || 'Não informado'} ${row.currency}, sem fixar base aduaneira; ${isImportService(row.treatment) ? `importação associada ${row.serviceImportRef || 'por indicar'}; base com inclusão do serviço ${row.serviceBaseRef || 'por indicar'}; prestador ${row.serviceProvider || 'por indicar'}${row.treatment === 'accessory_service_first_destination' ? `; primeiro destino ${row.serviceFirstDestination || 'por indicar'}` : ''}` : `código ${row.goodsCode || 'não indicado'}; origem ${row.originCountry || 'não indicada'}`}${row.treatment === 'authorized_investment_equipment' ? `; autorização/pressuposto ${row.investmentAuthorizationRef || 'por indicar'}; âmbito aplicável ${row.investmentScope || 'por indicar'}` : ''}${isDevelopmentImport(row.treatment) ? `; ${importDevelopmentFields.map(([key, label]) => label + ': ' + (row[key] || 'por indicar')).join('; ')}${row.treatment === 'un_development_reduction' ? `; redução dos direitos ${row.developmentReductionPercent || 'por indicar'}%; IVA informado sem benefício ${row.developmentNormalVat || 'por indicar'} ${row.currency}; referência do IVA sem benefício ${row.developmentNormalVatRef || 'por indicar'}` : ''}` : ''}; documento ${row.documentRef},${row.documentDate}; condições ${(importExemptionRules.find((rule) => rule.id === row.treatment)?.conditions ?? []).map(([key, label]) => label + ': ' + (row.conditions[key] === 'yes' ? 'Sim' : row.conditions[key] === 'no' ? 'Não' : 'Por indicar')).join('; ')}; fundamento factual ${row.evidence}; campo11 e totaisModeloA não preenchidos por esta classificação.`,
|
||
]);
|
||
} catch {
|
||
return [
|
||
[
|
||
'IVA mensal',
|
||
'Importações',
|
||
'Dados não recuperáveis',
|
||
'Originais preservados; sem substituir por zero.',
|
||
],
|
||
];
|
||
}
|
||
}
|