Files
Investidor-V2/resources/js/lib/iva-special-regimes.ts
T

119 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}