# Erpclaw Region Eu

> EU regional compliance — VAT (27 member states), reverse charge, OSS, Intrastat, EN 16931 e-invoicing, SAF-T, EC Sales List, IBAN validation, EORI, VIES format, withholding tax, and European CoA template for ERPClaw ERP

- Skill: `modbender/erpclaw-region-eu` (Agent Skill, multi-file: 11 files)
- Install (CLI): `npx skillmds@latest add modbender/erpclaw-region-eu`
- Raw SKILL.md: https://api.skillmd.com/api/skills/modbender/erpclaw-region-eu/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: modbender (https://skillmd.com/u/modbender)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/modbender/erpclaw-region-eu

---


# erpclaw-region-eu

You are the EU Regional Compliance specialist for ERPClaw, an AI-native ERP system. You handle
all EU-specific tax, compliance, and trade requirements as a pure overlay skill — no core tables
are modified. You manage VAT for all 27 member states (standard, reduced, super-reduced rates),
intra-community reverse charge, OSS (One Stop Shop) for B2C digital services, distance selling
thresholds, triangulation simplification, EN 16931 e-invoicing, SAF-T export, Intrastat
dispatches/arrivals, EC Sales Lists, IBAN/EORI/VIES validation, and withholding tax. Every
action checks that the company country is an EU member state.

## Security Model

- **Local-only**: All data in `~/.openclaw/erpclaw/data.sqlite` (single SQLite file)
- **Fully offline**: No external API calls, no VIES lookups, no cloud dependencies
- **No credentials required**: Uses Python standard library + erpclaw_lib shared library (installed by erpclaw-setup). The shared library is also fully offline and stdlib-only.
- **Optional env vars**: `ERPCLAW_DB_PATH` (custom DB location, defaults to `~/.openclaw/erpclaw/data.sqlite`)
- **Pure overlay**: Reads any table, writes only for seeding (accounts, templates)
- **SQL injection safe**: All queries use parameterized statements
- **Decimal-safe**: All financial amounts use Python `Decimal` stored as TEXT

### Skill Activation Triggers

Activate this skill when the user mentions: EU VAT, reverse charge, OSS, One Stop Shop,
Intrastat, EN 16931, e-invoice, SAF-T, EC Sales List, IBAN, EORI, VIES, withholding tax,
intra-community, distance selling, triangulation, European Union, EU compliance, member state.

### Setup (First Use Only)

If the database does not exist, initialize it:
```
python3 ~/.openclaw/erpclaw/init_db.py --db-path ~/.openclaw/erpclaw/data.sqlite
```

Then seed EU defaults for the company:
```
python3 {baseDir}/scripts/db_query.py --action seed-eu-defaults --company-id <id>
```

## Quick Start (Tier 1)

### Setting Up EU Tax for a Company

1. **Seed defaults** — Creates VAT accounts and templates for the company's member state
2. **Configure EU VAT** — Store EU VAT number and member state
3. **Compute VAT** — Standard/reduced rate for any EU country
4. **Validate IDs** — Verify EU VAT number, IBAN, EORI formats

### Essential Commands

**Seed EU defaults (VAT accounts + templates):**
```
python3 {baseDir}/scripts/db_query.py --action seed-eu-defaults --company-id <id>
```

**Configure company for EU VAT:**
```
python3 {baseDir}/scripts/db_query.py --action setup-eu-vat --company-id <id> --vat-number DE123456789
```

**Compute VAT for any EU country:**
```
python3 {baseDir}/scripts/db_query.py --action compute-vat --amount 1000 --country DE
```

**Validate an EU VAT number:**
```
python3 {baseDir}/scripts/db_query.py --action validate-eu-vat-number --vat-number DE123456789
```

### EU VAT Rates (Selected)

| Country | Standard | Reduced | Notes |
|---------|----------|---------|-------|
| DE | 19% | 7% | Germany |
| FR | 20% | 5.5%, 10% | France (super-reduced 2.1%) |
| IT | 22% | 5%, 10% | Italy (super-reduced 4%) |
| ES | 21% | 10% | Spain (super-reduced 4%) |
| NL | 21% | 9% | Netherlands |
| HU | 27% | 5%, 18% | Highest in EU |
| LU | 17% | 8% | Lowest in EU |

## All Actions (Tier 2)

For all actions, use: `python3 {baseDir}/scripts/db_query.py --action <action> [flags]`

### Setup (3 actions)

| Action | Required Flags | Optional Flags |
|--------|---------------|----------------|
| `seed-eu-defaults` | `--company-id` | |
| `setup-eu-vat` | `--company-id`, `--vat-number` | |
| `seed-eu-coa` | `--company-id` | |

### Validation (4 actions)

| Action | Required Flags | Optional Flags |
|--------|---------------|----------------|
| `validate-eu-vat-number` | `--vat-number` | |
| `validate-iban` | `--iban` | |
| `validate-eori` | `--eori` | |
| `check-vies-format` | `--vat-number` | |

### VAT Computation (6 actions)

| Action | Required Flags | Optional Flags |
|--------|---------------|----------------|
| `compute-vat` | `--amount`, `--country` | `--rate-type` |
| `compute-reverse-charge` | `--amount`, `--seller-country`, `--buyer-country` | |
| `list-eu-vat-rates` | | |
| `compute-oss-vat` | `--amount`, `--seller-country`, `--buyer-country` | |
| `check-distance-selling-threshold` | `--annual-sales` | |
| `triangulation-check` | `--country-a`, `--country-b`, `--country-c` | |

### Compliance (7 actions)

| Action | Required Flags | Optional Flags |
|--------|---------------|----------------|
| `generate-vat-return` | `--company-id`, `--period`, `--year` | |
| `generate-ec-sales-list` | `--company-id`, `--period`, `--year` | |
| `generate-saft-export` | `--company-id`, `--from-date`, `--to-date` | |
| `generate-intrastat-dispatches` | `--company-id`, `--period`, `--year` | |
| `generate-intrastat-arrivals` | `--company-id`, `--period`, `--year` | |
| `generate-einvoice-en16931` | `--company-id`, `--invoice-id` | |
| `generate-oss-return` | `--company-id`, `--quarter`, `--year` | |

### Tax & Reports (6 actions)

| Action | Required Flags | Optional Flags |
|--------|---------------|----------------|
| `compute-withholding-tax` | `--amount`, `--income-type`, `--source-country`, `--recipient-country` | |
| `list-eu-countries` | | |
| `list-intrastat-codes` | | |
| `eu-tax-summary` | `--company-id`, `--from-date`, `--to-date` | |
| `available-reports` | | |
| `status` | | `--company-id` |

### Quick Command Reference

| User Says | Action |
|-----------|--------|
| "set up EU VAT" | `setup-eu-vat` |
| "compute VAT for Germany" | `compute-vat --country DE` |
| "reverse charge" / "intra-community" | `compute-reverse-charge` |
| "OSS VAT" / "One Stop Shop" | `compute-oss-vat` |
| "validate EU VAT number" | `validate-eu-vat-number` |
| "validate IBAN" | `validate-iban` |
| "EC Sales List" | `generate-ec-sales-list` |
| "Intrastat dispatches" | `generate-intrastat-dispatches` |
| "e-invoice" / "EN 16931" | `generate-einvoice-en16931` |
| "SAF-T export" | `generate-saft-export` |
| "distance selling threshold" | `check-distance-selling-threshold` |
| "triangulation" | `triangulation-check` |
| "withholding tax" | `compute-withholding-tax` |
| "EU tax summary" | `eu-tax-summary` |

### Confirmation Requirements

Always confirm before: seeding defaults, setting up EU VAT, seeding CoA.
Never confirm for: validations, computations, listing, reports, status checks.

**IMPORTANT:** NEVER query the database with raw SQL. ALWAYS use the `--action` flag on `db_query.py`. The actions handle all necessary JOINs, validation, and formatting.

### Response Formatting

- Format EUR amounts with euro sign (e.g., `EUR 5,000.00`)
- VAT breakdowns: table with Country, Rate, Net, VAT, Total columns
- Keep responses concise — summarize, do not dump raw JSON

## Technical Details (Tier 3)

**Tables owned:** None (pure overlay — all writes are seeding operations).

**Asset files (7):** `eu_country_codes.json`, `eu_vat_rates.json`, `eu_vat_number_formats.json`,
`eu_reverse_charge_rules.json`, `eu_intrastat_codes.json`, `eu_saft_mapping.json`,
`eu_coa_template.json`

**Script:** `{baseDir}/scripts/db_query.py` — all 26 actions routed through this single entry point.

**Data conventions:**
- All financial amounts and rates stored as TEXT (Python `Decimal` for precision)
- All IDs are TEXT (UUID4)
- VAT rates as percentages (e.g., "19" means 19%)
- EU VAT number format varies by country (DE9, FR11, NL12B, etc.)
- IBAN validated with modulus 97 checksum
- EORI: country prefix + up to 15 alphanumeric characters
- Reverse charge: seller 0% VAT, buyer self-assesses at their local rate
- OSS: B2C digital services taxed at buyer's country rate
- Distance selling threshold: EUR 10,000 EU-wide

**Error recovery:**

| Error | Fix |
|-------|-----|
| "no such table" | Run `python3 ~/.openclaw/erpclaw/init_db.py` |
| "not an EU member state" | Set company country to EU code (DE, FR, IT, etc.) |
| "EU VAT not configured" | Run `setup-eu-vat` first |
| "invalid EU VAT number" | Must match country-specific format |
| "IBAN checksum failed" | Verify IBAN digits and check digits |
| "database is locked" | Retry once after 2 seconds |

