BG Tax Filing
Ground Rules
- Treat this as high-stakes tax/legal work: verify current-year rules from official NRA/law sources before giving filing instructions.
- Make concrete date assumptions explicit: tax year, filing deadline, and whether dates are past or future.
- Separate facts extracted from documents from legal interpretation.
- Do not optimize for concealment. If the user asks about missed prior years, quantify tax exposure and recommend voluntary correction/consulting NRA or a tax professional.
- Preserve user files. Create new derived workbooks/reports instead of overwriting originals.
Core Workflow
- Identify the tax year, country of tax residence, platforms, and document paths.
- Inventory documents with
rg --files, then extract structured data:- PDFs: try
pdftotext; if unavailable use Pythonpypdf. - HTML exports: parse with Python or bundled scripts.
- XLSX imports: inspect the zipped XML if
openpyxlis unavailable.
- PDFs: try
- Classify every item into a filing bucket:
- Rent from Bulgarian real estate: Appendix 4, code
401, with 10% statutory expenses. - Foreign shares/ETF holdings at 31 Dec: Appendix 8, Part I.
- Foreign permanent establishment/base/real estate: Appendix 8, Part II.
- Foreign dividends/liquidation proceeds: Appendix 8, Part III.
- Taxable sales of assets/financial instruments and crypto: Appendix 5.
- Non-taxable regulated-market sales: usually Appendix 13 if reporting them voluntarily/informationally.
- Crypto only held, with no sale/exchange/spend/staking: normally no appendix.
- Rent from Bulgarian real estate: Appendix 4, code
- Reconcile holdings:
- For Appendix 8 Part I, use acquisition date and acquisition cost, not year-end market value.
- If a position has multiple lots, prefer importing one row per remaining lot/date.
- For broker summaries, compare computed remaining quantities against year-end positions before producing an import file.
- Calculate dividends:
- Convert EUR to BGN at fixed
1.95583. - For other currencies, use BNB fixing for the payment date and cite how the rate was obtained.
- For foreign dividends, default tax is 5% unless an applicable treaty/tax-credit method changes the result.
- Convert EUR to BGN at fixed
- Calculate sales:
- Use FIFO unless documents or Bulgarian rules require another method.
- Compute proceeds, acquisition cost, fees when allowed, gain/loss, and tax only on positive taxable gains.
- For EU/EEA regulated-market securities, verify execution venue before treating gains as non-taxable.
- Produce a filing pack:
- Appendix-by-appendix instructions.
- Tables ready for NRA portal entry.
- Import-ready XLSX/CSV when the portal accepts imports.
- A "not filed" list for items intentionally excluded, with rationale.
- Residual risks and missing documents.
Appendix 8 Practical Notes
- Part I is informational for shares and fund units held abroad as of 31 Dec. It asks for kind, country, count, acquisition date/year, acquisition cost in original currency, and BGN equivalent.
- Use
Акцииfor company shares andДяловеfor ETF/UCITS/fund units. - The country is usually the issuer/fund domicile country from ISIN, not the broker country.
- Part II is only for foreign permanent establishment, fixed base, or foreign real estate. Leave it blank for ordinary broker/crypto holdings.
- Part III code
8141is for foreign dividends. If no foreign tax was withheld and no double-tax method is applied, method code3is usually appropriate; column 12 is 5% of the BGN gross income for that row.
Broker Patterns
- Finax/ETFmatic:
- Monthly/yearly statements may show holdings and market values, but not full acquisition cost.
- Use the Transactions page/export for all-time
BUY/SELLrows. - Run
scripts/parse_finax_transactions.pyon saved Finax transaction HTML to compute open lots, Appendix 8 Part I rows, dividends, and FIFO realized gains.
- IBKR:
- Use Activity Statement, Dividend Report, Tax Documents, and Flex Query if many trades exist.
- Open Positions alone is not enough for Appendix 8 Part I if acquisition cost/date are missing.
- Revolut:
- Stock P&L reports with zero sells do not prove holdings/dividends.
- Crypto statements with no transactions/staking usually produce no filing entry.
Bundled Resources
- Read references/bulgaria-nra.md when giving Bulgarian NRA portal instructions, especially Appendix 8 column mapping and risk notes.
- Use
scripts/parse_finax_transactions.pyfor saved Finax transaction HTML exports:
python3 scripts/parse_finax_transactions.py path/to/Transactions.html --tax-year 2025 --out-dir /tmp/bg-tax
The script writes finax-appendix8-part1.csv, finax-open-lots.csv, finax-dividends.csv, finax-realized-sales.csv, and finax-summary.json.