Initial commit: L10N_Europe packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:52 +02:00
commit 9803722600
2377 changed files with 380711 additions and 0 deletions

View file

@ -0,0 +1,60 @@
# EU One Stop Shop (OSS)
EU One Stop Shop (OSS) VAT
==========================
From July 1st 2021, EU businesses that are selling goods within the EU above EUR 10 000 to buyers located in another EU Member State need to register and pay VAT in the buyers Member State.
Below this new EU-wide threshold you can continue to apply the domestic rules for VAT on your cross-border sales. In order to simplify the application of this EU directive, the One Stop Shop (OSS) registration scheme allows businesses to make a unique tax declaration.
This module makes it possible by helping with the creation of the required EU fiscal positions and taxes in order to automatically apply and record the required taxes.
All you have to do is check that the proposed mapping is suitable for the products and services you sell.
References
++++++++++
Council Directive (EU) 2017/2455 Council Directive (EU) 2019/1995
Council Implementing Regulation (EU) 2019/2026
## Installation
```bash
pip install odoo-bringout-oca-ocb-l10n_eu_oss
```
## Dependencies
This addon depends on:
- account
## Manifest Information
- **Name**: EU One Stop Shop (OSS)
- **Version**: N/A
- **Category**: Accounting/Localizations
- **License**: LGPL-3
- **Installable**: False
## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `l10n_eu_oss`.
## License
This package maintains the original LGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph L10n_eu_oss Module - l10n_eu_oss
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for l10n_eu_oss. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [account](../../odoo-bringout-oca-ocb-account)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon l10n_eu_oss or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-ocb-l10n_eu_oss"
# or
uv pip install odoo-bringout-oca-ocb-l10n_eu_oss"
```

View file

@ -0,0 +1,14 @@
# Models
Detected core models and extensions in l10n_eu_oss.
```mermaid
classDiagram
class account_chart_template
class res_company
class res_config_settings
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: l10n_eu_oss. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon l10n_eu_oss
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon l10n_eu_oss
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,12 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from odoo import api, SUPERUSER_ID
def l10n_eu_oss_post_init(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
env['res.company']._map_all_eu_companies_taxes()
def l10n_eu_oss_uninstall(cr, registry):
cr.execute("DELETE FROM ir_model_data WHERE module = 'l10n_eu_oss' and model in ('account.tax.group', 'account.account');")

View file

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'EU One Stop Shop (OSS)',
'category': 'Accounting/Localizations',
'description': """
EU One Stop Shop (OSS) VAT
==========================
From July 1st 2021, EU businesses that are selling goods within the EU above EUR 10 000 to buyers located in another EU Member State need to register and pay VAT in the buyers Member State.
Below this new EU-wide threshold you can continue to apply the domestic rules for VAT on your cross-border sales. In order to simplify the application of this EU directive, the One Stop Shop (OSS) registration scheme allows businesses to make a unique tax declaration.
This module makes it possible by helping with the creation of the required EU fiscal positions and taxes in order to automatically apply and record the required taxes.
All you have to do is check that the proposed mapping is suitable for the products and services you sell.
References
++++++++++
Council Directive (EU) 2017/2455 Council Directive (EU) 2019/1995
Council Implementing Regulation (EU) 2019/2026
""",
'depends': ['account'],
'data': [
'views/res_config_settings_views.xml',
'data/account_account_tag.xml',
],
'post_init_hook': 'l10n_eu_oss_post_init',
'uninstall_hook': 'l10n_eu_oss_uninstall',
'license': 'LGPL-3',
}

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="tag_oss" model="account.account.tag">
<field name="name">OSS</field>
<field name="applicability">taxes</field>
</record>
<record id="tag_eu_import" model="account.account.tag">
<field name="name">non-EU origin</field>
<field name="applicability">products</field>
</record>
</data>
</odoo>

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Šablon účtové osnovy"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Společnosti"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Nastavení konfigurace"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Je evropskou zemi?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Obnovit daňové mapování"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "původ mimo EU"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Kontoplansskabelon"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Virksomheder"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Konfigurér indstillinger"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Er det et europæisk land?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Genindlæs skatteallokering"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Oprindelse uden for EU"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Kontenplanvorlage"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Unternehmen"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Konfigurationseinstellungen"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Ist ein europäisches Land?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Steuerzuordnung aktualisieren"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Nicht-EU-Herkunft"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Plantilla de plan contable"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Ajustes de configuración"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "¿Se trata de un país europeo?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Actualizar el mapeo de impuestos"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Origen no UE"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Tilikarttamalli"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Yritykset"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Kokoonpanoasetukset"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Onko Euroopan maa?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Päivitä verokartoitus"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "EU:n ulkopuolinen alkuperä"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Modèle de plan comptable"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Entreprises"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Paramètres de configuration"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Est un pays européen ?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Actualiser le mappage fiscal"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Origine hors UE"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Modello piano dei conti"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Configura impostazioni"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "È un Paese europeo?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Aggiorna mappatura imposte"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Origine non UE"

View file

@ -0,0 +1,51 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr ""
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr ""
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr ""
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr ""
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr ""
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr ""

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Sąskaitų plano šablonas"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Įmonės"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Konfigūracijos nustatymai"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Ar Europos šalis?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Atnaujinti mokesčių susiejimą"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Ne ES kilmės šalis"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Sjabloon grootboekschema"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Bedrijven"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Configuratie-instellingen"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Is een Europees land?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Btw-mapping vernieuwen"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Niet-EU-herkomst"

View file

@ -0,0 +1,52 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * l10n_eu_oss
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-28 08:32+0000\n"
"PO-Revision-Date: 2025-01-28 08:32+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_account_chart_template
msgid "Account Chart Template"
msgstr "Szablon planu kont"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_company
msgid "Companies"
msgstr "Firmy"
#. module: l10n_eu_oss
#: model:ir.model,name:l10n_eu_oss.model_res_config_settings
msgid "Config Settings"
msgstr "Konfiguracja ustawień"
#. module: l10n_eu_oss
#: model:ir.model.fields,field_description:l10n_eu_oss.field_res_config_settings__l10n_eu_oss_eu_country
msgid "Is European country?"
msgstr "Jest krajem europejskim?"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_oss
msgid "OSS"
msgstr "OSS"
#. module: l10n_eu_oss
#: model_terms:ir.ui.view,arch_db:l10n_eu_oss.res_config_settings_view_form
msgid "Refresh tax mapping"
msgstr "Odśwież mapowanie podatkowe"
#. module: l10n_eu_oss
#: model:account.account.tag,name:l10n_eu_oss.tag_eu_import
msgid "non-EU origin"
msgstr "Pochodzenie spoza UE"

View file

@ -0,0 +1,8 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import chart_template
from . import eu_tax_map
from . import eu_tag_map
from . import res_company
from . import res_config_settings

View file

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models
class AccountChartTemplate(models.Model):
_inherit = 'account.chart.template'
def _load(self, company):
rslt = super()._load(company)
if company.account_fiscal_country_id in self.env.ref('base.europe').country_ids:
company._map_eu_taxes()
return rslt

View file

@ -0,0 +1,214 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
"""
The EU_TAG_MAP answers the question: "which tag should I apply on the OSS tax repartition line?"
{
'fiscal_country_code': {
'invoice_base_tag': xml_id_of_the_tag or None,
'invoice_tax_tag': xml_id_of_the_tag or None,
'refund_base_tag': xml_id_of_the_tag or None,
'refund_tax_tag': xml_id_of_the_tag or None,
},
}
"""
EU_TAG_MAP = {
# Austria
'l10n_at.l10n_at_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Belgium
'l10n_be.l10nbe_chart_template': {
'invoice_base_tag': 'l10n_be.tax_report_line_47_tag',
'invoice_tax_tag': None,
'refund_base_tag': 'l10n_be.tax_report_line_49_tag',
'refund_tax_tag': None,
},
# Bulgaria
'BG': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Croatia
'l10n_hr.l10n_hr_chart_template_rrif': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Cyprus
'CY': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Czech - Done in 13.0 - CoA not available yet
'l10n_cz.cz_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Denmark
'l10n_dk.dk_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Estonia - Done in 13.0 - CoA not available yet
'EE': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Finland
'l10n_fi.fi_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# France
'l10n_fr.l10n_fr_pcg_chart_template': {
'invoice_base_tag': 'l10n_fr.tax_report_E3_tag',
'invoice_tax_tag': None,
'refund_base_tag': 'l10n_fr.tax_report_F8_tag',
'refund_tax_tag': None,
},
# Germany SKR03
'l10n_de_skr03.l10n_de_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Germany SKR04
'l10n_de_skr04.l10n_chart_de_skr04': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Greece
'l10n_gr.l10n_gr_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Hungary
'l10n_hu.hungarian_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Ireland
'l10n_ie.l10n_ie': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Italy
'l10n_it.l10n_it_chart_template_generic': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Latvia
'LV': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Lithuania
'l10n_lt.account_chart_template_lithuania': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Luxembourg
'l10n_lu.lu_2011_chart_1': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Malta - Done in 13.0 - CoA not available yet
'MT': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Netherlands
'l10n_nl.l10nnl_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Poland
'l10n_pl.pl_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Portugal
'l10n_pt.pt_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Romania
'l10n_ro.ro_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Slovakia - Done in 13.0 - CoA not available yet
'l10n_sk.sk_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Slovenia
'l10n_si.gd_chart': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Spain
'l10n_es.account_chart_template_common': {
'invoice_base_tag': "l10n_es.mod_303_124",
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
# Sweden
'l10n_se.l10nse_chart_template': {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
},
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,148 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import Command, api, models
from .eu_tag_map import EU_TAG_MAP
from .eu_tax_map import EU_TAX_MAP
class Company(models.Model):
_inherit = 'res.company'
@api.model
def _map_all_eu_companies_taxes(self):
''' Identifies EU companies and calls the _map_eu_taxes function
'''
eu_countries = self.env.ref('base.europe').country_ids
companies = self.search([('account_fiscal_country_id', 'in', eu_countries.ids)])
companies._map_eu_taxes()
def _map_eu_taxes(self):
'''Creates or updates Fiscal Positions for each EU country excluding the company's account_fiscal_country_id
'''
eu_countries = self.env.ref('base.europe').country_ids
oss_tax_groups = self.env['ir.model.data'].search([
('module', '=', 'l10n_eu_oss'),
('model', '=', 'account.tax.group')])
for company in self:
invoice_repartition_lines, refund_repartition_lines = company._get_repartition_lines_oss()
taxes = self.env['account.tax'].search([
('type_tax_use', '=', 'sale'),
('amount_type', '=', 'percent'),
('company_id', '=', company.id),
('country_id', '=', company.account_fiscal_country_id.id),
('tax_group_id', 'not in', oss_tax_groups.mapped('res_id'))])
multi_tax_reports_countries_fpos = self.env['account.fiscal.position'].search([
('company_id', '=', company.id),
('foreign_vat', '!=', False),
])
oss_countries = eu_countries - company.account_fiscal_country_id - multi_tax_reports_countries_fpos.country_id
for destination_country in oss_countries:
mapping = []
fpos = self.env['account.fiscal.position'].search([
('country_id', '=', destination_country.id),
('company_id', '=', company.id),
('auto_apply', '=', True),
('vat_required', '=', False),
('foreign_vat', '=', False)], limit=1)
if not fpos:
fpos = self.env['account.fiscal.position'].create({
'name': f'OSS B2C {destination_country.name}',
'country_id': destination_country.id,
'company_id': company.id,
'auto_apply': True,
})
foreign_taxes = {tax.amount: tax for tax in fpos.tax_ids.tax_dest_id if tax.amount_type == 'percent'}
for domestic_tax in taxes:
tax_amount = EU_TAX_MAP.get((company.account_fiscal_country_id.code, domestic_tax.amount, destination_country.code), False)
if tax_amount and domestic_tax not in fpos.tax_ids.tax_src_id:
if not foreign_taxes.get(tax_amount, False):
oss_tax_group_local_xml_id = f"oss_tax_group_{str(tax_amount).replace('.', '_')}"
if not self.env.ref(f"l10n_eu_oss.{oss_tax_group_local_xml_id}", raise_if_not_found=False):
self.env['ir.model.data'].create({
'name': oss_tax_group_local_xml_id,
'module': 'l10n_eu_oss',
'model': 'account.tax.group',
'res_id': self.env['account.tax.group'].create({'name': f'OSS {tax_amount}%'}).id,
'noupdate': True,
})
foreign_taxes[tax_amount] = self.env['account.tax'].create({
'name': f'{tax_amount}% {destination_country.code} {destination_country.vat_label}',
'amount': tax_amount,
'invoice_repartition_line_ids': invoice_repartition_lines,
'refund_repartition_line_ids': refund_repartition_lines,
'type_tax_use': 'sale',
'description': f"{tax_amount}%",
'tax_group_id': self.env.ref(f'l10n_eu_oss.{oss_tax_group_local_xml_id}').id,
'country_id': company.account_fiscal_country_id.id,
'sequence': 1000,
'company_id': company.id,
})
mapping.append((0, 0, {'tax_src_id': domestic_tax.id, 'tax_dest_id': foreign_taxes[tax_amount].id}))
if mapping:
fpos.write({
'tax_ids': mapping
})
def _get_repartition_lines_oss(self):
self.ensure_one()
defaults = self.env['account.tax'].with_company(self).default_get(['invoice_repartition_line_ids', 'refund_repartition_line_ids'])
oss_account, oss_tags = self._get_oss_account(), self._get_oss_tags()
base_line, tax_line, vals = 0, 1, 2
for doc_type in 'invoice', 'refund':
if oss_account:
defaults[f'{doc_type}_repartition_line_ids'][tax_line][vals]['account_id'] = oss_account.id
if oss_tags:
defaults[f'{doc_type}_repartition_line_ids'][base_line][vals]['tag_ids'] += [Command.link(tag.id) for tag in oss_tags[f'{doc_type}_base_tag']]
defaults[f'{doc_type}_repartition_line_ids'][tax_line][vals]['tag_ids'] += [Command.link(tag.id) for tag in oss_tags[f'{doc_type}_tax_tag']]
return defaults['invoice_repartition_line_ids'], defaults['refund_repartition_line_ids']
def _get_oss_account(self):
self.ensure_one()
if not self.env.ref(f'l10n_eu_oss.oss_tax_account_company_{self.id}', raise_if_not_found=False):
sales_tax_accounts = self.env['account.tax'].search([
('type_tax_use', '=', 'sale'),
('company_id', '=', self.id)
]).invoice_repartition_line_ids.mapped('account_id')
if not sales_tax_accounts:
return False
new_code = self.env['account.account']._search_new_account_code(self, len(sales_tax_accounts[0].code), sales_tax_accounts[0].code[:-2])
oss_account = self.env['account.account'].create({
'name': f'{sales_tax_accounts[0].name} OSS',
'code': new_code,
'account_type': sales_tax_accounts[0].account_type,
'company_id': self.id,
'tag_ids': [(4, tag.id, 0) for tag in sales_tax_accounts[0].tag_ids],
})
self.env['ir.model.data'].create({
'name': f'oss_tax_account_company_{self.id}',
'module': 'l10n_eu_oss',
'model': 'account.account',
'res_id': oss_account.id,
'noupdate': True,
})
return self.env.ref(f'l10n_eu_oss.oss_tax_account_company_{self.id}')
def _get_oss_tags(self):
oss_tag = self.env.ref('l10n_eu_oss.tag_oss')
chart_template_xml_id = ''
if self.chart_template_id:
[chart_template_xml_id] = self.chart_template_id.parent_id.get_external_id().values() or self.chart_template_id.get_external_id().values()
tag_for_country = EU_TAG_MAP.get(chart_template_xml_id, {
'invoice_base_tag': None,
'invoice_tax_tag': None,
'refund_base_tag': None,
'refund_tax_tag': None,
})
mapping = {}
for repartition_line_key, tag_xml_id in tag_for_country.items():
tag = self.env.ref(tag_xml_id) if tag_xml_id else self.env['account.account.tag']
if tag and tag._name == "account.report.expression":
tag = tag._get_matching_tags("+")
mapping[repartition_line_key] = tag + oss_tag
return mapping

View file

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
l10n_eu_oss_eu_country = fields.Boolean('Is European country?', compute='_compute_l10n_eu_oss_european_country')
def refresh_eu_tax_mapping(self):
self.env.companies._map_eu_taxes()
@api.depends('company_id')
def _compute_l10n_eu_oss_european_country(self):
european_countries = self.env.ref('base.europe').country_ids
for record in self:
record.l10n_eu_oss_eu_country = record.company_id.account_fiscal_country_id in european_countries

View file

@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import test_oss

View file

@ -0,0 +1,118 @@
# -*- coding: utf-8 -*-
from odoo.addons.l10n_eu_oss.models.eu_tag_map import EU_TAG_MAP
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
from odoo.tests import tagged
@tagged('post_install', 'post_install_l10n', '-at_install')
class OssTemplateTestCase(AccountTestInvoicingCommon):
@classmethod
def load_specific_chart_template(cls, chart_template_ref):
try:
super().setUpClass(chart_template_ref=chart_template_ref)
except ValueError as e:
if e.args[0] == f"External ID not found in the system: {chart_template_ref}":
cls.skipTest(cls, reason=f"The {chart_template_ref} CoA is required for this testSuite but the corresponding localization module isn't installed")
else:
raise e
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSBelgium(OssTemplateTestCase):
@classmethod
def setUpClass(cls, chart_template_ref='l10n_be.l10nbe_chart_template'):
cls.load_specific_chart_template(chart_template_ref)
cls.company_data['company'].country_id = cls.env.ref('base.be')
cls.company_data['company']._map_eu_taxes()
def test_country_tag_from_belgium(self):
"""
This test ensure that xml_id from `account.tax.report.line` in the EU_TAG_MAP are processed correctly by the oss
tax creation mechanism.
"""
# get an eu country which isn't the current one:
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.company_data['company'].country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%{another_eu_country_code}%')], limit=1)
for doc_type, report_expression_xml_id in (
("invoice", "l10n_be.tax_report_line_47_tag"),
("refund", "l10n_be.tax_report_line_49_tag"),
):
with self.subTest(doc_type=doc_type, report_expression_xml_id=report_expression_xml_id):
oss_tag_id = tax_oss[f"{doc_type}_repartition_line_ids"]\
.filtered(lambda x: x.repartition_type == 'base')\
.tag_ids
expected_tag_id = self.env.ref(report_expression_xml_id)\
._get_matching_tags()\
.filtered(lambda t: not t.tax_negate)
self.assertIn(expected_tag_id, oss_tag_id, f"{doc_type} tag from Belgian CoA not correctly linked")
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSSpain(OssTemplateTestCase):
@classmethod
def setUpClass(cls, chart_template_ref='l10n_es.account_chart_template_common'):
cls.load_specific_chart_template(chart_template_ref)
cls.company_data['company'].country_id = cls.env.ref('base.es')
cls.company_data['company']._map_eu_taxes()
def test_country_tag_from_spain(self):
"""
This test ensure that xml_id from `account.account.tag` in the EU_TAG_MAP are processed correctly by the oss
tax creation mechanism.
"""
# get an eu country which isn't the current one:
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.company_data['company'].country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%{another_eu_country_code}%')], limit=1)
for doc_type, tag_xml_id in (
("invoice", "l10n_es.mod_303_124"),
):
with self.subTest(doc_type=doc_type, report_line_xml_id=tag_xml_id):
oss_tag_id = tax_oss[f"{doc_type}_repartition_line_ids"]\
.filtered(lambda x: x.repartition_type == 'base')\
.tag_ids
expected_tag_id = self.env.ref(tag_xml_id)
self.assertIn(expected_tag_id, oss_tag_id, f"{doc_type} tag from Spanish CoA not correctly linked")
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSUSA(OssTemplateTestCase):
@classmethod
def setUpClass(cls, chart_template_ref=None):
cls.load_specific_chart_template(chart_template_ref)
cls.company_data['company'].country_id = cls.env.ref('base.us')
cls.company_data['company']._map_eu_taxes()
def test_no_oss_tax(self):
# get an eu country which isn't the current one:
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.company_data['company'].country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%{another_eu_country_code}%')], limit=1)
self.assertFalse(len(tax_oss), "OSS tax shouldn't be instanced on a US company")
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSMap(OssTemplateTestCase):
def test_oss_eu_tag_map(self):
""" Checks that the xml_id referenced in the map are correct.
In case of failure display the couple (chart_template_xml_id, tax_report_line_xml_id).
The test doesn't fail for unreferenced char_template or unreferenced tax_report_line.
"""
chart_templates = self.env['account.chart.template'].search([])
for chart_template in chart_templates:
[chart_template_xml_id] = chart_template.get_external_id().values()
oss_tags = EU_TAG_MAP.get(chart_template_xml_id, {})
for tax_report_line_xml_id in filter(lambda d: d, oss_tags.values()):
with self.subTest(chart_template_xml_id=chart_template_xml_id, tax_report_line_xml_id=tax_report_line_xml_id):
tag = self.env.ref(tax_report_line_xml_id, raise_if_not_found=False)
self.assertIsNotNone(tag, f"The following xml_id is incorrect in EU_TAG_MAP.py:{tax_report_line_xml_id}")

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.l10n.eu.service</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
<field name="arch" type="xml">
<div name="l10n_eu_oss_right_pane" position="inside">
<div class="content-group" attrs="{'invisible': [('module_l10n_eu_oss', '=', False)]}">
<div class="mt8">
<button type="object" name="refresh_eu_tax_mapping" icon="fa-refresh" string="Refresh tax mapping" class="btn-link"/>
</div>
</div>
</div>
</field>
</record>
</odoo>

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-ocb-l10n_eu_oss"
version = "16.0.0"
description = "EU One Stop Shop (OSS) - Odoo addon"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-account>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["l10n_eu_oss"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]