19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:31:28 +01:00
parent ff721d030e
commit 7721452493
1826 changed files with 124775 additions and 274114 deletions

View file

@ -1,20 +1,20 @@
# Spain - SII EDI Suministro de Libros
This module sends the taxes information (mostly VAT) of the
vendor bills and customer invoices to the SII. It is called
Procedimiento G417 - IVA. Llevanza de libros registro. It is
required for every company with a turnover of +6M€ and others can
already make use of it. The invoices are automatically
sent after validation.
How the information is sent to the SII depends on the
configuration that is put in the taxes. The taxes
that were in the chart template (l10n_es) are automatically
configured to have the right type. It is possible however
that extra taxes need to be created for certain exempt/no sujeta reasons.
You need to configure your certificate and the tax agency.
This module sends the taxes information (mostly VAT) of the
vendor bills and customer invoices to the SII. It is called
Procedimiento G417 - IVA. Llevanza de libros registro. It is
required for every company with a turnover of +6M€ and others can
already make use of it. The invoices are automatically
sent after validation.
How the information is sent to the SII depends on the
configuration that is put in the taxes. The taxes
that were in the chart template (l10n_es) are automatically
configured to have the right type. It is possible however
that extra taxes need to be created for certain exempt/no sujeta reasons.
You need to configure your certificate and the tax agency.
## Installation
@ -25,36 +25,16 @@ pip install odoo-bringout-oca-ocb-l10n_es_edi_sii
## Dependencies
This addon depends on:
- certificate
- l10n_es
- account_edi
## Manifest Information
- **Name**: Spain - SII EDI Suministro de Libros
- **Version**: 1.0
- **Category**: Accounting/Localizations/EDI
- **License**: LGPL-3
- **Installable**: False
## Source
Based on [OCA/OCB](https://github.com/OCA/OCB) branch 16.0, addon `l10n_es_edi_sii`.
- Repository: https://github.com/OCA/OCB
- Branch: 19.0
- Path: addons/l10n_es_edi_sii
## 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
This package preserves the original LGPL-3 license.

View file

@ -2,37 +2,3 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
from . import wizards
from odoo import api, SUPERUSER_ID
def _l10n_es_edi_post_init(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
companies = env['res.company'].search([('partner_id.country_id.code', '=', 'ES')])
all_chart_templates = companies.chart_template_id
current_chart_template = all_chart_templates
while current_chart_template.parent_id:
all_chart_templates |= current_chart_template.parent_id
current_chart_template = current_chart_template.parent_id
if all_chart_templates:
tax_templates = env['account.tax.template'].search([
('chart_template_id', 'in', all_chart_templates.ids),
'|', '|', '|',
('l10n_es_type', '!=', False),
('l10n_es_exempt_reason', '!=', False),
('tax_scope', '!=', False),
('l10n_es_bien_inversion', '!=', False),
])
xml_ids = tax_templates.get_external_id()
for company in companies:
for tax_template in tax_templates:
module, xml_id = xml_ids.get(tax_template.id).split('.')
tax = env.ref('%s.%s_%s' % (module, company.id, xml_id), raise_if_not_found=False)
if tax:
tax.write({
'l10n_es_exempt_reason': tax_template.l10n_es_exempt_reason,
'tax_scope': tax_template.tax_scope,
'l10n_es_type': tax_template.l10n_es_type,
'l10n_es_bien_inversion': tax_template.l10n_es_bien_inversion,
})

View file

@ -6,45 +6,41 @@
{
'name': "Spain - SII EDI Suministro de Libros",
'version': '1.0',
'countries': ['es'],
'version': '1.1',
'category': 'Accounting/Localizations/EDI',
'description': """
This module sends the taxes information (mostly VAT) of the
vendor bills and customer invoices to the SII. It is called
Procedimiento G417 - IVA. Llevanza de libros registro. It is
required for every company with a turnover of +6M and others can
already make use of it. The invoices are automatically
sent after validation.
How the information is sent to the SII depends on the
configuration that is put in the taxes. The taxes
that were in the chart template (l10n_es) are automatically
configured to have the right type. It is possible however
that extra taxes need to be created for certain exempt/no sujeta reasons.
You need to configure your certificate and the tax agency.
This module sends the taxes information (mostly VAT) of the
vendor bills and customer invoices to the SII. It is called
Procedimiento G417 - IVA. Llevanza de libros registro. It is
required for every company with a turnover of +6M and others can
already make use of it. The invoices are automatically
sent after validation.
How the information is sent to the SII depends on the
configuration that is put in the taxes. The taxes
that were in the chart template (l10n_es) are automatically
configured to have the right type. It is possible however
that extra taxes need to be created for certain exempt/no sujeta reasons.
You need to configure your certificate and the tax agency.
""",
'depends': [
'certificate',
'l10n_es',
'account_edi',
],
'data': [
'data/account_tax_data.xml',
'data/account_edi_data.xml',
'data/res_partner_data.xml',
'security/ir.model.access.csv',
'security/l10n_es_edi_certificate.xml',
'views/account_tax_views.xml',
'views/l10n_es_edi_certificate_views.xml',
'views/res_config_settings_views.xml',
'views/account_move_views.xml',
'views/l10n_es_edi_sii_certificate_views.xml',
'views/res_config_settings_views.xml',
],
'demo': ['demo/demo_certificate.xml'],
'external_dependencies': {
'python': ['pyOpenSSL'],
},
'post_init_hook': '_l10n_es_edi_post_init',
'demo': [
'demo/demo_certificate.xml',
'demo/demo_company.xml',
],
'author': 'Odoo S.A.',
'license': 'LGPL-3',
}

View file

@ -1,446 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="l10n_es.account_tax_template_s_iva21b" model="account.tax.template">
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_s_iva21s" model="account.tax.template">
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_s_iva21isp" model="account.tax.template">
<field name="l10n_es_type">sujeto</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_bc" model="account.tax.template">
<field name="name">21% IVA soportado (bienes corrientes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_sc" model="account.tax.template">
<field name="name">21% IVA soportado (servicios corrientes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_sp_in" model="account.tax.template">
<field name="name">IVA 21% Adquisición de servicios intracomunitarios</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_ic_bc" model="account.tax.template">
<field name="name">IVA 21% Adquisición Intracomunitaria. Bienes corrientes</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_ic_bi" model="account.tax.template">
<field name="name">IVA 21% Adquisición Intracomunitaria. Bienes de inversión</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_ibc" model="account.tax.template">
<field name="name">IVA 21% Importaciones bienes corrientes</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_ibi" model="account.tax.template">
<field name="name">IVA 21% Importaciones bienes de inversión</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf21td" model="account.tax.template">
<field name="name">Retenciones IRPF (Trabajadores) dinerarios</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_sp_ex" model="account.tax.template">
<field name="name">IVA 4% Adquisición de servicios extracomunitarios</field>
<field name="l10n_es_type">sujeto_isp</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_sp_ex" model="account.tax.template">
<field name="name">IVA 10% Adquisición de servicios extracomunitarios</field>
<field name="l10n_es_type">sujeto_isp</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_sp_ex" model="account.tax.template">
<field name="name">IVA 21% Adquisición de servicios extracomunitarios</field>
<field name="l10n_es_type">sujeto_isp</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_ic_bc" model="account.tax.template">
<field name="name">IVA 4% Adquisición Intracomunitario. Bienes corrientes</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_ic_bi" model="account.tax.template">
<field name="name">IVA 4% Adquisición Intracomunitario. Bienes de inversión</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_ic_bc" model="account.tax.template">
<field name="name">IVA 10% Adquisición Intracomunitario. Bienes corrientes</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_ic_bi" model="account.tax.template">
<field name="name">IVA 10% Adquisición Intracomunitario. Bienes de inversión</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_s_iva0_sp_i" model="account.tax.template">
<field name="name">IVA 0% Prestación de servicios intracomunitario</field>
<field name="l10n_es_type">no_sujeto_loc</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_s_iva_ns" model="account.tax.template">
<field name="name">No sujeto Repercutido (Servicios)</field>
<field name="l10n_es_type">no_sujeto</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_s_iva_ns_b" model="account.tax.template">
<field name="name">No sujeto Repercutido (Bienes)</field>
<field name="l10n_es_type">no_sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_s_iva_e" model="account.tax.template">
<field name="name">IVA 0% Prestación de servicios extracomunitaria</field>
<field name="l10n_es_type">no_sujeto_loc</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_ibc" model="account.tax.template">
<field name="name">IVA 4% Importaciones bienes corrientes</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_ibi" model="account.tax.template">
<field name="name">IVA 4% Importaciones bienes de inversión</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_ibc" model="account.tax.template">
<field name="name">IVA 10% Importaciones bienes corrientes</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_ibi" model="account.tax.template">
<field name="name">IVA 10% Importaciones bienes de inversión</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_bi" model="account.tax.template">
<field name="name">4% IVA Soportado (bienes de inversión)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
<field name="l10n_es_bien_inversion">True</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_sc" model="account.tax.template">
<field name="name">4% IVA soportado (servicios corrientes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_bi" model="account.tax.template">
<field name="name">10% IVA Soportado (bienes de inversión)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
<field name="l10n_es_bien_inversion">True</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_bi" model="account.tax.template">
<field name="name">21% IVA Soportado (bienes de inversión)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
<field name="l10n_es_bien_inversion">True</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_bc" model="account.tax.template">
<field name="name">10% IVA soportado (bienes corrientes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_bc" model="account.tax.template">
<field name="name">4% IVA soportado (bienes corrientes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_sc" model="account.tax.template">
<field name="name">10% IVA soportado (servicios corrientes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_s_iva0" model="account.tax.template">
<field name="name">IVA Exento Repercutido Sujeto</field>
<field name="l10n_es_type">exento</field>
<field name="l10n_es_exempt_reason">E1</field>
</record>
<record id="l10n_es.account_tax_template_s_iva0_ns" model="account.tax.template">
<field name="name">IVA Exento Repercutido No Sujeto</field>
<field name="l10n_es_type">ignore</field>
</record>
<record id="l10n_es.account_tax_template_s_req0" model="account.tax.template">
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_p_req0" model="account.tax.template">
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_s_req05" model="account.tax.template">
<field name="name">0.50% Recargo Equivalencia Ventas</field>
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_s_req062" model="account.tax.template">
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_p_req062" model="account.tax.template">
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_s_iva4b" model="account.tax.template">
<field name="name">IVA 4% (Bienes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_s_iva10b" model="account.tax.template">
<field name="name">IVA 10% (Bienes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva0_nd" model="account.tax.template">
<field name="name">21% IVA Soportado no deducible</field>
<field name="l10n_es_type">no_deducible</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_nd" model="account.tax.template">
<field name="name">10% IVA Soportado no deducible</field>
<field name="l10n_es_type">no_deducible</field>
</record>
<record id="l10n_es.account_tax_template_p_iva5_nd" model="account.tax.template">
<field name="name">5% IVA Soportado no deducible</field>
<field name="l10n_es_type">no_deducible</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_nd" model="account.tax.template">
<field name="name">4% IVA Soportado no deducible</field>
<field name="l10n_es_type">no_deducible</field>
</record>
<record id="l10n_es.account_tax_template_s_iva4s" model="account.tax.template">
<field name="name">IVA 4% (Servicios)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_s_iva10s" model="account.tax.template">
<field name="name">IVA 10% (Servicios)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_s_req014" model="account.tax.template">
<field name="name">1.4% Recargo Equivalencia Ventas</field>
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_s_req52" model="account.tax.template">
<field name="name">5.2% Recargo Equivalencia Ventas</field>
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_p_iva0_bc" model="account.tax.template">
<field name="name">IVA Soportado exento (operaciones corrientes)</field>
<field name="l10n_es_type">sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_iva0_ns" model="account.tax.template">
<field name="name">IVA Soportado no sujeto (Servicios)</field>
<field name="l10n_es_type">no_sujeto</field>
<field name="tax_scope">service</field>
</record>
<record id="l10n_es.account_tax_template_p_iva0_ns_b" model="account.tax.template">
<field name="name">IVA Soportado no sujeto (Bienes)</field>
<field name="l10n_es_type">no_sujeto</field>
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf9" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 9%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf18" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 18%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf19" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 19%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf19a" model="account.tax.template">
<field name="name">Retenciones a cuenta 19% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf195a" model="account.tax.template">
<field name="name">Retenciones a cuenta 19,5% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf19" model="account.tax.template">
<field name="name">Retenciones IRPF 19%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf20a" model="account.tax.template">
<field name="name">Retenciones 20% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf18" model="account.tax.template">
<field name="name">Retenciones IRPF 18%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf19a" model="account.tax.template">
<field name="name">Retenciones 19% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf195a" model="account.tax.template">
<field name="name">Retenciones 19,5% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf7" model="account.tax.template">
<field name="name">Retenciones IRPF 7%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf9" model="account.tax.template">
<field name="name">Retenciones IRPF 9%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf24" model="account.tax.template">
<field name="name">Retenciones IRPF 24%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf20" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 20%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf20a" model="account.tax.template">
<field name="name">Retenciones a cuenta 20% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf24" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 24%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_iva12_agr" model="account.tax.template">
<field name="name">12% IVA Soportado régimen agricultura</field>
<field name="l10n_es_type">sujeto_agricultura</field>
</record>
<record id="l10n_es.account_tax_template_p_iva105_gan" model="account.tax.template">
<field name="name">10,5% IVA Soportado régimen ganadero o pesca</field>
<field name="l10n_es_type">sujeto_agricultura</field>
</record>
<record id="l10n_es.account_tax_template_s_iva0_e" model="account.tax.template">
<field name="name">IVA 0% Exportaciones</field>
<field name="l10n_es_type">exento</field>
<field name="l10n_es_exempt_reason">E2</field> <!--E2 for exportation-->
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_s_iva0_ic" model="account.tax.template">
<field name="name">IVA 0% Entregas Intracomunitarias exentas</field>
<field name="l10n_es_type">exento</field>
<field name="l10n_es_exempt_reason">E5</field> <!--E5 for intra-community-->
<field name="tax_scope">consu</field>
</record>
<record id="l10n_es.account_tax_template_p_req014" model="account.tax.template">
<field name="name">1.4% Recargo Equivalencia Compras</field>
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_p_req05" model="account.tax.template">
<field name="name">0.50% Recargo Equivalencia Compras</field>
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_p_req52" model="account.tax.template">
<field name="name">5.2% Recargo Equivalencia Compras</field>
<field name="l10n_es_type">recargo</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf1" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 1%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf2" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 2%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf21" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 21%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf21a" model="account.tax.template">
<field name="name">Retenciones a cuenta 21% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf7" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 7%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpf15" model="account.tax.template">
<field name="name">Retenciones a cuenta IRPF 15%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf1" model="account.tax.template">
<field name="name">Retenciones IRPF 1%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf15" model="account.tax.template">
<field name="name">Retenciones IRPF 15%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf21t" model="account.tax.template">
<field name="name">Retenciones IRPF (Trabajadores)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_sp_in" model="account.tax.template">
<field name="name">IVA 10% Adquisición de servicios intracomunitarios</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_sp_in" model="account.tax.template">
<field name="name">IVA 4% Adquisición de servicios intracomunitarios</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf21te" model="account.tax.template">
<field name="name">Retenciones IRPF (Trabajadores) en especie</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf20" model="account.tax.template">
<field name="name">Retenciones IRPF 20%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf21a" model="account.tax.template">
<field name="name">Retenciones 21% (Arrendamientos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf21p" model="account.tax.template">
<field name="name">Retenciones IRPF 21%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpf2" model="account.tax.template">
<field name="name">Retenciones IRPF 2%</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_iva0_isp" model="account.tax.template">
<field name="name">IVA 0% Venta con Inversión del Sujeto Pasivo</field>
<field name="l10n_es_type">sujeto_isp</field>
</record>
<record id="l10n_es.account_tax_template_p_iva4_isp" model="account.tax.template">
<field name="name">IVA 4% Compra con Inversión del Sujeto Pasivo Nacional</field>
<field name="l10n_es_type">sujeto_isp</field>
</record>
<record id="l10n_es.account_tax_template_p_iva10_isp" model="account.tax.template">
<field name="name">IVA 10% Compra con Inversión del Sujeto Pasivo Nacional</field>
<field name="l10n_es_type">sujeto_isp</field>
</record>
<record id="l10n_es.account_tax_template_p_iva21_isp" model="account.tax.template">
<field name="name">IVA 21% Compra con Inversión del Sujeto Pasivo Nacional</field>
<field name="l10n_es_type">sujeto_isp</field>
</record>
<record id="l10n_es.account_tax_template_p_rp19" model="account.tax.template">
<field name="name">Retenciones 19% (préstamos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_rrD19" model="account.tax.template">
<field name="name">Retenciones 19% (reparto de dividendos)</field>
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpfnrnue24" model="account.tax.template">
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpfnrnue24p" model="account.tax.template">
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_s_irpfnrue19" model="account.tax.template">
<field name="l10n_es_type">retencion</field>
</record>
<record id="l10n_es.account_tax_template_p_irpfnrue19p" model="account.tax.template">
<field name="l10n_es_type">retencion</field>
</record>
</odoo>

View file

@ -1,3 +1,3 @@
-- disable_l10n_es_edi_integration
UPDATE res_company
SET l10n_es_edi_test_env = true;
SET l10n_es_sii_test_env = true;

View file

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="partner_simplified" model="res.partner">
<field name="name">Simplified Invoice Partner (ES)</field>
</record>
</odoo>

View file

@ -1,8 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="demo_certificate" model="l10n_es_edi.certificate">
<field name="content" type="base64" file="l10n_es_edi_sii/demo/certificates/aeat_1234.p12"/>
<field name="password">1234</field>
<field name="company_id" ref="l10n_es.demo_company_es"/>
</record>
<data noupdate="1">
<record id="demo_certificate" model="certificate.certificate">
<field name="name">ES SII Demo Certificate</field>
<field name="content" type="base64" file="l10n_es_edi_sii/demo/certificates/aeat_1234.p12"/>
<field name="pkcs12_password">1234</field>
<field name="scope">sii</field>
<field name="company_id" ref="base.demo_company_es"/>
</record>
</data>
</odoo>

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="base.demo_company_es" model="res.company">
<field name="l10n_es_sii_tax_agency">gipuzkoa</field>
</record>
</odoo>

View file

@ -4,138 +4,82 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Project-Id-Version: Odoo Server 17.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-02-13 13:24+0000\n"
"PO-Revision-Date: 2025-02-13 13:24+0000\n"
"POT-Creation-Date: 2025-12-30 19:06+0000\n"
"PO-Revision-Date: 2025-02-13 13:18+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"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">Registro de Libros connection SII</span>\n"
" <span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
"<span class=\"o_form_label\">Connexión con el Registro de Libros mediante SII</span>\n"
" <span class=\"fa fa-lg fa-building-o\" title=\"Los valores establecidos aquí son específicos de la compañía.\" groups=\"base.group_multi_company\"/>"
#: model:ir.model,name:l10n_es_edi_sii.model_account_move_send
msgid "Account Move Send"
msgstr "Envío de movimiento de cuenta"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_edi_tax_agency__aeat
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_sii_tax_agency__aeat
msgid "Agencia Tributaria española"
msgstr "Agencia Tributaria española"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e1
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e1
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e1
msgid "Art. 20"
msgstr "Art. 20"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e2
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e2
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e2
msgid "Art. 21"
msgstr "Art. 21"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e3
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e3
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e3
msgid "Art. 22"
msgstr "Art. 22"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e4
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e4
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e4
msgid "Art. 23 y 24"
msgstr "Art. 23 y 24"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e5
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e5
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e5
msgid "Art. 25"
msgstr "Art. 25"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax__l10n_es_bien_inversion
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax_template__l10n_es_bien_inversion
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_sii_account_tax_mixin__l10n_es_bien_inversion
msgid "Bien de Inversion"
msgstr "Bien de inversión"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_bank_statement_line__l10n_es_edi_csv
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__l10n_es_edi_csv
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_payment__l10n_es_edi_csv
msgid "CSV return code"
msgstr "Código de devolución CSV"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_certificate_id
msgid "Certificate (ES)"
msgstr "Certificado (ES)"
#: model:ir.model,name:l10n_es_edi_sii.model_certificate_certificate
msgid "Certificate"
msgstr "Certificado"
#. module: l10n_es_edi_sii
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_certificates
msgid "Certificates (ES)"
msgstr "Certificados (ES)"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_certificate_id
msgid "Certificate (SII)"
msgstr "Certificado (SII)"
#. module: l10n_es_edi_sii
#: model:ir.actions.act_window,name:l10n_es_edi_sii.l10n_es_edi_certificate_action
msgid "Certificates for EDI invoices on Spain"
msgstr "Certificados para las facturas EDI en España"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_certificate_certificate__scope
msgid "Certificate scope"
msgstr "Alcance del certificado"
#. module: l10n_es_edi_sii
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_sii_certificates
msgid "Certificates"
msgstr "Certificados"
#. module: l10n_es_edi_sii
#: model:ir.actions.act_window,name:l10n_es_edi_sii.l10n_es_edi_sii_certificate_action
msgid "Certificates for SII EDI invoices on Spain"
msgstr "Certificados para facturas SII EDI de España"
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__company_id
msgid "Company"
msgstr "Compañía"
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_res_config_settings
msgid "Config Settings"
msgstr "Ajustes de configuración"
#. module: l10n_es_edi_sii
#: model_terms:ir.actions.act_window,help:l10n_es_edi_sii.l10n_es_edi_certificate_action
#: model_terms:ir.actions.act_window,help:l10n_es_edi_sii.l10n_es_edi_sii_certificate_action
msgid "Create the first certificate"
msgstr "Crear el primer certificado"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__create_date
msgid "Created on"
msgstr "Creado el"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_end
msgid "Date End"
msgstr "Fecha de finalización"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_start
msgid "Date Start"
msgstr "Fecha de inicio"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_edi_format__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move_send__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_resequence_wizard__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_certificate_certificate__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
@ -145,55 +89,41 @@ msgid "EDI format"
msgstr "Formato EDI"
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_mail_template
msgid "Email Templates"
msgstr "Plantillas de correo electrónico"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax__l10n_es_exempt_reason
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax_template__l10n_es_exempt_reason
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason
msgid "Exempt Reason (Spain)"
msgstr "Motivo de exención (España)"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__exento
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__exento
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__exento
msgid "Exento"
msgstr "Exento"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__content
msgid "File"
msgstr "Archivo"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_edi_tax_agency__bizkaia
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_sii_tax_agency__bizkaia
msgid "Hacienda Foral de Bizkaia"
msgstr "Hacienda Foral de Bizkaia"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_edi_tax_agency__gipuzkoa
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_sii_tax_agency__gipuzkoa
msgid "Hacienda Foral de Gipuzkoa"
msgstr "Hacienda Foral de Gipuzkoa"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_edi_format__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move_send__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_resequence_wizard__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_certificate_certificate__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__id
msgid "ID"
msgstr "ID"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__ignore
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__ignore
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__ignore
msgid "Ignore even the base amount"
msgstr "Ignorar incluso el importe base"
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
msgid ""
"In case of a foreign customer, you need to configure the tax scope on "
"taxes:\n"
"%s"
msgstr ""
"En el caso de un cliente extranjero, es necesario configurar el ámbito "
"fiscal en impuestos:\n"
"%s"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_bank_statement_line__l10n_es_edi_is_required
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__l10n_es_edi_is_required
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_payment__l10n_es_edi_is_required
msgid "Is the Spanish EDI needed"
msgstr "¿Se necesita el EDI español?"
@ -203,77 +133,55 @@ msgid "Journal Entry"
msgstr "Asiento contable"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_certificate_ids
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_certificate_ids
msgid "L10N Es Edi Certificate"
msgstr "L10N Es Certificado EDI"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate____last_update
msgid "Last Modified on"
msgstr "Última modificación el"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_certificate_ids
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_certificate_ids
msgid "L10N Es Sii Certificate"
msgstr "L10N ES Certificado SII"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one main tax."
msgstr "La línea %s solo debe tener un impuesto principal."
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one no sujeto (localizations) tax."
msgstr "La línea %s solo debe tener un impuesto no sujeto (localizaciones)."
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one no sujeto tax."
msgstr "La línea %s solo debe tener un impuesto no sujeto."
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one recargo tax."
msgstr "La línea %s solo debe tener un impuesto de recargo."
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one retention tax."
msgstr "La línea %s solo debe tener un impuesto de retención."
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one sujeto tax."
msgstr "La línea %s solo debe tener un impuesto sujeto."
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "Manage certificates (SII/TicketBAI)"
msgstr "Gestionar certificados (SII/TicketBAI)"
msgid "Manage certificates (SII)"
msgstr "Gestionar certificados (SII)"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid ""
"Networking error:\n"
"%s"
@ -281,70 +189,20 @@ msgstr ""
"Error de red:\n"
"%s"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__no_deducible
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__no_deducible
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__no_deducible
msgid "No Deducible"
msgstr "No deducible"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__no_sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__no_sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__no_sujeto
msgid "No Sujeto"
msgstr "No sujeto"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__no_sujeto_loc
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__no_sujeto_loc
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__no_sujeto_loc
msgid "No Sujeto por reglas de Localization"
msgstr "No sujeto por reglas de localización"
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "No tax agency selected: SII not activated."
msgstr "No se ha seleccionado ninguna agencia tributaria: SII no activado."
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e6
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e6
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e6
msgid "Otros"
msgstr "Otros"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__content
msgid "PFX Certificate"
msgstr "Certificado PFX"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__password
msgid "Passphrase for the PFX certificate"
msgstr "Frase de contraseña para el certificado PFX"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__password
msgid "Password"
msgstr "Contraseña"
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_l10n_es_edi_certificate
msgid "Personal Digital Certificate"
msgstr "Certificado personal de persona física"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Please configure the certificate for SII."
msgstr "Configure el certificado para el SII."
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Please specify a tax agency on your company for SII."
msgstr "Especifique una agencia tributaria en su compañía para el SII"
@ -355,105 +213,55 @@ msgstr ""
"Modo de producción: los datos EDI se envían a los servidores de la agencia "
"oficial."
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__recargo
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__recargo
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__recargo
msgid "Recargo de Equivalencia"
msgstr "Recargo de equivalencia"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_bank_statement_line__l10n_es_registration_date
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__l10n_es_registration_date
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_payment__l10n_es_registration_date
msgid "Registration Date"
msgstr "Fecha de registro"
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "Registro de Libros connection SII"
msgstr "Connexión con el Registro de Libros mediante SII"
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_account_resequence_wizard
msgid "Remake the sequence of Journal Entries."
msgstr "Remake the sequence of Journal Entries."
msgstr "Haga de nuevo la secuencia de asientos contables."
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__retencion
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__retencion
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__retencion
msgid "Retencion"
msgstr "Retención"
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__certificate_certificate__scope__sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.certificate_certificate_view_search
msgid "SII"
msgstr "SII"
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_l10n_es_sii_account_tax_mixin
msgid "SII Fields"
msgstr "Campos SII"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_test_env
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_test_env
msgid "SII Test Mode"
msgstr "Modo de prueba SII"
#. module: l10n_es_edi_sii
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_root
msgid "Spain"
msgstr "España"
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.certificate_certificate_view_search
msgid "SII certificates"
msgstr "Certificados SII"
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "Spain Localization"
msgstr "Localización de España"
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_sii_root
msgid "Spain SII"
msgstr "SII España"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__sujeto
msgid "Sujeto"
msgstr "Sujeto"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__sujeto_agricultura
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__sujeto_agricultura
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__sujeto_agricultura
msgid "Sujeto Agricultura"
msgstr "Sujeto Agricultura"
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__sujeto_isp
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__sujeto_isp
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__sujeto_isp
msgid "Sujeto ISP"
msgstr "Sujeto ISP"
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_account_tax
msgid "Tax"
msgstr "Impuesto"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_tax_agency
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_tax_agency
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_tax_agency
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_tax_agency
msgid "Tax Agency for SII"
msgstr "Agencia Tributaria para SII"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax__l10n_es_type
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax_template__l10n_es_type
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_sii_account_tax_mixin__l10n_es_type
msgid "Tax Type (Spain)"
msgstr "Tipo de impuesto (España)"
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid ""
"Tax agency selected: invoices will be sent by SII for journals where it is "
"activated."
msgid "Tax agency selected: invoices will be sent by SII."
msgstr ""
"Agencia tributaria seleccionada: las facturas serán enviadas por el SII para"
" los diarios en los que esté activado."
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_account_tax_template
msgid "Templates for Taxes"
msgstr "Plantillas para impuestos"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_test_env
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_test_env
msgid "Test Mode"
msgstr "Modo de prueba"
"Agencia tributaria seleccionada: las facturas serán enviadas por el SII."
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
@ -467,79 +275,39 @@ msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "The SSL certificate could not be validated."
msgstr "No se ha podido validar el certificado SSL"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/l10n_es_edi_certificate.py:0
#, python-format
msgid "The certificate is expired since %s"
msgstr "El certificado ha caducado desde %s"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_end
msgid "The date on which the certificate expires"
msgstr "La fecha en la que el certificado caduca."
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_start
msgid "The date on which the certificate starts to be valid"
msgstr "La fecha en la que el certificado comienza a ser válido"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "The web service is not responding"
msgstr "El servicio web no responde"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/l10n_es_edi_certificate.py:0
#, python-format
msgid ""
"There has been a problem with the certificate, some usual problems can be:\n"
"- The password given or the certificate are not valid.\n"
"- The certificate content is invalid."
msgstr ""
"Había un problema con el certificado, algunos problemas habituales pueden ser:\n"
"La contraseña proporcionada o el certificado no son válidos.\n"
"El contenido del certificado no es válido"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "This was accepted with errors: "
msgstr "Esto se ha aceptado con errores:"
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_company__l10n_es_edi_test_env
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_test_env
msgid "Use the test environment"
msgstr "Utilizar el entorno de prueba"
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_company__l10n_es_sii_test_env
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_test_env
msgid "Use the test environment for SII"
msgstr "Utilizar el entorno de prueba para SII"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "VAT number is missing on company %s"
msgstr "Falta el NIF de la compañía %s"
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.l10n_es_edi_certificate_form
msgid "Validity"
msgstr "Validez"
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid ""
"We saw that this invoice was sent correctly before, but we did not treat the"
" response. Make sure it is not because of a wrong configuration."
"We saw that this invoice was sent correctly before, but we did not treat the "
"response. Make sure it is not because of a wrong configuration."
msgstr ""
"Esta factura se ha enviada correctamente antes, pero no procesamos la "
"respuesta. Asegúrese de que no se deba a una configuración incorrecta."
@ -547,14 +315,11 @@ msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "You should put a vendor reference on this vendor bill. "
msgstr ""
"Debe poner una referencia del proveedor en esta factura del proveedor."
msgstr "Debe poner una referencia del proveedor en esta factura del proveedor."
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "[%s] %s"
msgstr "[%s] %s"
msgid "[%(error_code)s] %(error_message)s"
msgstr "[%(error_code)s] %(error_message)s"

View file

@ -4,10 +4,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Project-Id-Version: Odoo Server 19.0+e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-05-20 09:26+0000\n"
"PO-Revision-Date: 2025-05-20 09:26+0000\n"
"POT-Creation-Date: 2025-12-30 19:06+0000\n"
"PO-Revision-Date: 2025-12-30 19:06+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -16,79 +16,44 @@ msgstr ""
"Plural-Forms: \n"
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid ""
"<span class=\"o_form_label\">Registro de Libros connection SII</span>\n"
" <span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-specific.\" groups=\"base.group_multi_company\"/>"
#: model:ir.model,name:l10n_es_edi_sii.model_account_move_send
msgid "Account Move Send"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_edi_tax_agency__aeat
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_sii_tax_agency__aeat
msgid "Agencia Tributaria española"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e1
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e1
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e1
msgid "Art. 20"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e2
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e2
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e2
msgid "Art. 21"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e3
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e3
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e3
msgid "Art. 22"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e4
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e4
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e4
msgid "Art. 23 y 24"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e5
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e5
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e5
msgid "Art. 25"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax__l10n_es_bien_inversion
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax_template__l10n_es_bien_inversion
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_sii_account_tax_mixin__l10n_es_bien_inversion
msgid "Bien de Inversion"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_bank_statement_line__l10n_es_edi_csv
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__l10n_es_edi_csv
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_payment__l10n_es_edi_csv
msgid "CSV return code"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_certificate_id
msgid "Certificate (ES)"
#: model:ir.model,name:l10n_es_edi_sii.model_certificate_certificate
msgid "Certificate"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_certificates
msgid "Certificates (ES)"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_certificate_id
msgid "Certificate (SII)"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.actions.act_window,name:l10n_es_edi_sii.l10n_es_edi_certificate_action
msgid "Certificates for EDI invoices on Spain"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_certificate_certificate__scope
msgid "Certificate scope"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_sii_certificates
msgid "Certificates"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.actions.act_window,name:l10n_es_edi_sii.l10n_es_edi_sii_certificate_action
msgid "Certificates for SII EDI invoices on Spain"
msgstr ""
#. module: l10n_es_edi_sii
@ -96,43 +61,24 @@ msgstr ""
msgid "Companies"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__company_id
msgid "Company"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: l10n_es_edi_sii
#: model_terms:ir.actions.act_window,help:l10n_es_edi_sii.l10n_es_edi_certificate_action
#: model_terms:ir.actions.act_window,help:l10n_es_edi_sii.l10n_es_edi_sii_certificate_action
msgid "Create the first certificate"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__create_uid
msgid "Created by"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__create_date
msgid "Created on"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_end
msgid "Date End"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_start
msgid "Date Start"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_edi_format__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move_send__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_resequence_wizard__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_certificate_certificate__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__display_name
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__display_name
msgid "Display Name"
msgstr ""
@ -142,55 +88,37 @@ msgid "EDI format"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_mail_template
msgid "Email Templates"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax__l10n_es_exempt_reason
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax_template__l10n_es_exempt_reason
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason
msgid "Exempt Reason (Spain)"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__exento
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__exento
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__exento
msgid "Exento"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__content
msgid "File"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_edi_tax_agency__bizkaia
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_sii_tax_agency__bizkaia
msgid "Hacienda Foral de Bizkaia"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_edi_tax_agency__gipuzkoa
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__res_company__l10n_es_sii_tax_agency__gipuzkoa
msgid "Hacienda Foral de Gipuzkoa"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_edi_format__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move_send__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_resequence_wizard__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_certificate_certificate__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__id
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__id
msgid "ID"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__ignore
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__ignore
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__ignore
msgid "Ignore even the base amount"
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
msgid ""
"In case of a foreign customer, you need to configure the tax scope on taxes:\n"
"%s"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_bank_statement_line__l10n_es_edi_is_required
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__l10n_es_edi_is_required
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_payment__l10n_es_edi_is_required
msgid "Is the Spanish EDI needed"
msgstr ""
@ -200,146 +128,74 @@ msgid "Journal Entry"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_certificate_ids
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_certificate_ids
msgid "L10N Es Edi Certificate"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate____last_update
msgid "Last Modified on"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__write_uid
msgid "Last Updated by"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__write_date
msgid "Last Updated on"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_certificate_ids
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_certificate_ids
msgid "L10N Es Sii Certificate"
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one main tax."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one no sujeto (localizations) tax."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one no sujeto tax."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one recargo tax."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one retention tax."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Line %s should only have one sujeto tax."
msgstr ""
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "Manage certificates (SII/TicketBAI)"
msgid "Manage certificates (SII)"
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid ""
"Networking error:\n"
"%s"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__no_deducible
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__no_deducible
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__no_deducible
msgid "No Deducible"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__no_sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__no_sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__no_sujeto
msgid "No Sujeto"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__no_sujeto_loc
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__no_sujeto_loc
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__no_sujeto_loc
msgid "No Sujeto por reglas de Localization"
msgstr ""
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "No tax agency selected: SII not activated."
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_exempt_reason__e6
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_exempt_reason__e6
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_exempt_reason__e6
msgid "Otros"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__content
msgid "PFX Certificate"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__password
msgid "Passphrase for the PFX certificate"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_edi_certificate__password
msgid "Password"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_l10n_es_edi_certificate
msgid "Personal Digital Certificate"
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Please configure the certificate for SII."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "Please specify a tax agency on your company for SII."
msgstr ""
@ -349,17 +205,14 @@ msgid "Production mode: EDI data is sent to the official agency servers."
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__recargo
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__recargo
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__recargo
msgid "Recargo de Equivalencia"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_bank_statement_line__l10n_es_registration_date
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__l10n_es_registration_date
msgid "Registration Date"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_bank_statement_line__l10n_es_registration_date
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_move__l10n_es_registration_date
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_payment__l10n_es_registration_date
msgid "Registration Date"
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "Registro de Libros connection SII"
msgstr ""
#. module: l10n_es_edi_sii
@ -368,82 +221,36 @@ msgid "Remake the sequence of Journal Entries."
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__retencion
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__retencion
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__retencion
msgid "Retencion"
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__certificate_certificate__scope__sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.certificate_certificate_view_search
msgid "SII"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_l10n_es_sii_account_tax_mixin
msgid "SII Fields"
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_test_env
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_test_env
msgid "SII Test Mode"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_root
msgid "Spain"
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.certificate_certificate_view_search
msgid "SII certificates"
msgstr ""
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid "Spain Localization"
#: model:ir.ui.menu,name:l10n_es_edi_sii.menu_l10n_es_edi_sii_root
msgid "Spain SII"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__sujeto
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__sujeto
msgid "Sujeto"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__sujeto_agricultura
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__sujeto_agricultura
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__sujeto_agricultura
msgid "Sujeto Agricultura"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax__l10n_es_type__sujeto_isp
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__account_tax_template__l10n_es_type__sujeto_isp
#: model:ir.model.fields.selection,name:l10n_es_edi_sii.selection__l10n_es_sii_account_tax_mixin__l10n_es_type__sujeto_isp
msgid "Sujeto ISP"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_account_tax
msgid "Tax"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_tax_agency
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_tax_agency
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_sii_tax_agency
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_tax_agency
msgid "Tax Agency for SII"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax__l10n_es_type
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_account_tax_template__l10n_es_type
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_l10n_es_sii_account_tax_mixin__l10n_es_type
msgid "Tax Type (Spain)"
msgstr ""
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.res_config_settings_view_form
msgid ""
"Tax agency selected: invoices will be sent by SII for journals where it is "
"activated."
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model,name:l10n_es_edi_sii.model_account_tax_template
msgid "Templates for Taxes"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_company__l10n_es_edi_test_env
#: model:ir.model.fields,field_description:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_test_env
msgid "Test Mode"
msgid "Tax agency selected: invoices will be sent by SII."
msgstr ""
#. module: l10n_es_edi_sii
@ -456,73 +263,36 @@ msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "The SSL certificate could not be validated."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/l10n_es_edi_certificate.py:0
#, python-format
msgid "The certificate is expired since %s"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_end
msgid "The date on which the certificate expires"
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_l10n_es_edi_certificate__date_start
msgid "The date on which the certificate starts to be valid"
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "The web service is not responding"
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/l10n_es_edi_certificate.py:0
#, python-format
msgid ""
"There has been a problem with the certificate, some usual problems can be:\n"
"- The password given or the certificate are not valid.\n"
"- The certificate content is invalid."
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "This was accepted with errors: "
msgstr ""
#. module: l10n_es_edi_sii
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_company__l10n_es_edi_test_env
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_config_settings__l10n_es_edi_test_env
msgid "Use the test environment"
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_company__l10n_es_sii_test_env
#: model:ir.model.fields,help:l10n_es_edi_sii.field_res_config_settings__l10n_es_sii_test_env
msgid "Use the test environment for SII"
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "VAT number is missing on company %s"
msgstr ""
#. module: l10n_es_edi_sii
#: model_terms:ir.ui.view,arch_db:l10n_es_edi_sii.l10n_es_edi_certificate_form
msgid "Validity"
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid ""
"We saw that this invoice was sent correctly before, but we did not treat the"
" response. Make sure it is not because of a wrong configuration."
@ -531,13 +301,11 @@ msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "You should put a vendor reference on this vendor bill. "
msgstr ""
#. module: l10n_es_edi_sii
#. odoo-python
#: code:addons/l10n_es_edi_sii/models/account_edi_format.py:0
#, python-format
msgid "[%s] %s"
msgid "[%(error_code)s] %(error_message)s"
msgstr ""

View file

@ -1,9 +1,8 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import account_edi_format
from . import account_move_send
from . import account_move
from . import account_tax
from . import l10n_es_edi_certificate
from . import mail_template
from . import certificate
from . import res_company
from . import res_config_settings

View file

@ -1,58 +1,18 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from urllib3.util.ssl_ import create_urllib3_context, DEFAULT_CIPHERS
from urllib3.contrib.pyopenssl import inject_into_urllib3
from OpenSSL.crypto import load_certificate, load_privatekey, FILETYPE_PEM
from odoo import fields, models, _
from odoo.tools import html_escape, zeep
import math
import json
import math
from collections import defaultdict
import requests
from odoo import _, fields, models
from odoo.tools import html_escape, zeep
from odoo.tools.float_utils import float_round
from odoo.addons.certificate.tools import CertificateAdapter
# Custom patches to perform the WSDL requests.
EUSKADI_CIPHERS = f"{DEFAULT_CIPHERS}:!DH"
class PatchedHTTPAdapter(requests.adapters.HTTPAdapter):
""" An adapter to block DH ciphers which may not work for the tax agencies called"""
def init_poolmanager(self, *args, **kwargs):
# OVERRIDE
inject_into_urllib3()
kwargs['ssl_context'] = create_urllib3_context(ciphers=EUSKADI_CIPHERS)
return super().init_poolmanager(*args, **kwargs)
def cert_verify(self, conn, url, verify, cert):
# OVERRIDE
# The last parameter is only used by the super method to check if the file exists.
# In our case, cert is an odoo record 'l10n_es_edi.certificate' so not a path to a file.
# By putting 'None' as last parameter, we ensure the check about TLS configuration is
# still made without checking temporary files exist.
super().cert_verify(conn, url, verify, None)
conn.cert_file = cert
conn.key_file = None
def get_connection(self, url, proxies=None):
# OVERRIDE
# Patch the OpenSSLContext to decode the certificate in-memory.
conn = super().get_connection(url, proxies=proxies)
context = conn.conn_kw['ssl_context']
def patched_load_cert_chain(l10n_es_odoo_certificate, keyfile=None, password=None):
cert_file, key_file, _certificate = l10n_es_odoo_certificate.sudo()._decode_certificate()
cert_obj = load_certificate(FILETYPE_PEM, cert_file)
pkey_obj = load_privatekey(FILETYPE_PEM, key_file)
context._ctx.use_certificate(cert_obj)
context._ctx.use_privatekey(pkey_obj)
context.load_cert_chain = patched_load_cert_chain
return conn
# Avoid failure on servers where the DH key is too small
EUSKADI_CIPHERS = "DEFAULT:!DH"
class AccountEdiFormat(models.Model):
@ -64,8 +24,8 @@ class AccountEdiFormat(models.Model):
def _l10n_es_edi_get_invoices_tax_details_info(self, invoice, filter_invl_to_apply=None):
def grouping_key_generator(base_line, tax_values):
tax = tax_values['tax_repartition_line'].tax_id
def grouping_key_generator(base_line, tax_data):
tax = tax_data['tax']
return {
'applied_tax_amount': tax.amount,
'l10n_es_type': tax.l10n_es_type,
@ -73,12 +33,16 @@ class AccountEdiFormat(models.Model):
'l10n_es_bien_inversion': tax.l10n_es_bien_inversion,
}
def filter_to_apply(base_line, tax_values):
def filter_to_apply(base_line, tax_data):
# For intra-community, we do not take into account the negative repartition line
return tax_values['tax_repartition_line'].factor_percent > 0.0
return (
not tax_data['is_reverse_charge']
and tax_data['tax'].amount != -100.0
and tax_data['tax'].l10n_es_type != 'ignore'
)
def full_filter_invl_to_apply(invoice_line):
if 'ignore' in invoice_line.tax_ids.flatten_taxes_hierarchy().mapped('l10n_es_type'):
if all(t == 'ignore' for t in invoice_line.tax_ids.flatten_taxes_hierarchy().mapped('l10n_es_type')):
return False
return filter_invl_to_apply(invoice_line) if filter_invl_to_apply else True
@ -94,31 +58,38 @@ class AccountEdiFormat(models.Model):
# Detect for which is the main tax for 'recargo'. Since only a single combination tax + recargo is allowed
# on the same invoice, this can be deduced globally.
recargo_tax_details = {} # Mapping between main tax and recargo tax details
invoice_lines = invoice.invoice_line_ids.filtered(lambda x: x.display_type not in ('line_note', 'line_section'))
if filter_invl_to_apply:
invoice_lines = invoice_lines.filtered(filter_invl_to_apply)
for line in invoice_lines:
# Mapping between main tax and recargo tax details
# structure: {("l10n_es_type" of the main tax, amount of the main tax): {'tax_amount': float, 'applied_tax_amount': float}}
# dict of keys: tuple ("l10n_es_type" of the main tax, amount of the main tax)
# values: dict of float
recargo_tax_details = defaultdict(lambda: defaultdict(float))
for base_line in tax_details['base_lines']:
line = base_line['record']
taxes = line.tax_ids.flatten_taxes_hierarchy()
recargo_tax = [t for t in taxes if t.l10n_es_type == 'recargo']
recargo_tax = taxes.filtered(lambda t: t.l10n_es_type == 'recargo')[:1]
if recargo_tax and taxes:
recargo_main_tax = taxes.filtered(lambda x: x.l10n_es_type in ('sujeto', 'sujeto_isp'))[:1]
if not recargo_tax_details.get(recargo_main_tax):
recargo_tax_details[recargo_main_tax] = [
x for x in tax_details['tax_details'].values()
if x['group_tax_details'][0]['tax_repartition_line'].tax_id == recargo_tax[0]
][0]
aggregated_values = tax_details['tax_details_per_record'][line]
recargo_values = next(iter(
values
for values in aggregated_values['tax_details'].values()
if (
values['grouping_key']
and values['grouping_key']['l10n_es_type'] == recargo_tax.l10n_es_type
and values['grouping_key']['applied_tax_amount'] == recargo_tax.amount
)
))
recargo_tax_details[recargo_main_tax.l10n_es_type, recargo_main_tax.amount]['tax_amount'] += recargo_values['tax_amount']
recargo_tax_details[recargo_main_tax.l10n_es_type, recargo_main_tax.amount]['applied_tax_amount'] = recargo_values['applied_tax_amount']
tax_amount_deductible = 0.0
tax_amount_retention = 0.0
base_amount_not_subject = 0.0
base_amount_not_subject_loc = 0.0
has_not_subject = False
has_not_subject_loc = False
tax_subject_info_list = []
tax_subject_isp_info_list = []
for tax_values in tax_details['tax_details'].values():
recargo = recargo_tax_details.get((tax_values['l10n_es_type'], tax_values['applied_tax_amount']))
if invoice.is_sale_document():
# Customer invoices
@ -128,13 +99,12 @@ class AccountEdiFormat(models.Model):
base_amount = sign * tax_values['base_amount']
tax_info = {
'TipoImpositivo': tax_values['applied_tax_amount'],
'BaseImponible': round(base_amount, 2),
'CuotaRepercutida': round(math.copysign(tax_values['tax_amount'], base_amount), 2),
'BaseImponible': float_round(base_amount, 2),
'CuotaRepercutida': float_round(math.copysign(tax_values['tax_amount'], base_amount), 2),
}
recargo = recargo_tax_details.get(tax_values['group_tax_details'][0]['tax_repartition_line'].tax_id)
if recargo:
tax_info['CuotaRecargoEquivalencia'] = round(sign * recargo['tax_amount'], 2)
tax_info['CuotaRecargoEquivalencia'] = float_round(sign * recargo['tax_amount'], 2)
tax_info['TipoRecargoEquivalencia'] = recargo['applied_tax_amount']
if tax_values['l10n_es_type'] == 'sujeto':
@ -145,31 +115,27 @@ class AccountEdiFormat(models.Model):
elif tax_values['l10n_es_type'] == 'exento':
tax_details_info['Sujeta'].setdefault('Exenta', {'DetalleExenta': []})
tax_details_info['Sujeta']['Exenta']['DetalleExenta'].append({
'BaseImponible': round(sign * tax_values['base_amount'], 2),
'BaseImponible': float_round(sign * tax_values['base_amount'], 2),
'CausaExencion': tax_values['l10n_es_exempt_reason'],
})
elif tax_values['l10n_es_type'] == 'retencion':
tax_amount_retention += tax_values['tax_amount']
elif tax_values['l10n_es_type'] == 'no_sujeto':
has_not_subject = True
base_amount_not_subject += tax_values['base_amount']
elif tax_values['l10n_es_type'] == 'no_sujeto_loc':
has_not_subject_loc = True
base_amount_not_subject_loc += tax_values['base_amount']
elif tax_values['l10n_es_type'] == 'ignore':
continue
else:
# Vendor bills
if tax_values['l10n_es_type'] in ('sujeto', 'sujeto_isp', 'no_sujeto', 'no_sujeto_loc'):
if tax_values['l10n_es_type'] in ('sujeto', 'sujeto_isp', 'no_sujeto', 'no_sujeto_loc', 'dua'):
tax_amount_deductible += tax_values['tax_amount']
elif tax_values['l10n_es_type'] == 'retencion':
tax_amount_retention += tax_values['tax_amount']
elif tax_values['l10n_es_type'] == 'no_sujeto':
has_not_subject = True
base_amount_not_subject += tax_values['base_amount']
elif tax_values['l10n_es_type'] == 'no_sujeto_loc':
has_not_subject_loc = True
base_amount_not_subject_loc += tax_values['base_amount']
elif tax_values['l10n_es_type'] == 'ignore':
continue
@ -178,7 +144,7 @@ class AccountEdiFormat(models.Model):
base_amount = sign * tax_values['base_amount']
tax_details_info.setdefault('DetalleIVA', [])
tax_info = {
'BaseImponible': round(base_amount, 2),
'BaseImponible': float_round(base_amount, 2),
}
if tax_values['l10n_es_type'] == 'sujeto_agricultura':
tax_info.update({
@ -188,13 +154,12 @@ class AccountEdiFormat(models.Model):
elif tax_values['applied_tax_amount'] > 0.0:
tax_info.update({
'TipoImpositivo': tax_values['applied_tax_amount'],
'CuotaSoportada': round(math.copysign(tax_values['tax_amount'], base_amount), 2),
'CuotaSoportada': float_round(math.copysign(tax_values['tax_amount'], base_amount), 2),
})
if tax_values['l10n_es_bien_inversion']:
tax_info['BienInversion'] = 'S'
recargo = recargo_tax_details.get(tax_values['group_tax_details'][0]['tax_repartition_line'].tax_id)
if recargo:
tax_info['CuotaRecargoEquivalencia'] = round(sign * recargo['tax_amount'], 2)
tax_info['CuotaRecargoEquivalencia'] = float_round(sign * recargo['tax_amount'], 2)
tax_info['TipoRecargoEquivalencia'] = recargo['applied_tax_amount']
tax_details_info['DetalleIVA'].append(tax_info)
@ -214,10 +179,15 @@ class AccountEdiFormat(models.Model):
tax_details_info['Sujeta']['NoExenta']['DesgloseIVA'].setdefault('DetalleIVA', [])
tax_details_info['Sujeta']['NoExenta']['DesgloseIVA']['DetalleIVA'] += tax_subject_isp_info_list
if has_not_subject and invoice.is_sale_document():
tax_details_info['NoSujeta']['ImportePorArticulos7_14_Otros'] = round(sign * base_amount_not_subject, 2)
if has_not_subject_loc and invoice.is_sale_document():
tax_details_info['NoSujeta']['ImporteTAIReglasLocalizacion'] = round(sign * base_amount_not_subject_loc, 2)
if not invoice.company_id.currency_id.is_zero(base_amount_not_subject) and invoice.is_sale_document():
tax_details_info['NoSujeta']['ImportePorArticulos7_14_Otros'] = float_round(sign * base_amount_not_subject, 2)
if not invoice.company_id.currency_id.is_zero(base_amount_not_subject_loc) and invoice.is_sale_document():
tax_details_info['NoSujeta']['ImporteTAIReglasLocalizacion'] = float_round(sign * base_amount_not_subject_loc, 2)
if not tax_details_info and invoice.is_sale_document():
if any(t['l10n_es_type'] == 'no_sujeto' for t in tax_details['tax_details'].values()):
tax_details_info['NoSujeta']['ImportePorArticulos7_14_Otros'] = 0
if any(t['l10n_es_type'] == 'no_sujeto_loc' for t in tax_details['tax_details'].values()):
tax_details_info['NoSujeta']['ImporteTAIReglasLocalizacion'] = 0
return {
'tax_details_info': tax_details_info,
@ -230,39 +200,15 @@ class AccountEdiFormat(models.Model):
}
def _l10n_es_edi_get_partner_info(self, partner):
eu_country_codes = set(self.env.ref('base.europe').country_ids.mapped('code'))
partner_info = {}
IDOtro_ID = partner.vat or 'NO_DISPONIBLE'
if (not partner.country_id or partner.country_id.code == 'ES') and partner.vat:
# ES partner with VAT.
partner_info['NIF'] = partner.vat[2:] if partner.vat.startswith('ES') else partner.vat
if self.env.context.get('error_1117'):
partner_info['IDOtro'] = {'IDType': '07', 'ID': IDOtro_ID}
elif partner.country_id.code in eu_country_codes and partner.vat:
# European partner.
partner_info['IDOtro'] = {'IDType': '02', 'ID': IDOtro_ID}
else:
partner_info['IDOtro'] = {'ID': IDOtro_ID}
if partner.vat:
partner_info['IDOtro']['IDType'] = '04'
else:
partner_info['IDOtro']['IDType'] = '06'
if partner.country_id:
partner_info['IDOtro']['CodigoPais'] = partner.country_id.code
return partner_info
return partner._l10n_es_edi_get_partner_info()
def _l10n_es_edi_get_invoices_info(self, invoices):
eu_country_codes = set(self.env.ref('base.europe').country_ids.mapped('code'))
simplified_partner = self.env.ref("l10n_es_edi_sii.partner_simplified")
info_list = []
for invoice in invoices:
com_partner = invoice.commercial_partner_id
is_simplified = invoice.partner_id == simplified_partner
is_simplified = invoice.l10n_es_is_simplified
info = {
'PeriodoLiquidacion': {
@ -285,6 +231,8 @@ class AccountEdiFormat(models.Model):
# === Invoice ===
if invoice.delivery_date and invoice.delivery_date != invoice.invoice_date:
invoice_node['FechaOperacion'] = invoice.delivery_date.strftime('%d-%m-%Y')
invoice_node['DescripcionOperacion'] = invoice.invoice_origin[:500] if invoice.invoice_origin else 'manual'
reagyp = invoice.invoice_line_ids.tax_ids.filtered(lambda t: t.l10n_es_type == 'sujeto_agricultura')
if invoice.is_sale_document():
@ -296,17 +244,10 @@ class AccountEdiFormat(models.Model):
**partner_info,
'NombreRazon': com_partner.name[:120],
}
export_exempts = invoice.invoice_line_ids.tax_ids.filtered(lambda t: t.l10n_es_exempt_reason == 'E2')
# If an invoice line contains an OSS tax, the invoice is considered as an OSS operation
is_oss = self._has_oss_taxes(invoice)
if is_oss:
invoice_node['ClaveRegimenEspecialOTrascendencia'] = '17'
elif export_exempts:
invoice_node['ClaveRegimenEspecialOTrascendencia'] = '02'
else:
invoice_node['ClaveRegimenEspecialOTrascendencia'] = '01'
invoice_node['ClaveRegimenEspecialOTrascendencia'] = invoice.invoice_line_ids.tax_ids._l10n_es_get_regime_code()
else:
if invoice._l10n_es_is_dua():
partner_info = self._l10n_es_edi_get_partner_info(invoice.company_id.partner_id)
info['IDFactura']['IDEmisorFactura'] = partner_info
# In case of cancel
info["IDFactura"]["IDEmisorFactura"].update(
@ -324,9 +265,9 @@ class AccountEdiFormat(models.Model):
else:
invoice_node['FechaRegContable'] = fields.Date.context_today(self).strftime('%d-%m-%Y')
mod_303_10 = self.env.ref('l10n_es.mod_303_10')
mod_303_11 = self.env.ref('l10n_es.mod_303_11')
tax_tags = invoice.invoice_line_ids.tax_ids.invoice_repartition_line_ids.tag_ids
mod_303_10 = self.env.ref('l10n_es.mod_303_casilla_10_balance')._get_matching_tags()
mod_303_11 = self.env.ref('l10n_es.mod_303_casilla_11_balance')._get_matching_tags()
tax_tags = invoice.invoice_line_ids.tax_ids.repartition_line_ids.tag_ids
intracom = bool(tax_tags & (mod_303_10 + mod_303_11))
if intracom:
invoice_node['ClaveRegimenEspecialOTrascendencia'] = '09'
@ -343,6 +284,8 @@ class AccountEdiFormat(models.Model):
elif invoice.move_type == 'in_invoice':
if reagyp:
invoice_node['TipoFactura'] = 'F6'
elif invoice._l10n_es_is_dua():
invoice_node['TipoFactura'] = 'F5'
else:
invoice_node['TipoFactura'] = 'F1'
elif invoice.move_type == 'in_refund':
@ -355,12 +298,11 @@ class AccountEdiFormat(models.Model):
if invoice.is_sale_document():
# Customer invoices
if (com_partner.country_id.code in ('ES', False) and not (com_partner.vat or '').startswith("ESN")) or is_simplified:
if not com_partner._l10n_es_is_foreign() or is_simplified:
tax_details_info_vals = self._l10n_es_edi_get_invoices_tax_details_info(invoice)
invoice_node['TipoDesglose'] = {'DesgloseFactura': tax_details_info_vals['tax_details_info']}
invoice_node['ImporteTotal'] = round(sign * (
invoice_node['ImporteTotal'] = float_round(sign * (
tax_details_info_vals['tax_details']['base_amount']
+ tax_details_info_vals['tax_details']['tax_amount']
- tax_details_info_vals['tax_amount_retention']
@ -384,7 +326,7 @@ class AccountEdiFormat(models.Model):
invoice_node['TipoDesglose'].setdefault('DesgloseTipoOperacion', {})
invoice_node['TipoDesglose']['DesgloseTipoOperacion']['Entrega'] = tax_details_info_consu_vals['tax_details_info']
invoice_node['ImporteTotal'] = round(sign * (
invoice_node['ImporteTotal'] = float_round(sign * (
tax_details_info_service_vals['tax_details']['base_amount']
+ tax_details_info_service_vals['tax_details']['tax_amount']
- tax_details_info_service_vals['tax_amount_retention']
@ -411,19 +353,19 @@ class AccountEdiFormat(models.Model):
if tax_details_info_other_vals['tax_details_info']:
invoice_node['DesgloseFactura']['DesgloseIVA'] = tax_details_info_other_vals['tax_details_info']
if any(t.l10n_es_type == 'ignore' for t in invoice.invoice_line_ids.tax_ids):
invoice_node['ImporteTotal'] = round(sign * (
if invoice._l10n_es_is_dua() or any(t.l10n_es_type == 'ignore' for t in invoice.invoice_line_ids.tax_ids):
invoice_node['ImporteTotal'] = float_round(sign * (
tax_details_info_isp_vals['tax_details']['base_amount']
+ tax_details_info_isp_vals['tax_details']['tax_amount']
+ tax_details_info_other_vals['tax_details']['base_amount']
+ tax_details_info_other_vals['tax_details']['tax_amount']
), 2)
else: # Intra-community -100 repartition line needs to be taken into account
invoice_node['ImporteTotal'] = round(-invoice.amount_total_signed
invoice_node['ImporteTotal'] = float_round(-invoice.amount_total_signed
- sign * tax_details_info_isp_vals['tax_amount_retention']
- sign * tax_details_info_other_vals['tax_amount_retention'], 2)
invoice_node['CuotaDeducible'] = round(sign * (
invoice_node['CuotaDeducible'] = float_round(sign * (
tax_details_info_isp_vals['tax_amount_deductible']
+ tax_details_info_other_vals['tax_amount_deductible']
), 2)
@ -484,8 +426,8 @@ class AccountEdiFormat(models.Model):
# === Call the web service ===
# Get connection data.
l10n_es_edi_tax_agency = company.mapped('l10n_es_edi_tax_agency')[0]
connection_vals = getattr(self, f'_l10n_es_edi_web_service_{l10n_es_edi_tax_agency}_vals')(invoices)
l10n_es_sii_tax_agency = company.mapped('l10n_es_sii_tax_agency')[0]
connection_vals = getattr(self, f'_l10n_es_edi_web_service_{l10n_es_sii_tax_agency}_vals')(invoices)
header = {
'IDVersionSii': '1.1',
@ -497,8 +439,8 @@ class AccountEdiFormat(models.Model):
}
session = requests.Session()
session.cert = company.l10n_es_edi_certificate_id
session.mount('https://', PatchedHTTPAdapter())
session.cert = company.l10n_es_sii_certificate_id
session.mount('https://', CertificateAdapter(ciphers=EUSKADI_CIPHERS))
client = zeep.Client(connection_vals['url'], operation_timeout=60, timeout=60, session=session)
@ -506,12 +448,12 @@ class AccountEdiFormat(models.Model):
service_name = 'SuministroFactEmitidas'
else:
service_name = 'SuministroFactRecibidas'
if company.l10n_es_edi_test_env and not connection_vals.get('test_url'):
if company.l10n_es_sii_test_env and not connection_vals.get('test_url'):
service_name += 'Pruebas'
# Establish the connection.
serv = client.bind('siiService', service_name)
if company.l10n_es_edi_test_env and connection_vals.get('test_url'):
if company.l10n_es_sii_test_env and connection_vals.get('test_url'):
serv._binding_options['address'] = connection_vals['test_url']
error_msg = None
@ -568,11 +510,14 @@ class AccountEdiFormat(models.Model):
else:
# 'ref' can be the same for different partners.
candidates = invoices.filtered(lambda x: x.ref[:60] == invoice_number)
if len(candidates) >= 1:
if len(candidates) > 1:
respl_partner_info = respl.IDFactura.IDEmisorFactura
inv = None
for candidate in candidates:
partner_info = self._l10n_es_edi_get_partner_info(candidate.commercial_partner_id)
partner = candidate.commercial_partner_id
if candidate._l10n_es_is_dua():
partner = candidate.company_id.partner_id
partner_info = self._l10n_es_edi_get_partner_info(partner)
if partner_info.get('NIF') and partner_info['NIF'] == respl_partner_info.NIF:
inv = candidate
break
@ -614,18 +559,12 @@ class AccountEdiFormat(models.Model):
else:
results[inv] = {
'error': _("[%s] %s", respl.CodigoErrorRegistro, respl.DescripcionErrorRegistro),
'error': _("[%(error_code)s] %(error_message)s", error_code=respl.CodigoErrorRegistro, error_message=respl.DescripcionErrorRegistro),
'blocking_level': 'error',
}
return results
def _has_oss_taxes(self, invoice):
oss_tag = self.env.ref('l10n_eu_oss.tag_oss', raise_if_not_found=False)
lines = invoice.invoice_line_ids.filtered(lambda line: line.display_type not in ('line_section', 'line_note'))
tags = (lines.tax_ids.invoice_repartition_line_ids | lines.tax_ids.refund_repartition_line_ids).tag_ids
return bool(oss_tag and oss_tag in tags)
# -------------------------------------------------------------------------
# EDI OVERRIDDEN METHODS
# -------------------------------------------------------------------------
@ -659,8 +598,10 @@ class AccountEdiFormat(models.Model):
if not move.company_id.vat:
res.append(_("VAT number is missing on company %s", move.company_id.display_name))
for line in move.invoice_line_ids.filtered(lambda line: line.display_type not in ('line_note', 'line_section')):
total_taxes = self.env['account.tax']
for line in move.invoice_line_ids.filtered(lambda line: line.display_type not in ('line_section', 'line_subsection', 'line_note')):
taxes = line.tax_ids.flatten_taxes_hierarchy()
total_taxes |= taxes
recargo_count = taxes.mapped('l10n_es_type').count('recargo')
retention_count = taxes.mapped('l10n_es_type').count('retencion')
sujeto_count = taxes.mapped('l10n_es_type').count('sujeto')
@ -678,6 +619,11 @@ class AccountEdiFormat(models.Model):
res.append(_("Line %s should only have one no sujeto (localizations) tax.", line.display_name))
if sujeto_count + no_sujeto_loc_count + no_sujeto_count > 1:
res.append(_("Line %s should only have one main tax.", line.display_name))
if move.is_inbound() and move.commercial_partner_id._l10n_es_is_foreign() and not any(t.tax_scope for t in total_taxes):
res.append(
_("In case of a foreign customer, you need to configure the tax scope on taxes:\n%s",
"\n".join(total_taxes.mapped('name')))
)
if move.move_type in ('in_invoice', 'in_refund'):
if not move.ref:
res.append(_("You should put a vendor reference on this vendor bill. "))
@ -692,7 +638,7 @@ class AccountEdiFormat(models.Model):
def _l10n_es_edi_sii_send(self, invoices, cancel=False):
# Ensure a certificate is available.
certificate = invoices.company_id.l10n_es_edi_certificate_id
certificate = invoices.company_id.l10n_es_sii_certificate_id
if not certificate:
return {inv: {
'error': _("Please configure the certificate for SII."),
@ -700,8 +646,8 @@ class AccountEdiFormat(models.Model):
} for inv in invoices}
# Ensure a tax agency is available.
l10n_es_edi_tax_agency = invoices.company_id.mapped('l10n_es_edi_tax_agency')[0]
if not l10n_es_edi_tax_agency:
l10n_es_sii_tax_agency = invoices.company_id.mapped('l10n_es_sii_tax_agency')[0]
if not l10n_es_sii_tax_agency:
return {inv: {
'error': _("Please specify a tax agency on your company for SII."),
'blocking_level': 'error',

View file

@ -22,12 +22,22 @@ class AccountMove(models.Model):
# COMPUTE METHODS
# -------------------------------------------------------------------------
@api.depends('move_type', 'company_id')
@api.depends('move_type', 'company_id', 'invoice_line_ids.tax_ids')
def _compute_l10n_es_edi_is_required(self):
for move in self:
has_tax = True
# Check it is not an importation invoice (which will be report through the DUA invoice)
if move.is_purchase_document():
taxes = move.invoice_line_ids.tax_ids
has_tax = any(t.l10n_es_type and t.l10n_es_type != 'ignore' for t in taxes)
move.l10n_es_edi_is_required = move.is_invoice() \
and move.country_code == 'ES' \
and move.company_id.l10n_es_edi_tax_agency
and move.company_id.l10n_es_sii_tax_agency \
and has_tax
def _l10n_es_is_dua(self):
self.ensure_one()
return any(t.l10n_es_type == 'dua' for t in self.invoice_line_ids.tax_ids.flatten_taxes_hierarchy())
def _check_edi_documents_for_reset_to_draft(self):
docs = self.edi_document_ids.filtered(lambda d: d.edi_format_id._needs_web_services())

View file

@ -0,0 +1,10 @@
from odoo import models
class AccountMoveSend(models.AbstractModel):
_inherit = 'account.move.send'
def _get_mail_attachment_from_doc(self, doc):
if doc.name == 'jsondump.json' and doc.edi_format_id.code == 'es_sii':
return self.env['ir.attachment']
return super()._get_mail_attachment_from_doc(doc)

View file

@ -1,55 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import fields, models
class SIIAccountTaxMixin(models.AbstractModel):
_name = 'l10n_es.sii.account.tax.mixin'
_description = 'SII Fields'
l10n_es_exempt_reason = fields.Selection(
selection=[
('E1', 'Art. 20'),
('E2', 'Art. 21'),
('E3', 'Art. 22'),
('E4', 'Art. 23 y 24'),
('E5', 'Art. 25'),
('E6', 'Otros'),
],
string="Exempt Reason (Spain)",
)
l10n_es_type = fields.Selection(
selection=[
('exento', 'Exento'),
('sujeto', 'Sujeto'),
('sujeto_agricultura', 'Sujeto Agricultura'),
('sujeto_isp', 'Sujeto ISP'),
('no_sujeto', 'No Sujeto'),
('no_sujeto_loc', 'No Sujeto por reglas de Localization'),
('no_deducible', 'No Deducible'),
('retencion', 'Retencion'),
('recargo', 'Recargo de Equivalencia'),
('ignore', 'Ignore even the base amount'),
],
string="Tax Type (Spain)", default='sujeto'
)
l10n_es_bien_inversion = fields.Boolean('Bien de Inversion', default=False)
class AccountTax(models.Model):
_inherit = ['account.tax', 'l10n_es.sii.account.tax.mixin']
_name = 'account.tax'
class AccountTaxTemplate(models.Model):
_inherit = ['account.tax.template', 'l10n_es.sii.account.tax.mixin']
_name = 'account.tax.template'
def _get_tax_vals(self, company, tax_template_to_tax):
# OVERRIDE
# Copy values from 'account.tax.template' to vals will be used to create a new 'account.tax'.
vals = super()._get_tax_vals(company, tax_template_to_tax)
vals['l10n_es_exempt_reason'] = self.l10n_es_exempt_reason
vals['l10n_es_type'] = self.l10n_es_type
vals['l10n_es_bien_inversion'] = self.l10n_es_bien_inversion
return vals

View file

@ -0,0 +1,11 @@
from odoo import fields, models
class CertificateCertificate(models.Model):
_inherit = 'certificate.certificate'
scope = fields.Selection(
selection_add=[
('sii', 'SII')
],
)

View file

@ -1,87 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from base64 import b64decode
from pytz import timezone
from datetime import datetime
from cryptography.hazmat.primitives.serialization import Encoding, NoEncryption, PrivateFormat
from odoo import _, api, fields, models, tools
from odoo.exceptions import ValidationError
from odoo.addons.account.tools.certificate import load_key_and_certificates
class Certificate(models.Model):
_name = 'l10n_es_edi.certificate'
_description = 'Personal Digital Certificate'
_order = 'date_start desc, id desc'
_rec_name = 'date_start'
content = fields.Binary(string="File", required=True, help="PFX Certificate")
password = fields.Char(help="Passphrase for the PFX certificate", groups="base.group_system")
date_start = fields.Datetime(readonly=True, help="The date on which the certificate starts to be valid")
date_end = fields.Datetime(readonly=True, help="The date on which the certificate expires")
company_id = fields.Many2one(comodel_name='res.company', required=True, default=lambda self: self.env.company)
# -------------------------------------------------------------------------
# HELPERS
# -------------------------------------------------------------------------
@api.model
def _get_es_current_datetime(self):
"""Get the current datetime with the Peruvian timezone. """
return datetime.now(timezone('Europe/Madrid'))
@tools.ormcache('self.content', 'self.password')
def _decode_certificate(self):
"""Return the content (DER encoded) and the certificate decrypted based in the point 3.1 from the RS 097-2012
http://www.vauxoo.com/r/manualdeautorizacion#page=21
"""
self.ensure_one()
if not self.password:
return None, None, None
private_key, certificate = load_key_and_certificates(
b64decode(self.content),
self.password.encode(),
)
pem_certificate = certificate.public_bytes(Encoding.PEM)
pem_private_key = private_key.private_bytes(
Encoding.PEM,
format=PrivateFormat.TraditionalOpenSSL,
encryption_algorithm=NoEncryption(),
)
return pem_certificate, pem_private_key, certificate
# -------------------------------------------------------------------------
# LOW-LEVEL METHODS
# -------------------------------------------------------------------------
@api.model_create_multi
def create(self, vals_list):
certificates = super().create(vals_list)
spain_tz = timezone('Europe/Madrid')
spain_dt = self._get_es_current_datetime()
for certificate in certificates:
try:
_pem_certificate, _pem_private_key, certif = certificate._decode_certificate()
cert_date_start = spain_tz.localize(certif.not_valid_before)
cert_date_end = spain_tz.localize(certif.not_valid_after)
except Exception:
raise ValidationError(_(
"There has been a problem with the certificate, some usual problems can be:\n"
"- The password given or the certificate are not valid.\n"
"- The certificate content is invalid."
))
# Assign extracted values from the certificate
certificate.write({
'date_start': fields.Datetime.to_string(cert_date_start),
'date_end': fields.Datetime.to_string(cert_date_end),
})
if spain_dt > cert_date_end:
raise ValidationError(_("The certificate is expired since %s", certificate.date_end))
return certificates

View file

@ -1,12 +0,0 @@
from odoo import models
class MailTemplate(models.Model):
_inherit = "mail.template"
def _get_edi_attachments(self, document):
# When an invoice is signed, an electronic document is created (i.e. jsondump.json)
# Prevent this document to be added in "SEND & PRINT" wizard
if document.name == 'jsondump.json' and document.edi_format_id.code == 'es_sii':
return {}
return super()._get_edi_attachments(document)

View file

@ -6,18 +6,19 @@ from odoo import api, fields, models
class ResCompany(models.Model):
_inherit = 'res.company'
l10n_es_edi_certificate_id = fields.Many2one(
string="Certificate (ES)",
l10n_es_sii_certificate_id = fields.Many2one(
string="Certificate (SII)",
store=True,
readonly=False,
comodel_name='l10n_es_edi.certificate',
compute="_compute_l10n_es_edi_certificate",
comodel_name='certificate.certificate',
compute="_compute_l10n_es_sii_certificate",
)
l10n_es_edi_certificate_ids = fields.One2many(
comodel_name='l10n_es_edi.certificate',
l10n_es_sii_certificate_ids = fields.One2many(
comodel_name='certificate.certificate',
inverse_name='company_id',
domain=[('scope', '=', 'sii')],
)
l10n_es_edi_tax_agency = fields.Selection(
l10n_es_sii_tax_agency = fields.Selection(
string="Tax Agency for SII",
selection=[
('aeat', "Agencia Tributaria española"),
@ -26,20 +27,20 @@ class ResCompany(models.Model):
],
default=False,
)
l10n_es_edi_test_env = fields.Boolean(
string="Test Mode",
help="Use the test environment",
l10n_es_sii_test_env = fields.Boolean(
string="SII Test Mode",
help="Use the test environment for SII",
default=True,
)
@api.depends('country_id', 'l10n_es_edi_certificate_ids')
def _compute_l10n_es_edi_certificate(self):
@api.depends('country_id', 'l10n_es_sii_certificate_ids')
def _compute_l10n_es_sii_certificate(self):
for company in self:
if company.country_code == 'ES':
company.l10n_es_edi_certificate_id = self.env['l10n_es_edi.certificate'].search(
[('company_id', '=', company.id)],
company.l10n_es_sii_certificate_id = self.env['certificate.certificate'].search(
[('company_id', '=', company.id), ('is_valid', '=', True), ('scope', '=', 'sii')],
order='date_end desc',
limit=1,
)
else:
company.l10n_es_edi_certificate_id = False
company.l10n_es_sii_certificate_id = False

View file

@ -6,6 +6,6 @@ from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
l10n_es_edi_certificate_ids = fields.One2many(related='company_id.l10n_es_edi_certificate_ids', readonly=False)
l10n_es_edi_tax_agency = fields.Selection(related='company_id.l10n_es_edi_tax_agency', readonly=False)
l10n_es_edi_test_env = fields.Boolean(related='company_id.l10n_es_edi_test_env', readonly=False)
l10n_es_sii_certificate_ids = fields.One2many(related='company_id.l10n_es_sii_certificate_ids', readonly=False)
l10n_es_sii_tax_agency = fields.Selection(related='company_id.l10n_es_sii_tax_agency', readonly=False)
l10n_es_sii_test_env = fields.Boolean(related='company_id.l10n_es_sii_test_env', readonly=False)

View file

@ -1,2 +0,0 @@
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_l10n_es_edi_certificate,access_l10n_es_edi_certificate,model_l10n_es_edi_certificate,base.group_system,1,1,1,1
1 id name model_id/id group_id/id perm_read perm_write perm_create perm_unlink
2 access_l10n_es_edi_certificate access_l10n_es_edi_certificate model_l10n_es_edi_certificate base.group_system 1 1 1 1

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo noupdate="1">
<!-- Allow access to certificates of current company/companies -->
<record id="l10n_ec_digital_certificate" model="ir.rule">
<field name="name">Spanish Digital Certificate</field>
<field name="model_id" ref="l10n_es_edi_sii.model_l10n_es_edi_certificate"/>
<field name="domain_force">[('company_id', 'in', company_ids)]</field>
</record>
</odoo>

View file

@ -14,8 +14,10 @@ def mocked_l10n_es_edi_call_web_service_sign(edi_format, invoices, info_list):
class TestEsEdiCommon(AccountEdiTestCommon):
@classmethod
def setUpClass(cls, chart_template_ref='l10n_es.account_chart_template_full', edi_format_ref='l10n_es_edi_sii.edi_es_sii'):
super().setUpClass(chart_template_ref=chart_template_ref, edi_format_ref=edi_format_ref)
@AccountEdiTestCommon.setup_edi_format('l10n_es_edi_sii.edi_es_sii')
@AccountEdiTestCommon.setup_country('es')
def setUpClass(cls):
super().setUpClass()
cls.frozen_today = datetime(year=2019, month=1, day=1, hour=0, minute=0, second=0, tzinfo=timezone('utc'))
@ -24,19 +26,21 @@ class TestEsEdiCommon(AccountEdiTestCommon):
# ==== Config ====
cls.certificate = cls.env['l10n_es_edi.certificate'].create({
'content': base64.encodebytes(
cls.certificate = cls.env['certificate.certificate'].create({
'name': 'Test ES certificate',
'content': base64.b64encode(
misc.file_open("l10n_es_edi_sii/demo/certificates/aeat_1234.p12", 'rb').read()),
'password': '1234',
'pkcs12_password': '1234',
'scope': 'sii',
'company_id': cls.company_data['company'].id,
})
cls.company_data['company'].write({
'country_id': cls.env.ref('base.es').id,
'state_id': cls.env.ref('base.state_es_z').id,
'l10n_es_edi_certificate_id': cls.certificate.id,
'l10n_es_sii_certificate_id': cls.certificate.id,
'vat': 'ES59962470K',
'l10n_es_edi_test_env': True,
'l10n_es_edi_tax_agency': 'bizkaia',
'l10n_es_sii_test_env': True,
'l10n_es_sii_tax_agency': 'bizkaia',
})
# To be sure it is put by default on purchase journals as well (tbai module)
@ -65,7 +69,7 @@ class TestEsEdiCommon(AccountEdiTestCommon):
:param trailing_xml_id: The trailing tax's xml id.
:return: An account.tax record
"""
return cls.env.ref(f'l10n_es.{cls.env.company.id}_account_tax_template_{trailing_xml_id}')
return cls.env.ref(f'account.{cls.env.company.id}_account_tax_template_{trailing_xml_id}')
@classmethod
def create_invoice(cls, **kwargs):

View file

@ -10,8 +10,8 @@ from .common import TestEsEdiCommon
class TestEdiWebServices(TestEsEdiCommon):
@classmethod
def setUpClass(cls, chart_template_ref='l10n_es.account_chart_template_full', edi_format_ref='l10n_es_edi_sii.edi_es_sii'):
super().setUpClass(chart_template_ref=chart_template_ref, edi_format_ref=edi_format_ref)
def setUpClass(cls):
super().setUpClass()
# Invoice name are tracked by the web-services so this constant tries to get a new unique invoice name at each
# execution.
@ -51,7 +51,7 @@ class TestEdiWebServices(TestEsEdiCommon):
cls.moves = cls.out_invoice + cls.in_invoice
def test_edi_gipuzkoa(self):
self.env.company.l10n_es_edi_tax_agency = 'gipuzkoa'
self.env.company.l10n_es_sii_tax_agency = 'gipuzkoa'
self.moves.action_process_edi_web_services(with_commit=False)
generated_files = self._process_documents_web_services(self.moves, {'es_sii'})
@ -60,7 +60,7 @@ class TestEdiWebServices(TestEsEdiCommon):
self.assertRecordValues(self.in_invoice, [{'edi_state': 'sent'}])
def test_edi_bizkaia(self):
self.env.company.l10n_es_edi_tax_agency = 'bizkaia'
self.env.company.l10n_es_sii_tax_agency = 'bizkaia'
self.moves.action_process_edi_web_services(with_commit=False)
generated_files = self._process_documents_web_services(self.moves, {'es_sii'})

View file

@ -6,6 +6,7 @@ import json
from freezegun import freeze_time
from unittest.mock import patch
from odoo import Command
from odoo.tests import tagged
@ -15,6 +16,8 @@ class TestEdiXmls(TestEsEdiCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.other_currency = cls.setup_other_currency('USD')
cls.certificate.write({
'date_start': '2019-01-01 01:00:00',
'date_end': '2021-01-01 01:00:00',
@ -155,11 +158,15 @@ class TestEdiXmls(TestEsEdiCommon):
invoice_line_ids=[
{
'price_unit': 100.0,
'tax_ids': [(6, 0, (self._get_tax_by_xml_id('s_iva10b') + self._get_tax_by_xml_id('s_req014')).ids)],
'tax_ids': [Command.set((self._get_tax_by_xml_id('s_iva10b') + self._get_tax_by_xml_id('s_req014')).ids)],
},
{
'price_unit': 50.0,
'tax_ids': [Command.set((self._get_tax_by_xml_id('s_iva10b') + self._get_tax_by_xml_id('s_req014')).ids)],
},
{
'price_unit': 200.0,
'tax_ids': [(6, 0, (self._get_tax_by_xml_id('s_iva21s') + self._get_tax_by_xml_id('s_req52')).ids)],
'tax_ids': [Command.set((self._get_tax_by_xml_id('s_iva21s') + self._get_tax_by_xml_id('s_req52')).ids)],
},
],
)
@ -208,9 +215,9 @@ class TestEdiXmls(TestEsEdiCommon):
'DetalleIVA': [
{
'TipoImpositivo': 10.0,
'BaseImponible': 100.0,
'CuotaRepercutida': 10.0,
'CuotaRecargoEquivalencia': 1.4,
'BaseImponible': 150.0,
'CuotaRepercutida': 15.0,
'CuotaRecargoEquivalencia': 2.1,
'TipoRecargoEquivalencia': 1.4
}
]
@ -220,7 +227,7 @@ class TestEdiXmls(TestEsEdiCommon):
}
}
},
'ImporteTotal': 363.8,
'ImporteTotal': 419.5,
'Contraparte': {
'IDOtro': {'ID': 'BE0477472701', 'IDType': '02'},
'NombreRazon': 'partner_a',
@ -304,7 +311,7 @@ class TestEdiXmls(TestEsEdiCommon):
},
})
def test_050_out_invoice_s_iva0_sp_i_s_iva0_ic(self):
def test_050_out_invoice_s_iva0_sp_i_s_iva0_g_i(self):
"""An intra-community sale needs to be reported as exempt and intra-community services as no sujeto por reglas de localizacion (no_sujeto_loc)"""
with freeze_time(self.frozen_today), \
patch('odoo.addons.l10n_es_edi_sii.models.account_edi_format.AccountEdiFormat._l10n_es_edi_call_web_service_sign',
@ -313,7 +320,7 @@ class TestEdiXmls(TestEsEdiCommon):
partner_id=self.partner_a.id,
invoice_line_ids=[
{'price_unit': 100.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_sp_i').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_ic').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_g_i').ids)]},
],
)
invoice.action_post()
@ -362,7 +369,7 @@ class TestEdiXmls(TestEsEdiCommon):
},
})
def test_060_out_refund_s_iva0_sp_i_s_iva0_ic(self):
def test_060_out_refund_s_iva0_sp_i_s_iva0_g_i(self):
""" Intra-community refund of service and good"""
with freeze_time(self.frozen_today), \
patch('odoo.addons.l10n_es_edi_sii.models.account_edi_format.AccountEdiFormat._l10n_es_edi_call_web_service_sign',
@ -372,7 +379,7 @@ class TestEdiXmls(TestEsEdiCommon):
partner_id=self.partner_a.id,
invoice_line_ids=[
{'price_unit': 100.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_sp_i').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_ic').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_g_i').ids)]},
],
)
invoice.action_post()
@ -422,7 +429,7 @@ class TestEdiXmls(TestEsEdiCommon):
},
})
def test_070_out_invoice_s_iva_e_s_iva0_e(self):
def test_070_out_invoice_s_iva_e_s_iva0_g_e(self):
""" Export of service (no sujeto por reglas de localization) and export of goods (exempt)"""
with freeze_time(self.frozen_today), \
patch('odoo.addons.l10n_es_edi_sii.models.account_edi_format.AccountEdiFormat._l10n_es_edi_call_web_service_sign',
@ -431,7 +438,7 @@ class TestEdiXmls(TestEsEdiCommon):
partner_id=self.partner_a.id,
invoice_line_ids=[
{'price_unit': 100.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva_e').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_e').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_g_e').ids)]},
],
)
invoice.action_post()
@ -480,7 +487,7 @@ class TestEdiXmls(TestEsEdiCommon):
},
})
def test_080_out_refund_s_iva0_sp_i_s_iva0_ic(self):
def test_080_out_refund_s_iva0_sp_i_s_iva0_g_i(self):
"""Customer refund of an intracom good and service"""
with freeze_time(self.frozen_today), \
patch('odoo.addons.l10n_es_edi_sii.models.account_edi_format.AccountEdiFormat._l10n_es_edi_call_web_service_sign',
@ -490,7 +497,7 @@ class TestEdiXmls(TestEsEdiCommon):
partner_id=self.partner_a.id,
invoice_line_ids=[
{'price_unit': 100.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_sp_i').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_ic').ids)]},
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_g_i').ids)]},
],
)
invoice.action_post()
@ -540,7 +547,7 @@ class TestEdiXmls(TestEsEdiCommon):
},
})
def test_085_out_refund_s_iva0_sp_i_s_iva0_ic_multi_currency(self):
def test_085_out_refund_s_iva0_sp_i_s_iva0_g_i_multi_currency(self):
""" Same as test_080 but in multi-currency"""
with freeze_time(self.frozen_today), \
patch('odoo.addons.l10n_es_edi_sii.models.account_edi_format.AccountEdiFormat._l10n_es_edi_call_web_service_sign',
@ -548,10 +555,10 @@ class TestEdiXmls(TestEsEdiCommon):
invoice = self.create_invoice(
move_type='out_refund',
partner_id=self.partner_a.id,
currency_id=self.currency_data['currency'].id,
currency_id=self.other_currency.id,
invoice_line_ids=[
{'price_unit': 200.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_sp_i').ids)]},
{'price_unit': 400.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_ic').ids)]},
{'price_unit': 400.0, 'tax_ids': [(6, 0, self._get_tax_by_xml_id('s_iva0_g_i').ids)]},
],
)
invoice.action_post()
@ -1026,7 +1033,7 @@ class TestEdiXmls(TestEsEdiCommon):
move_type='in_refund',
ref='sup0001',
partner_id=self.partner_b.id,
currency_id=self.currency_data['currency'].id,
currency_id=self.other_currency.id,
l10n_es_registration_date='2019-01-02',
invoice_line_ids=[
{
@ -1071,6 +1078,53 @@ class TestEdiXmls(TestEsEdiCommon):
'PeriodoLiquidacion': {'Periodo': '01', 'Ejercicio': '2019'},
})
def test_170_in_invoice_dua(self):
"""DUA invoice. The TipoFactura needs to change as well as the importetotal needs to include the base. """
with freeze_time(self.frozen_today), patch(
'odoo.addons.l10n_es_edi_sii.models.account_edi_format.AccountEdiFormat._l10n_es_edi_call_web_service_sign',
new=mocked_l10n_es_edi_call_web_service_sign
):
invoice = self.create_invoice(
move_type='in_invoice',
ref='fakedua',
partner_id=self.partner_b.id,
currency_id=self.other_currency.id,
l10n_es_registration_date='2019-01-02',
invoice_line_ids=[
{
'tax_ids': [(6, 0, (self._get_tax_by_xml_id('p_iva21_ibc_group').ids))],
},
],
)
invoice.action_post()
generated_files = self._process_documents_web_services(invoice, {'es_sii'})
self.assertTrue(generated_files)
json_file = json.loads(generated_files[0].decode())[0]
self.assertEqual(json_file, {
'PeriodoLiquidacion': {'Ejercicio': '2019', 'Periodo': '01'},
'IDFactura': {
'FechaExpedicionFacturaEmisor': '01-01-2019',
'IDEmisorFactura': {'NIF': '59962470K',
'NombreRazon': 'partner_b'},
'NumSerieFacturaEmisor': 'fakedua'
},
'FacturaRecibida': {
'DescripcionOperacion': 'manual',
'Contraparte': {'NIF': '59962470K', 'NombreRazon': 'partner_b'},
'FechaRegContable': '02-01-2019',
'ClaveRegimenEspecialOTrascendencia': '01',
'TipoFactura': 'F5',
'DesgloseFactura': {
'DesgloseIVA': {
'DetalleIVA': [{'BaseImponible': 500.0, 'TipoImpositivo': 21.0, 'CuotaSoportada': 105.0}]
}
},
'ImporteTotal': 605.0,
'CuotaDeducible': 105.0
}})
def test_180_in_invoice_iva21_sp_in_iva21_ic_bc(self):
""" For intra-community purchase of services and goods, the -100 needs to be taken into account in the importe total.
The clave should also change to 09. """

View file

@ -11,15 +11,9 @@ from .common import TestEsEdiCommon, mocked_l10n_es_edi_call_web_service_sign
@tagged("post_install_l10n", "post_install", "-at_install")
class TestResequenceSII(TestEsEdiCommon):
@classmethod
def setUpClass(
cls,
chart_template_ref="l10n_es.account_chart_template_full",
edi_format_ref="l10n_es_edi_sii.edi_es_sii",
):
def setUpClass(cls):
cls.startClassPatcher(freeze_time("2019-06-01", tick=True))
super().setUpClass(
chart_template_ref=chart_template_ref, edi_format_ref=edi_format_ref
)
super().setUpClass()
cls.classPatch(
cls.registry["account.edi.format"],
"_l10n_es_edi_call_web_service_sign",

View file

@ -7,11 +7,11 @@
<field name="inherit_id" ref="account.view_move_form"/>
<field name="arch" type="xml">
<xpath expr="//group[@id='other_tab_group']//group[@name='accounting_info_group']" position="inside">
<field name="l10n_es_registration_date" attrs="{'readonly': [('state', '=', 'posted')], 'invisible': [('country_code', '!=', 'ES')]}"/>
<field name="l10n_es_registration_date" readonly="state == 'posted'" invisible="country_code != 'ES'"/>
<field name="l10n_es_edi_csv" invisible="1"/>
</xpath>
<field name="ref" position="attributes">
<attribute name="attrs">{'readonly': [('l10n_es_edi_csv', '!=', False)]}</attribute>
<attribute name="readonly">l10n_es_edi_csv</attribute>
</field>
</field>
</record>

View file

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="account_tax_form_inherit_l10n_es_edi" model="ir.ui.view">
<field name="name">account.tax.form.inherit.l10n_es_edi</field>
<field name="model">account.tax</field>
<field name="inherit_id" ref="account.view_tax_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='tax_scope']" position="after">
<field name="l10n_es_type"
attrs="{'invisible': [('country_code', '!=', 'ES')]}"/>
<field name="l10n_es_exempt_reason"
attrs="{'invisible': [('country_code', '!=', 'ES'), ('l10n_es_type', '!=', 'exento')], 'required': [('l10n_es_type', '=', 'exento'), ('type_tax_use', '=', 'sale')]}"/>
<field name="l10n_es_bien_inversion"
attrs="{'invisible': [('country_code', '!=', 'ES'), ('l10n_es_type', '!=', 'exento')], 'required': [('l10n_es_type', '=', 'exento'), ('type_tax_use', '=', 'sale')]}"/>
</xpath>
</field>
</record>
</data>
</odoo>

View file

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>
<record id="l10n_es_edi_certificate_form" model="ir.ui.view">
<field name="name">l10n_es_edi.certificate.form</field>
<field name="model">l10n_es_edi.certificate</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="content"/>
<field name="password" password="True"/>
<label for="date_start" string="Validity"/>
<div>
<field name="date_start"/> -
<field name="date_end"/>
</div>
<field name="company_id" groups="base.group_multi_company"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="l10n_es_edi_certificate_tree" model="ir.ui.view">
<field name="name">l10n_es_edi.certificate.tree</field>
<field name="model">l10n_es_edi.certificate</field>
<field name="arch" type="xml">
<tree>
<field name="date_start"/>
<field name="date_end"/>
<field name="company_id" groups="base.group_multi_company"/>
</tree>
</field>
</record>
<record id="l10n_es_edi_certificate_action" model="ir.actions.act_window">
<field name="name">Certificates for EDI invoices on Spain</field>
<field name="res_model">l10n_es_edi.certificate</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Create the first certificate</p>
</field>
</record>
<menuitem id="menu_l10n_es_edi_root"
name="Spain"
sequence="110"
groups="account.group_account_manager"
parent="account.menu_finance_configuration">
<menuitem id="menu_l10n_es_edi_certificates"
name="Certificates (ES)"
action="l10n_es_edi_certificate_action"
sequence="100"
groups="account.group_account_manager"/>
</menuitem>
</data>
</odoo>

View file

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="certificate_certificate_view_search" model="ir.ui.view">
<field name="name">certificate_certificate_view_search.inherit.l10n_es_edi_sii</field>
<field name="model">certificate.certificate</field>
<field name="inherit_id" ref="certificate.certificate_certificate_view_search"/>
<field name="arch" type="xml">
<filter name="scope_general" position="after">
<filter string="SII" name="scope_sii" domain="[('scope','=','sii')]" help="SII certificates"/>
</filter>
</field>
</record>
<record id="l10n_es_edi_sii_certificate_action" model="ir.actions.act_window">
<field name="name">Certificates for SII EDI invoices on Spain</field>
<field name="res_model">certificate.certificate</field>
<field name="view_mode">list,form</field>
<field name="context">{'scope': 'sii', 'search_default_scope_sii': 1}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Create the first certificate</p>
</field>
</record>
<record id="certificate_certificate_view_form" model="ir.ui.view">
<field name="name">certificate_certificate_view_form.inherit.l10n_es_edi_sii</field>
<field name="model">certificate.certificate</field>
<field name="inherit_id" ref="certificate.certificate_certificate_view_form"/>
<field name="arch" type="xml">
<field name="scope" position="attributes">
<attribute name="invisible" add="not (country_code == 'ES')" separator="or"/>
</field>
</field>
</record>
<menuitem id="menu_l10n_es_edi_sii_root"
name="Spain SII"
sequence="110"
groups="account.group_account_manager"
parent="account.menu_finance_configuration">
<menuitem id="menu_l10n_es_edi_sii_certificates"
name="Certificates"
action="l10n_es_edi_sii_certificate_action"
sequence="100"
groups="account.group_account_manager"/>
</menuitem>
</odoo>

View file

@ -3,57 +3,44 @@
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.l10n.es</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="account.res_config_settings_view_form"/>
<field name="inherit_id" ref="l10n_es.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[@data-key='account']/div" position="after">
<h2 attrs="{'invisible': [('country_code', '!=', 'ES')]}">Spain Localization</h2>
<div class="row mt16 o_settings_container"
name="spain_localization"
attrs="{'invisible': [('country_code', '!=', 'ES')]}">
<div class="col-xs-12 col-md-6 o_setting_box">
<!-- Invisible fields -->
<field name="l10n_es_edi_certificate_ids" invisible="1"/>
<div class="o_setting_left_pane"/>
<div class="o_setting_right_pane">
<span class="o_form_label">Registro de Libros connection SII</span>
<span class="fa fa-lg fa-building-o"
title="Values set here are company-specific."
groups="base.group_multi_company"/>
<div class="content-group">
<div class="mt16">
<label for="l10n_es_edi_tax_agency" class="o_light_label"/>
<field name="l10n_es_edi_tax_agency"/>
<div class="text-muted" attrs="{'invisible': [('l10n_es_edi_tax_agency', '!=', False)]}">
No tax agency selected: SII not activated.
</div>
<div class="text-muted" attrs="{'invisible': [('l10n_es_edi_tax_agency', '=', False)]}">
Tax agency selected: invoices will be sent by SII for journals where it is activated.
</div>
<br/>
<div class="o_row">
<label for="l10n_es_edi_test_env" class="o_light_label"/>
<field name="l10n_es_edi_test_env"/>
</div>
<div class="text-muted" attrs="{'invisible': [('l10n_es_edi_test_env', '=', False)]}">
Test mode: EDI data is sent to separate test servers and is not considered official.
</div>
<div class="text-muted" attrs="{'invisible': [('l10n_es_edi_test_env', '!=', False)]}">
Production mode: EDI data is sent to the official agency servers.
</div>
<br/>
<div>
<button name="%(l10n_es_edi_certificate_action)d" type="action" class="oe_link">Manage certificates (SII/TicketBAI)</button>
</div>
</div>
<xpath expr="//block[@name='spain_localization']" position="attributes">
<attribute name="invisible">country_code != 'ES'</attribute>
</xpath>
<xpath expr="//block[@name='spain_localization']" position="inside">
<!-- Invisible fields -->
<field name="l10n_es_sii_certificate_ids" invisible="1"/>
<setting string="Registro de Libros connection SII" company_dependent="1">
<div class="content-group">
<div class="mt16">
<label for="l10n_es_sii_tax_agency" class="o_light_label"/>
<field name="l10n_es_sii_tax_agency"/>
<div class="text-muted" invisible="l10n_es_sii_tax_agency">
No tax agency selected: SII not activated.
</div>
<div class="text-muted" invisible="not l10n_es_sii_tax_agency">
Tax agency selected: invoices will be sent by SII.
</div>
<br/>
<div class="o_row">
<label for="l10n_es_sii_test_env" class="o_light_label"/>
<field name="l10n_es_sii_test_env"/>
</div>
<div class="text-muted" invisible="not l10n_es_sii_test_env">
Test mode: EDI data is sent to separate test servers and is not considered official.
</div>
<div class="text-muted" invisible="l10n_es_sii_test_env">
Production mode: EDI data is sent to the official agency servers.
</div>
<br/>
<div>
<button name="%(l10n_es_edi_sii_certificate_action)d" type="action" class="oe_link">Manage certificates (SII)</button>
</div>
</div>
</div>
</div>
</setting>
</xpath>
</field>
</record>
</odoo>

View file

@ -1,13 +1,16 @@
[project]
name = "odoo-bringout-oca-ocb-l10n_es_edi_sii"
version = "16.0.0"
description = "Spain - SII EDI Suministro de Libros - Odoo addon"
description = "Spain - SII EDI Suministro de Libros -
Odoo addon
"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-l10n_es>=16.0.0",
"odoo-bringout-oca-ocb-account_edi>=16.0.0",
"TODO_MAP-certificate>=19.0.0",
"odoo-bringout-oca-ocb-l10n_es>=19.0.0",
"odoo-bringout-oca-ocb-account_edi>=19.0.0",
"requests>=2.25.1"
]
readme = "README.md"
@ -17,7 +20,7 @@ classifiers = [
"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.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]