Files
Investidor-V2/resources/js/lib/iva-onboard-supplies.ts
T

101 lines
4.8 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 type SupplyCategory =
| ''
| 'provisions'
| 'beverages'
| 'fuel'
| 'cargo_products';
export const supplyCategories: Array<[Exclude<SupplyCategory, ''>, string]> = [
[
'provisions',
'Provisões de bordo, excepto bebidas — consumo exclusivo da tripulação e passageiros',
],
[
'beverages',
'Bebidas como provisões de bordo — consumo exclusivo da tripulação e passageiros',
],
[
'fuel',
'Combustíveis, carburantes, lubrificantes ou outros produtos para propulsão ou aparelhos de uso técnico a bordo',
],
[
'cargo_products',
'Produtos acessórios para preparação, tratamento ou conservação das mercadorias transportadas a bordo',
],
];
const source =
'CIVA republicado Lei 13/2016, BR156/10.º suplemento, art.13(1)(c/d/e/h),13(2–3), PDF12/p.1426(270);19(1)(b)(i), PDF15/p.1426(273). Lei22/2022 art.1, PDF3/p.2252(27), e Lei10/2025 art.1, PDF12–13/p.2180(12)–(13), não alteram13 e mantêm19(1)(b)(i). Âmbito2026/MZN; bebidas em c/d/h não têm isenção directa automática:13(2) prevê dedução ou restituição, sem aplicar20(1)(d) para esse efeito.';
const make = (
id: string,
label: string,
letter: string,
conditions: string[],
): OperationTreatment => ({
id,
label,
field: '05',
rate: 0,
article: `CIVA arts.13(1)(${letter}),13(2–3),19(1)(b)(i)`,
source,
logicVersion: 'onboard-supplies/1',
conditions: [
'Transmissão de bens localizada em Moçambique, com territorialidade identificada; não importação nem serviço autónomo',
'Bens efectivamente postos a bordo do meio identificado; natureza e destino correspondem à categoria escolhida do artigo13(3), sustentados pelo documento ou pressuposto expresso da projecção',
...conditions,
],
});
export const onboardSupplyTreatments: OperationTreatment[] = [
make(
'onboard_seagoing_ship',
'Abastecimento de embarcação de navegação marítima em alto mar',
'c',
[
'Embarcação identificada que efectua navegação marítima em alto mar e assegura transporte remunerado de passageiros ou actividade comercial, industrial ou de pesca; utilização identificada, não qualquer barco de recreio',
],
),
make(
'onboard_rescue_coastal_ship',
'Abastecimento de embarcação de salvamento, assistência marítima ou pesca costeira',
'd',
[
'Embarcação identificada de salvamento, assistência marítima ou pesca costeira; actividade identificada, não presumida pelo nome do operador',
],
),
make(
'onboard_departing_warship',
'Abastecimento de embarcação de guerra com destino estrangeiro',
'e',
[
'Embarcação de guerra identificada que deixa o país com destino a porto ou ancoradouro situado no estrangeiro; saída e destino identificados, não simples utilização militar',
],
),
make(
'onboard_international_aircraft',
'Abastecimento de avião de companhia principalmente internacional',
'h',
[
'Avião identificado utilizado por companhia de navegação aérea que se dedica principalmente ao tráfego internacional nos termos de13(1)(g); companhia e utilização identificadas, não apenas um voo internacional isolado',
],
),
];
export function isOnboardSupply(id: string): boolean {
return onboardSupplyTreatments.some((rule) => rule.id === id);
}
export function onboardSupplyIssue(
id: string,
category: unknown,
): string | null {
if (!isOnboardSupply(id)) return null;
if (!supplyCategories.some(([value]) => value === category))
return 'Identifique a natureza do abastecimento segundo o artigo13(3). Informação em falta não significa ausência de bebidas ou provisões; nenhum montante fiscal foi presumido.';
if (
id === 'onboard_rescue_coastal_ship' &&
(category === 'provisions' || category === 'beverages')
)
return 'As provisões de bordo estão excluídas da isenção de13(1)(d), incluindo bebidas, nas embarcações de salvamento, assistência marítima e pesca costeira. Esta isenção não se aplica; o tratamento fiscal alternativo deve ser identificado, sem presumir taxa ou zero.';
if (category === 'beverages' && id !== 'onboard_departing_warship')
return 'Bebidas em13(1)(c/h):13(2) prevê isenção por dedução ou restituição, não isenção directa deste fornecimento; para esse efeito não se aplica20(1)(d). O montante liquidado e o procedimento aplicável não são determinados neste incremento: sem crédito, restituição, taxa ou zero automáticos. Conserve o preço e identifique o tratamento antes do apuramento.';
return null;
}