119 lines
6.4 KiB
TypeScript
119 lines
6.4 KiB
TypeScript
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;
|
||
}
|