Skip to content

Commit 3628db3

Browse files
authored
docs: release v1.5.4 - refina lógica de taxas, FIFO e destino declarativo (#11)
Este commit consolida a versão v1.5.4 da especificação técnica, resolvendo as falhas lógicas e omissões apontadas pela comunidade: - Taxas em Cripto (#4, #5): Adota o feeFiatValue como encargo dedutível puro (Art. 51.º do CIRS) com mais-valia comercial de 0.00€, eliminando o lucro simulado. - Prioridade FIFO (#6): Implementa a expressão de fallback 'originalAcquisitionDate ?? acquisitionDate' para preservar a antiguidade real em transferências. - Self-Custody (#7): Repõe a nota explicativa e fundamentação jurídica ancorando o enquadramento de carteiras privadas no Anexo J ao Ofício Circulado 20269/2024, com o devido aviso de salvaguarda técnica. Closes #4, Closes #5, Closes #6, Closes #7
1 parent fb9efe2 commit 3628db3

9 files changed

Lines changed: 252 additions & 95 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
diff.txt

README.md

Lines changed: 127 additions & 89 deletions
Large diffs are not rendered by default.

diagrams/fluxograma.dark.png

-1.37 KB
Loading

diagrams/fluxograma.dark.svg

Lines changed: 1 addition & 1 deletion
Loading

diagrams/fluxograma.mermaid.png

-1.46 KB
Loading

diagrams/fluxograma.mermaid.svg

Lines changed: 1 addition & 1 deletion
Loading

docs/modelo_transaction.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Especificação técnica: Modelo de Transações (`Transaction`)
2+
3+
Este documento descreve as propriedades brutas que o motor de cálculo espera receber ao importar movimentos financeiros.
4+
5+
| Campo | Tipo | Descrição | Obrigatório |
6+
| :--- | :--- | :--- | :--- |
7+
| `id` | String | Identificador único da transação. | Sim |
8+
| `date` | String | Data da transação no formato ISO 8601. | Sim |
9+
| `type` | String | Tipo de transação: `"deposit"`, `"withdrawal"`, `"trade"`. | Sim |
10+
| `fromAssetSymbol` | String | Símbolo do ativo de origem (para `withdrawal` e `trade`). | Não |
11+
| `fromAmount` | Number | Quantidade do ativo de origem. | Não |
12+
| `fromWalletId` | String | ID da carteira de origem. | Não |
13+
| `toAssetSymbol` | String | Símbolo do ativo de destino (para `deposit` e `trade`). | Não |
14+
| `toAmount` | Number | Quantidade do ativo de destino. | Não |
15+
| `toWalletId` | String | ID da carteira de destino. | Não |
16+
| `feeAmount` | Number | Quantidade da taxa paga. | Não |
17+
| `feeAssetSymbol` | String | Símbolo do ativo em que a taxa foi paga (ex: "EUR", "BNB"). | Não |
18+
| `feeFiatValue` | Number | Valor de mercado em euros da taxa de transação no exato momento da operação. Utilizado para deduzir o encargo de forma direta quando a comissão é paga em criptoativos. | Não |
19+
| `fiatValue` | Number | Valor total em FIAT da transação (para `deposit`/`withdrawal`). | Não |
20+
| `tag` | String | **Chave fixa em inglês** que categoriza a transação (`"buy"`, `"sell"`, `"staking"`, etc.). | Não |
21+
| `notes` | String | Notas adicionais do utilizador. | Não |
22+
23+
**Exemplos de `Transaction`:**
24+
25+
* **Compra (Depósito Fiat):**
26+
```json
27+
{
28+
"id": "tx_compra_01",
29+
"date": "2024-01-20T10:30:00Z",
30+
"type": "deposit",
31+
"toAssetSymbol": "BTC",
32+
"toAmount": 0.2,
33+
"toWalletId": "wallet-main-001",
34+
"fiatValue": 7000.00,
35+
"feeAmount": 14.00,
36+
"feeAssetSymbol": "EUR",
37+
"tag": "buy"
38+
}
39+
```
40+
41+
* **Venda (Levantamento Fiat):**
42+
```json
43+
{
44+
"id": "tx_venda_01",
45+
"date": "2024-05-22T09:00:00Z",
46+
"type": "withdrawal",
47+
"fromAssetSymbol": "BTC",
48+
"fromAmount": 0.1,
49+
"fromWalletId": "wallet-main-001",
50+
"fiatValue": 4500.00,
51+
"feeAmount": 9.00,
52+
"feeAssetSymbol": "EUR",
53+
"tag": "sell"
54+
}
55+
```
56+
57+
* **Recompensa de Staking:**
58+
```json
59+
{
60+
"id": "tx_stake_01",
61+
"date": "2024-09-25T13:00:00Z",
62+
"type": "deposit",
63+
"toAssetSymbol": "ADA",
64+
"toAmount": 28.5,
65+
"toWalletId": "wallet-main-001",
66+
"tag": "staking",
67+
"notes": "Recompensa mensal de staking"
68+
}
69+
```
70+
71+
* **Trade (Cripto para Cripto):**
72+
```json
73+
{
74+
"id": "tx_trade_01",
75+
"date": "2024-04-10T14:20:00Z",
76+
"type": "trade",
77+
"fromAssetSymbol": "BTC",
78+
"fromAmount": 0.05,
79+
"fromWalletId": "wallet-main-001",
80+
"toAssetSymbol": "ETH",
81+
"toAmount": 1.0,
82+
"toWalletId": "wallet-main-001",
83+
"feeAmount": 0.001,
84+
"feeAssetSymbol": "ETH",
85+
"tag": "trade"
86+
}
87+
```
88+
89+
[Voltar](../README.md)

docs/modelo_wallet.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Especificação técnica: Modelo de entidades (`Wallet`)
2+
3+
Representa uma carteira ou conta numa exchange.
4+
5+
| Campo | Tipo | Descrição | Obrigatório |
6+
| :--- | :--- | :--- | :--- |
7+
| `id` | String | Um identificador único para a carteira (ex: UUID). | Sim |
8+
| `name` | String | Nome dado pelo utilizador à carteira (ex: "Kraken", "Ledger Nano X"). | Sim |
9+
| `platform` | String | A plataforma ou tipo de hardware (ex: "Kraken", "Ledger"). | Sim |
10+
| `type` | String | O tipo de carteira. Ex: '*Exchange*', '*Cold Wallet*', '*Hot Wallet*', '*Other*' | Sim |
11+
| `creationDate`| String | A data de criação no formato ISO 8601. | Sim |
12+
| `countryCode` | String | Código de duas letras (ISO 3166-1 alfa-2) do país de sede da plataforma ou de residência associada à carteira. | Sim |
13+
| `fiscalEligibility` | String | **[Calculado]** Classificação do país face à lista de jurisdições fiscais. Valores: `'COOPERATING'`, `'NON_COOPERATING'` (paraísos fiscais), `'UNKNOWN'` (bloqueia o cálculo). | Não |
14+
15+
16+
### Propriedades calculadas pelo motor
17+
* **`fiscalEligibility`:** Determinado de forma automática no início do processamento. O algoritmo cruza o `countryCode` com uma tabela interna de paraísos fiscais (Portaria n.º 150/2004). O estado `'UNKNOWN'` suspende a execução para impedir cálculos errados em jurisdições não mapeadas.
18+
19+
**Exemplo de `Wallet`:**
20+
```json
21+
{
22+
"id": "wallet-main-001",
23+
"name": "Kraken Principal",
24+
"platform": "Kraken",
25+
"type": "Exchange",
26+
"creationDate": "2023-01-01T12:00:00.000Z",
27+
"countryCode": "IE"
28+
}
29+
```
30+
[Voltar](../README.md)

fluxograma.mermaid

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,9 @@ flowchart TD
5151
G4 --> H
5252

5353
H -->|FIAT| H1[Taxa reduz o valor de<br> realização / encargo]
54-
H -->|CRYPTO| H2[Micro-alienação: apurar<br> mais/menos-valia da taxa]
55-
H2 --> H3{Operação principal<br> tributável?}
56-
H3 -->|Sim| H4[Somar taxa como encargo<br> da alienação principal]
57-
H3 -->|Não| H5[Registar apenas a<br> micro-alienação da taxa]
54+
H -->|CRYPTO| H2[Fixa despesa pelo valor de<br> mercado: feeFiatValue]
55+
H2 --> H3[Deduz feeFiatValue como encargo<br> Art. 51.º da operação principal]
56+
H3 --> H4[Dá baixa física da fração no FIFO<br> Valor de mercado: Mais-valia taxa = 0€]
5857

5958
%% ESTILIZAÇÃO DO GRAPH
6059
style A fill:#f9f,stroke:#333,stroke-width:2px,color:#000

0 commit comments

Comments
 (0)