diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/README.rst b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/README.rst new file mode 100644 index 000000000..4a044b431 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/README.rst @@ -0,0 +1,65 @@ +======================================================= +AEAT SII - Special Prorate Regularization Capital Asset +======================================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:99123384c24c2b73dc236e771222caff831de4cec8cc8cb9a81ff1e0a04564a1 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-NuoBiT%2Fodoo--addons-lightgray.png?logo=github + :target: https://github.com/NuoBiT/odoo-addons/tree/18.0/l10n_es_aeat_sii_special_prorate_regularization_capital_asset + :alt: NuoBiT/odoo-addons + +|badge1| |badge2| |badge3| + +This module allows send to SII automaticaly the capital assets prorate +regularization. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* NuoBiT Solutions SL + +Contributors +------------ + +- `NuoBiT `__: + + - Kilian Niubo kniubo@nuobit.com + - Eric Antones eantones@nuobit.com + - Deniz Gallo dgallo@nuobit.com + +Maintainers +----------- + +This module is part of the `NuoBiT/odoo-addons `_ project on GitHub. + +You are welcome to contribute. diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/__init__.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/__manifest__.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/__manifest__.py new file mode 100644 index 000000000..7ae675142 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/__manifest__.py @@ -0,0 +1,26 @@ +# Copyright NuoBiT Solutions SL - Kilian Niubo +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +{ + "name": "AEAT SII - Special Prorate Regularization Capital Asset", + "summary": "This module allows send to SII automaticaly the " + "capital assets prorate regularization.", + "version": "18.0.1.0.1", + "category": "Accounting", + "author": "NuoBiT Solutions SL", + "website": "https://github.com/NuoBiT/odoo-addons", + "license": "AGPL-3", + "depends": [ + "l10n_es_aeat_mod303_special_prorate_regularization_capital_asset", + "l10n_es_aeat_sii_oca_extension", + "queue_job", + ], + "data": [ + "data/aeat_sii_queue_job.xml", + "views/account_asset.xml", + "views/mod303_views.xml", + "views/capital_asset_prorate_regularization.xml", + "views/res_company_view.xml", + ], +} diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/data/aeat_sii_queue_job.xml b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/data/aeat_sii_queue_job.xml new file mode 100644 index 000000000..11cf09b5a --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/data/aeat_sii_queue_job.xml @@ -0,0 +1,29 @@ + + + + root.capital_asset_validate_sii + + + + + confirm_one_capital_asset_prorate_line + + + + + cancel_one_capital_asset_prorate_line + + + diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/i18n/es.po b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/i18n/es.po new file mode 100644 index 000000000..ac2a8b63f --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/i18n/es.po @@ -0,0 +1,364 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_es_aeat_sii_special_prorate_regularization_capital_asset +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-11-21 14:30+0000\n" +"PO-Revision-Date: 2026-03-05 10:41+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.model_l10n_es_aeat_mod303_report +msgid "AEAT 303 Report" +msgstr "Modelo 303" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__aeat_send_error +msgid "AEAT Send Error" +msgstr "Error de envío AEAT" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__aeat_content_sent +msgid "AEAT last content sent" +msgstr "Último contenido enviado AEAT" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__aeat_header_sent +msgid "AEAT last header sent" +msgstr "Última cabecera enviada AEAT" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__aeat_send_failed +msgid "AEAT send failed" +msgstr "Envío AEAT fallido" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__aeat_state +msgid "AEAT send state" +msgstr "" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__capital_asset_prorate_regularization__aeat_state__sent_w_errors +msgid "Accepted with errors" +msgstr "Aceptado con errores" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.model_aeat_tax_agency +msgid "Aeat Tax Agency" +msgstr "Agencia Tributaria AEAT" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.model_account_asset +msgid "Asset" +msgstr "Activo" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__res_company__capital_asset_send_mode__fixed +msgid "At fixed time" +msgstr "A una hora fija" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.view_l10n_es_aeat_mod303_report_form +msgid "Cancel capital assets prorate regularization SII" +msgstr "" +"Cancelar la regularización de la prorata de los bienes de inversion del SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.view_l10n_es_aeat_mod303_report_form +msgid "Cancel field 43 to SII" +msgstr "Cancelación casilla 43 al SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__capital_asset_prorate_regularization__aeat_state__cancelled +msgid "Cancelled" +msgstr "Cancelado" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__capital_asset_prorate_regularization__aeat_state__cancelled_modified +msgid "Cancelled in SII but last modifications not sent" +msgstr "Cancelado en SII pero las ultimas modificaciones no han sido enviadas" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.model_capital_asset_prorate_regularization +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.capital_asset_prorate_regularization_view_form +msgid "Capital Asset Prorate Regularization" +msgstr "Regularizacion de la prorata de los bienes de inversión" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.view_company_capital_asset_sii_form +msgid "Capital Asset connector config" +msgstr "Conector configuración - Bienes de inversión" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,help:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_res_company__capital_asset_use_connector +msgid "" +"Check it to use connector instead of sending the invoice directly when it's " +"validated" +msgstr "" +"Márquelo para usar el conector en lugar de enviar la factura directamente " +"cuando se valida" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__asset_prorate_line_job_ids +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.capital_asset_prorate_regularization_view_form +msgid "Connector Jobs" +msgstr "Trabajos del conector" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_res_company__capital_asset_delay_time +msgid "Delay time" +msgstr "Tiempo de retardo" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__sii_enabled +msgid "Enable SII" +msgstr "Activar SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/mod303.py:0 +msgid "" +"Exist prorate lines in year: %(year)s in assets %(assets)s with capital " +"asset prorate lines. Please send the cancellation to the sii before " +"canceling the 303 model." +msgstr "" +"Existen líneas de prorata en el año: %(year)s en los activos %(assets)s con " +"líneas de prorata de bienes de inversión. Por favor, envíe la cancelación al " +"SII antes de cancelar el modelo 303." + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.capital_asset_prorate_regularization_view_form +msgid "General" +msgstr "General" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,help:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__aeat_send_failed +msgid "" +"Indicates that the last attempt to communicate this document to the SII has " +"failed. See SII return for details" +msgstr "" +"Indica que el último intento de comunicar la factura al SII ha fallado. Ver " +"el retorno SII para más detalles" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,help:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__sii_account_registration_date +msgid "" +"Indicates the account registration date set at the SII, which must be the " +"date when the invoice is recorded in the system and is independent of the " +"date of the accounting entry of the invoice" +msgstr "" +"Indica la fecha de registro contable establecida en el SII, la cual debe ser" +" la fecha en que se registra la factura en el sistema con independencia de " +"la fecha del asiento contable de la factura" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,help:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__aeat_state +msgid "" +"Indicates the state of this document in relation with the presentation at " +"the AEAT" +msgstr "Indica el estado de este documento en relación con la presentación en la AEAT" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py:0 +msgid "No VAT configured for the company '{}'" +msgstr "No hay un IVA configurado para la compañía '{}'" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__capital_asset_prorate_regularization__aeat_state__not_sent +msgid "Not sent" +msgstr "No registrada" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__res_company__capital_asset_send_mode__auto +msgid "On validate" +msgstr "Al validar" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/mod303.py:0 +msgid "" +"Please, post capital asset prorate move of the 303 model before send capital" +" asset prorate regularization to SII" +msgstr "Por favor, contabilice el asiento de la prorata de los bienes de inversión del " +"modelo 303 antes de enviar la regularización de la prorata de los bienes de inversión al SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py:0 +msgid "" +"Please, post capital asset prorate regularization move before send capital " +"asset prorate regularization to SII" +msgstr "Por favor, contabilice el asiento de regularización de la prorata de los bienes " +"de inversión antes de enviar la regularización de la prorata de los bienes de inversión al SII" + + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_l10n_es_aeat_mod303_report__prorate_asset_lines_to_cancel +msgid "Prorate Asset Lines To Cancel" +msgstr "Lineas de prorata de activo para cancelar" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_l10n_es_aeat_mod303_report__prorate_asset_lines_to_send +msgid "Prorate Asset Lines To Send" +msgstr "Lineas de prorata de activo para enviar" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__capital_asset_prorate_regularization__aeat_state__sent_modified +msgid "Registered in SII but last modifications not sent" +msgstr "Registro correcto en SII con modificaciones pendientes de comunicar" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__sii_csv +msgid "SII CSV" +msgstr "CSV SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.account_asset_view_search +msgid "SII Cancelled" +msgstr "SII cancelado" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.capital_asset_prorate_regularization_view_form +msgid "SII Information" +msgstr "Información SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.capital_asset_prorate_regularization_view_form +msgid "SII Result" +msgstr "Resultado SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__sii_return +msgid "SII Return" +msgstr "Retorno SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_account_asset__sii_send_errors +msgid "SII Send Errors" +msgstr "Errores de envío al SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.account_asset_view_search +msgid "SII Sent" +msgstr "SII enviado" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_capital_asset_prorate_regularization__sii_account_registration_date +msgid "SII account registration date" +msgstr "Fecha de registro contable SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.account_asset_view_search +msgid "SII error" +msgstr "Error SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.account_asset_view_search +msgid "SII not sent" +msgstr "SII no enviado" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.account_asset_view_search +msgid "SII sent with errors" +msgstr "SII enviado con errores" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.account_asset_view_form +msgid "Send asset to SII" +msgstr "Enviar activo al SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.account_asset_view_form +msgid "Send cancellation to SII" +msgstr "Enviar anulación al SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.view_l10n_es_aeat_mod303_report_form +msgid "Send capital assets prorate regularization to SII" +msgstr "" +"Enviar regularización de la prorrata de los bienes de inversion al SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.view_l10n_es_aeat_mod303_report_form +msgid "Send field 43 to SII" +msgstr "Enviar casilla 43 al SII" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_res_company__capital_asset_send_mode +msgid "Send mode" +msgstr "Modo de envío" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__capital_asset_prorate_regularization__aeat_state__sent +msgid "Sent" +msgstr "Enviada" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_res_company__capital_asset_sent_time +msgid "Sent time" +msgstr "Hora de envío" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model_terms:ir.ui.view,arch_db:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.capital_asset_prorate_regularization_view_form +msgid "Technical" +msgstr "Técnica" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py:0 +msgid "" +"The fiscal position of the partner and of the invoice is different. Please " +"review asset: %(asset_id)i %(asset_name)s" +msgstr "La posición fiscal del cliente y de la factura es diferente." +"Por favor revise el activo: %(asset_id)i %(asset_name)s" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py:0 +msgid "The partner has not a VAT configured." +msgstr "El cliente no tiene un IVA configurado." + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py:0 +msgid "This company doesn't have SII enabled." +msgstr "Esta compañía no tiene el SII activado." + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields,field_description:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.field_res_company__capital_asset_use_connector +msgid "Use connector" +msgstr "Usar conector" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#: model:ir.model.fields.selection,name:l10n_es_aeat_sii_special_prorate_regularization_capital_asset.selection__res_company__capital_asset_send_mode__delayed +msgid "With delay" +msgstr "Con retardo" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py:0 +msgid "" +"You can't delete a capital asset prorate regularization line if it has been " +"previously sent" +msgstr "No se puede eliminar una línea de regularización de la prorata de los " +"bienes de inversión si ha sido enviada previamente" + +#. module: l10n_es_aeat_sii_special_prorate_regularization_capital_asset +#. odoo-python +#: code:addons/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py:0 +msgid "You have to select what account chart template use this company." +msgstr "Debe seleccionar qué plantilla de plan contable utiliza esta compañía." \ No newline at end of file diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/migrations/18.0.1.0.1/pre-migrate.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/migrations/18.0.1.0.1/pre-migrate.py new file mode 100644 index 000000000..bc745cc1a --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/migrations/18.0.1.0.1/pre-migrate.py @@ -0,0 +1,22 @@ +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from openupgradelib import openupgrade + +from odoo.tools.sql import column_exists + +_column_renames = { + "capital_asset_prorate_regularization": [ + ("sii_state", "aeat_state"), + ("sii_header_sent", "aeat_header_sent"), + ("sii_content_sent", "aeat_content_sent"), + ("sii_send_error", "aeat_send_error"), + ("sii_send_failed", "aeat_send_failed"), + ], +} + + +@openupgrade.migrate() +def migrate(env, version): + if column_exists(env.cr, "capital_asset_prorate_regularization", "sii_state"): + openupgrade.rename_columns(env.cr, _column_renames) diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/__init__.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/__init__.py new file mode 100644 index 000000000..bf3f241ec --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/__init__.py @@ -0,0 +1,5 @@ +from . import account_asset +from . import aeat_tax_agency +from . import mod303 +from . import capital_asset_prorate_regularization +from . import res_company diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/account_asset.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/account_asset.py new file mode 100644 index 000000000..3cf59553a --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/account_asset.py @@ -0,0 +1,31 @@ +# Copyright NuoBiT Solutions SL - Kilian Niubo +# Copyright NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class AccountAsset(models.Model): + _inherit = "account.asset" + + sii_send_errors = fields.Char( + string="SII Send Errors", + compute="_compute_sii_send_errors", + store=True, + readonly=True, + ) + + @api.depends( + "capital_asset_prorate_regularization_ids", + "capital_asset_prorate_regularization_ids.aeat_send_error", + ) + def _compute_sii_send_errors(self): + for rec in self: + if rec.capital_asset_prorate_regularization_ids: + rec.sii_send_errors = ", ".join( + sorted( + rec.capital_asset_prorate_regularization_ids.filtered( + "aeat_send_error" + ).mapped("aeat_send_error") + ) + ) diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/aeat_tax_agency.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/aeat_tax_agency.py new file mode 100644 index 000000000..4462e08a6 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/aeat_tax_agency.py @@ -0,0 +1,18 @@ +# Copyright NuoBiT Solutions SL - Kilian Niubo +# Copyright NuoBiT Solutions SL - Eric Antones +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class AeatTaxAgency(models.Model): + _inherit = "aeat.tax.agency" + + def _prepare_sii_wdsl_mapping(self): + return {**super()._prepare_sii_wdsl_mapping(), "capital_asset": "sii_wsdl_pi"} + + def _prepare_sii_port_name_mapping(self): + return { + **super()._prepare_sii_port_name_mapping(), + "capital_asset": "SuministroBienesInversion", + } diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py new file mode 100644 index 000000000..ad243b20a --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/capital_asset_prorate_regularization.py @@ -0,0 +1,545 @@ +# Copyright NuoBiT Solutions SL - Kilian Niubo +# Copyright NuoBiT Solutions SL - Eric Antones +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +import json +import logging + +from requests import Session + +from odoo import _, api, exceptions, fields, models +from odoo.exceptions import ValidationError +from odoo.modules.registry import Registry + +from odoo.addons.l10n_es_aeat.models.aeat_mixin import AEAT_STATES, round_by_keys +from odoo.addons.l10n_es_aeat_sii_oca.models.sii_mixin import SII_STATES, SII_VERSION + +_logger = logging.getLogger(__name__) +try: + from zeep import Client + from zeep.plugins import HistoryPlugin + from zeep.transports import Transport +except (OSError, ImportError) as err: + _logger.debug(err) + +try: + pass +except ImportError: + _logger.debug("Can not `import queue_job`.") + + +class AssetProrateRegularization(models.Model): + _inherit = "capital.asset.prorate.regularization" + + aeat_state = fields.Selection( + selection=AEAT_STATES + SII_STATES, + string="AEAT send state", + default="not_sent", + readonly=True, + copy=False, + help="Indicates the state of this document in relation with the " + "presentation at the AEAT", + ) + sii_csv = fields.Char( + string="SII CSV", + copy=False, + readonly=True, + ) + sii_return = fields.Text( + string="SII Return", + copy=False, + readonly=True, + ) + aeat_header_sent = fields.Text( + string="AEAT last header sent", + copy=False, + readonly=True, + ) + aeat_content_sent = fields.Text( + string="AEAT last content sent", + copy=False, + readonly=True, + ) + aeat_send_error = fields.Text( + string="AEAT Send Error", + copy=False, + readonly=True, + ) + aeat_send_failed = fields.Boolean( + string="AEAT send failed", + copy=False, + help="Indicates that the last attempt to communicate this document to " + "the SII has failed. See SII return for details", + ) + + sii_account_registration_date = fields.Date( + string="SII account registration date", + readonly=True, + copy=False, + help="Indicates the account registration date set at the SII, which " + "must be the date when the invoice is recorded in the system and " + "is independent of the date of the accounting entry of the " + "invoice", + ) + asset_prorate_line_job_ids = fields.Many2many( + comodel_name="queue.job", + column1="asset_prorate_line_id", + column2="job_id", + # TODO: remove this comment.Nom relation Massa llarg? + relation="capital_asset_prorate_regularization_queue_job_rel", + string="Connector Jobs", + copy=False, + ) + sii_enabled = fields.Boolean(string="Enable SII", compute="_compute_sii_enabled") + + def _compute_sii_enabled(self): + """Compute if the asset is enabled for the SII""" + for line in self: + if line.asset_id.company_id.sii_enabled: + asset_invoice = self.asset_id.invoice_move_line_id.move_id + self.sii_enabled = ( + asset_invoice.fiscal_position_id + and asset_invoice.fiscal_position_id.sii_active + ) or not asset_invoice.fiscal_position_id + else: + self.sii_enabled = False + + def _get_account_registration_date(self): + """Hook method to allow the setting of the account registration date + of each supplier invoice. The SII recommends to set the send date as + the default value (point 9.3 of the document + SII_Descripcion_ServicioWeb_v0.7.pdf), so by default we return + the current date or, if exists, the stored + sii_account_registration_date + :return String date in the format %Y-%m-%d""" + self.ensure_one() + return self.sii_account_registration_date or fields.Date.today() + + def confirm_one_capital_asset_prorate_line(self): + self.sudo()._send_asset_to_sii() + + def cancel_one_capital_asset_prorate_line(self): + self.sudo()._cancel_asset_to_sii() + + def _process_asset_for_sii_send(self): + """Process documents for sending to the SII. Adds general checks from + configuration parameters and document availability for SII. If the + document is to be sent the decides the send method: direct send or + via connector depending on 'Use connector' configuration""" + # TODO: descomentar + queue_obj = self.env["queue.job"].sudo() + for asset_line in self: + company = asset_line.asset_id.company_id + if not company.capital_asset_use_connector: + asset_line._send_asset_to_sii() + # TODO:descomentar cuando esten los jobs + else: + eta = company._get_sii_eta_capital_assets() + new_delay = ( + asset_line.sudo() + .with_context(company_id=company.id) + .with_delay(eta=eta if not asset_line.aeat_send_failed else False) + .confirm_one_capital_asset_prorate_line() + ) + job = queue_obj.search([("uuid", "=", new_delay.uuid)], limit=1) + asset_line.sudo().asset_prorate_line_job_ids |= job + + def send_asset_sii(self): + if ( + self.mod303_id + and self.mod303_id.move_prorate_capital_asset_id.state == "draft" + or (self.mod303_id and not self.mod303_id.move_prorate_capital_asset_id) + ): + raise ValidationError( + _( + "Please, post capital asset prorate" + " regularization move before send " + "capital asset prorate regularization to SII" + ) + ) + if not self._cancel_asset_jobs(): + self._process_asset_for_sii_send() + + def _send_asset_to_sii(self): + serv = self._connect_aeat("capital_asset") + if self.aeat_state == "not_sent": + tipo_comunicacion = "A0" + else: + tipo_comunicacion = "A1" + header = self._get_aeat_header(tipo_comunicacion) + asset_line_vals = { + "aeat_header_sent": json.dumps(header, indent=4), + } + try: + asset_dict = self._get_sii_asset_dict() + asset_line_vals["aeat_content_sent"] = json.dumps(asset_dict, indent=4) + res = serv.SuministroLRBienesInversion(header, asset_dict) + res_line = res["RespuestaLinea"][0] + if res["EstadoEnvio"] == "Correcto": + asset_line_vals.update( + { + "aeat_state": "sent", + "sii_csv": res["CSV"], + "aeat_send_failed": False, + } + ) + elif ( + res["EstadoEnvio"] == "ParcialmenteCorrecto" + and res_line["EstadoRegistro"] == "AceptadoConErrores" + ): + asset_line_vals.update( + { + "aeat_state": "sent_w_errors", + "sii_csv": res["CSV"], + "aeat_send_failed": True, + } + ) + else: + asset_line_vals["aeat_send_failed"] = True + if ( + "aeat_state" in asset_line_vals + and not self.sii_account_registration_date + ): + asset_line_vals["sii_account_registration_date"] = ( + self._get_account_registration_date() + ) + asset_line_vals["sii_return"] = res + send_error = False + if res_line["CodigoErrorRegistro"]: + send_error = "{} | {}".format( + str(res_line["CodigoErrorRegistro"]), + str(res_line["DescripcionErrorRegistro"])[:60], + ) + asset_line_vals["aeat_send_error"] = send_error + self.write(asset_line_vals) + + except Exception as fault: + new_cr = Registry(self.env.cr.dbname).cursor() + env = api.Environment(new_cr, self.env.uid, self.env.context) + asset_line = env["capital.asset.prorate.regularization"].browse(self.id) + asset_line_vals.update( + { + "aeat_send_failed": True, + "aeat_send_error": repr(fault)[:60], + "sii_return": repr(fault), + } + ) + asset_line.write(asset_line_vals) + new_cr.commit() + new_cr.close() + raise + + def cancel_asset_sii(self): + if not self._cancel_asset_jobs(): + queue_obj = self.env["queue.job"] + for asset_line in self: + company = self.asset_id.company_id + if not company.capital_asset_use_connector: + self._cancel_asset_to_sii() + else: + eta = company._get_sii_eta_capital_assets() + new_delay = ( + self.sudo() + .with_context(company_id=company.id) + .with_delay(eta=eta) + .cancel_one_capital_asset_prorate_line() + ) + job = queue_obj.search([("uuid", "=", new_delay.uuid)], limit=1) + asset_line.sudo().asset_prorate_line_job_ids |= job + + def _cancel_asset_to_sii(self): + serv = self._connect_aeat("capital_asset") + header = self._get_aeat_header(cancellation=True) + asset_line_vals = { + "aeat_send_failed": True, + "aeat_send_error": False, + } + try: + asset_dict = self._get_cancel_sii_asset_dict() + res = serv.AnulacionLRBienesInversion(header, asset_dict) + asset_line_vals["sii_return"] = res + if res["EstadoEnvio"] == "Correcto": + asset_line_vals.update( + { + "aeat_state": "cancelled", + "sii_csv": res["CSV"], + "aeat_send_failed": False, + } + ) + res_line = res["RespuestaLinea"][0] + + if res_line["CodigoErrorRegistro"]: + asset_line_vals["aeat_send_error"] = "{} | {}".format( + str(res_line["CodigoErrorRegistro"]), + str(res_line["DescripcionErrorRegistro"])[:60], + ) + self.write(asset_line_vals) + except Exception as fault: + new_cr = Registry(self.env.cr.dbname).cursor() + env = api.Environment(new_cr, self.env.uid, self.env.context) + asset_line = env["capital.asset.prorate.regularization"].browse(self.id) + asset_line_vals.update( + { + "aeat_send_failed": True, + "aeat_send_error": repr(fault)[:60], + "sii_return": repr(fault), + } + ) + asset_line.write(asset_line_vals) + new_cr.commit() + new_cr.close() + raise + + def _get_cancel_sii_asset_dict(self): + self.ensure_one() + self._aeat_check_exceptions() + return self._get_sii_asset_dict(cancel=True) + + def _cancel_asset_jobs(self): + job_started = False + for queue in self.sudo().mapped("asset_prorate_line_job_ids"): + if queue.state == "started": + job_started = True + elif queue.state in ("pending", "enqueued", "failed"): + queue.unlink() + return job_started + + def _connect_aeat(self, mapping_key): + self.ensure_one() + public_crt, private_key = self.env["l10n.es.aeat.certificate"].get_certificates( + company=self.asset_id.company_id + ) + params = self._connect_params_aeat(mapping_key) + session = Session() + session.cert = (public_crt, private_key) + transport = Transport(session=session) + history = HistoryPlugin() + client = Client(wsdl=params["wsdl"], transport=transport, plugins=[history]) + return self._bind_service(client, params["port_name"], params["address"]) + + def _bind_service(self, client, port_name, address=None): + self.ensure_one() + service = client._get_service("siiService") + port = client._get_port(service, port_name) + address = address or port.binding_options["address"] + return client.create_service(port.binding.name, address) + + def _connect_params_aeat(self, mapping_key): + self.ensure_one() + agency = self.asset_id.company_id.tax_agency_id + if not agency: + # We use spanish agency by default to keep old behavior with + # ir.config parameters. In the future it might be good to reinforce + # to explicitly set a tax agency in the company by raising an error + # here. + agency = self.env.ref("l10n_es_aeat.aeat_tax_agency_spain") + return agency._connect_params_sii(mapping_key, self.asset_id.company_id) + + def _get_aeat_header(self, tipo_comunicacion=False, cancellation=False): + """Builds SII send header + + :param tipo_comunicacion String 'A0': new reg, 'A1': modification + :param cancellation Bool True when the communication is for document + cancellation + :return Dict with header data depending on cancellation + """ + self.ensure_one() + company = self.asset_id.company_id + if not company.vat: + raise exceptions.UserError( + _("No VAT configured for the company '{}'").format(company.name) + ) + header = { + "IDVersionSii": SII_VERSION, + "Titular": { + "NombreRazon": self.asset_id.company_id.name[0:120], + "NIF": self.asset_id.company_id.vat[2:], + }, + } + if not cancellation: + header.update({"TipoComunicacion": tipo_comunicacion}) + return header + + def _get_sii_identifier(self): + """Get the SII structure for a partner identifier depending on the + conditions of the document. + """ + self.ensure_one() + gen_type = self._get_sii_gen_type() + ( + country_code, + identifier_type, + identifier, + ) = self._aeat_get_partner()._parse_aeat_vat_info() + # Limpiar alfanum + if identifier: + identifier = "".join(e for e in identifier if e.isalnum()).upper() + else: + identifier = "NO_DISPONIBLE" + identifier_type = "06" + if gen_type == 1: + if "1117" in (self.aeat_send_error or ""): + return { + "IDOtro": { + "CodigoPais": country_code, + "IDType": "07", + "ID": identifier, + } + } + else: + if identifier_type == "": + return {"NIF": identifier} + return { + "IDOtro": { + "CodigoPais": country_code, + "IDType": identifier_type, + "ID": identifier, + }, + } + elif gen_type == 2: + return {"IDOtro": {"IDType": "02", "ID": country_code + identifier}} + elif gen_type == 3 and identifier_type: + return { + "IDOtro": { + "CodigoPais": country_code, + "IDType": identifier_type, + "ID": identifier, + }, + } + elif gen_type == 3: + return {"NIF": identifier} + + def _get_sii_gen_type(self): + """Make a choice for general invoice type + + Returns: + int: 1 (National), 2 (Intracom), 3 (Export) + """ + self.ensure_one() + partner_ident = self.asset_id.partner_id.property_account_position_id + partner_ident_type = partner_ident.sii_partner_identification_type + if partner_ident_type: + res = int(partner_ident_type) + elif partner_ident.name == "Régimen Intracomunitario": + res = 2 + elif partner_ident.name == "Régimen Extracomunitario": + res = 3 + else: + res = 1 + return res + + def _get_sii_body(self, cancel=False): + body = { + "PeriodoLiquidacion": {"Ejercicio": self.year, "Periodo": "0A"}, + "IDFactura": { + "IDEmisorFactura": { + "NombreRazon": self.asset_id.partner_id.name[0:120], + # "NIF": self.asset_id.partner_id.vat[2:], + **self._get_sii_identifier(), + }, + "NumSerieFacturaEmisor": (self.asset_id.invoice_ref or "")[0:60], + "FechaExpedicionFacturaEmisor": self._change_date_format( + self.asset_id.invoice_date + ), + }, + } + if cancel: + body["IdentificacionBien"] = self.asset_id.name.replace("\n", " ")[0:40] + else: + body["BienesInversion"] = { + "IdentificacionBien": self.asset_id.name.replace("\n", " ")[0:40], + "FechaInicioUtilizacion": self._change_date_format( + self.asset_id.date_start + ), + "ProrrataAnualDefinitiva": self.prorate_percent, + # OPCIONALES + "RegularizacionAnualDeduccion": self.amount, + # "IdentificacionEntrega": None, + # RegularizacionDeduccionEfectuada is used when asset + # is sold. Not implemented¡ + # "RegularizacionDeduccionEfectuada": ( + # self.asset_id.final_deductible_tax_amount + # ), + # "RefExterna": (self.asset_id.invoice_ref or "")[0:60], + # "NumRegistroAcuerdoFacturacion": None, + # "EntidadSucedida": { + # "NombreRazon": self.asset_id.partner_id.name[0:120], + # "NIF": self.asset_id.partner_id.vat[2:], + # }, + } + return body + + def _get_sii_asset_dict(self, cancel=False): + self._aeat_check_exceptions() + asset_dict = self._get_sii_body(cancel) + round_by_keys( + asset_dict, + [ + "ProrrataAnualDefinitiva", + "RegularizacionAnualDeduccion", + "RegularizacionDeduccionEfectuada", + ], + ) + return asset_dict + + def _change_date_format(self, date): + datetimeobject = fields.Date.to_date(date) + new_date = datetimeobject.strftime("%d-%m-%Y") + return new_date + + def _check_fiscal_position(self): + partner_fiscal_position = self.asset_id.partner_id.property_account_position_id + asset_invoice = self.asset_id.invoice_move_line_id.move_id + if asset_invoice: + if asset_invoice.fiscal_position_id != partner_fiscal_position: + raise ValidationError( + _( + "The fiscal position of the " + "partner and of the invoice is different. " + "Please review asset: %(asset_id)i %(asset_name)s", + asset_id=self.asset_id.id, + asset_name=self.asset_id.name, + ) + ) + + def _get_aeat_country_code(self): + self.ensure_one() + return self._aeat_get_partner()._parse_aeat_vat_info()[0] + + def _aeat_get_partner(self): + return self.asset_id.partner_id + + def _is_aeat_simplified_invoice(self): + """Inheritable method to allow control when a + document is simplified or normal""" + partner = self._aeat_get_partner() + return partner.aeat_simplified_invoice + + def _aeat_check_exceptions(self): + """Inheritable method for exceptions control when sending SII documents.""" + self.ensure_one() + self._check_fiscal_position() + gen_type = self._get_sii_gen_type() + partner = self._aeat_get_partner() + country_code = self._get_aeat_country_code() + if (gen_type != 3 or country_code == "ES") and not partner.vat: + raise exceptions.UserError(_("The partner has not a VAT configured.")) + if not self.asset_id.company_id.chart_template: + raise exceptions.UserError( + _("You have to select what account chart template use this company.") + ) + if not self.asset_id.company_id.sii_enabled: + raise exceptions.UserError(_("This company doesn't have SII enabled.")) + + def unlink(self): + res = super().unlink() + for rec in self: + if rec.aeat_state != "not_sent": + raise ValidationError( + _( + "You can't delete a capital asset prorate " + "regularization line if it has been previously sent" + ) + ) + return res diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/mod303.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/mod303.py new file mode 100644 index 000000000..c6b8daf2b --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/mod303.py @@ -0,0 +1,75 @@ +# Copyright NuoBiT Solutions SL - Kilian Niubo +# Copyright NuoBiT Solutions SL - Eric Antones +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + + +from odoo import _, fields, models +from odoo.exceptions import ValidationError + + +class L10nEsAeatMod303Report(models.AbstractModel): + _inherit = "l10n.es.aeat.mod303.report" + + prorate_asset_lines_to_send = fields.One2many( + comodel_name="capital.asset.prorate.regularization", + compute="_compute_prorate_asset_lines_to_send", + ) + + def _compute_prorate_asset_lines_to_send(self): + for rec in self: + rec.prorate_asset_lines_to_send = ( + rec.capital_asset_prorate_regularization_line_ids.filtered( + lambda x: x.aeat_state not in ["sent"] + ) + ) + + prorate_asset_lines_to_cancel = fields.One2many( + comodel_name="capital.asset.prorate.regularization", + compute="_compute_prorate_asset_lines_to_cancel", + ) + + def _compute_prorate_asset_lines_to_cancel(self): + for rec in self: + rec.prorate_asset_lines_to_cancel = ( + rec.capital_asset_prorate_regularization_line_ids.filtered( + lambda x: x.aeat_state not in ["cancelled", "not_sent"] + ) + ) + + def send_sii(self): + for report in self: + if ( + self.move_prorate_capital_asset_id + and self.move_prorate_capital_asset_id.state == "draft" + ): + raise ValidationError( + _( + "Please, post capital asset prorate move of the 303 model " + "before send capital asset prorate regularization to SII" + ) + ) + for line in report.prorate_asset_lines_to_send: + line.send_asset_sii() + + def cancel_sii(self): + for report in self: + for line in report.prorate_asset_lines_to_cancel: + line.cancel_asset_sii() + + def button_unpost(self): + res = super().button_unpost() + if self.prorate_asset_lines_to_cancel: + raise ValidationError( + _( + "Exist prorate lines in year: " + "%(year)s in assets %(assets)s with " + "capital asset prorate lines. " + "Please send the cancellation to the " + "sii before canceling the 303 model.", + year=self.year, + assets=self.prorate_asset_lines_to_cancel, + ) + ) + self.cancel_sii() + return res diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/res_company.py b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/res_company.py new file mode 100644 index 000000000..a24834651 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/models/res_company.py @@ -0,0 +1,56 @@ +# Copyright NuoBiT Solutions SL - Kilian Niubo +# Copyright 2026 NuoBiT Solutions SL - Deniz Gallo +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import datetime, timedelta + +import pytz + +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + capital_asset_use_connector = fields.Boolean( + string="Use connector", + help="Check it to use connector instead of sending the invoice " + "directly when it's validated", + ) + capital_asset_send_mode = fields.Selection( + string="Send mode", + selection=[ + ("auto", "On validate"), + ("fixed", "At fixed time"), + ("delayed", "With delay"), + ], + default="auto", + ) + capital_asset_sent_time = fields.Float( + string="Sent time", + ) + capital_asset_delay_time = fields.Float( + string="Delay time", + ) + + # TODO: This code is like _get_sii_eta. + # Refactor and fix bugs in fixed mode and make an a PR + def _get_sii_eta_capital_assets(self): + if self.capital_asset_send_mode == "fixed": + tz = self.env.context.get("tz", self.env.user.partner_id.tz) + offset = datetime.now(pytz.timezone(tz)).strftime("%z") if tz else "+00" + hour_diff = int(offset[:3]) + hour, minute = divmod(self.capital_asset_sent_time * 60, 60) + hour = int(hour - hour_diff) + minute = int(minute) + now = datetime.now() + if now.hour > hour or (now.hour == hour and now.minute > minute): + now += timedelta(days=1) + now = now.replace(hour=hour, minute=minute) + return now + elif self.send_mode == "delayed": + return datetime.now() + timedelta( + seconds=self.capital_asset_delay_time * 3600 + ) + else: + return None diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/pyproject.toml b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/readme/CONTRIBUTORS.md b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..0355cecbc --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/readme/CONTRIBUTORS.md @@ -0,0 +1,4 @@ +- [NuoBiT](https://www.nuobit.com): + - Kilian Niubo + - Eric Antones + - Deniz Gallo diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/readme/DESCRIPTION.md b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/readme/DESCRIPTION.md new file mode 100644 index 000000000..b563444d9 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allows send to SII automaticaly the capital assets prorate regularization. diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/static/description/icon.png b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/static/description/icon.png new file mode 100644 index 000000000..1cd641e79 Binary files /dev/null and b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/static/description/icon.png differ diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/static/description/index.html b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/static/description/index.html new file mode 100644 index 000000000..f11276958 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/static/description/index.html @@ -0,0 +1,422 @@ + + + + + +AEAT SII - Special Prorate Regularization Capital Asset + + + +
+

AEAT SII - Special Prorate Regularization Capital Asset

+ + +

Beta License: AGPL-3 NuoBiT/odoo-addons

+

This module allows send to SII automaticaly the capital assets prorate +regularization.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • NuoBiT Solutions SL
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the NuoBiT/odoo-addons project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/views/account_asset.xml b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/views/account_asset.xml new file mode 100644 index 000000000..502a791e1 --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/views/account_asset.xml @@ -0,0 +1,82 @@ + + + + + account.asset + + + + + + + + + + diff --git a/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/views/res_company_view.xml b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/views/res_company_view.xml new file mode 100644 index 000000000..6b0804a1f --- /dev/null +++ b/l10n_es_aeat_sii_special_prorate_regularization_capital_asset/views/res_company_view.xml @@ -0,0 +1,35 @@ + + + + + res.company.sii.form + res.company + + + + + + + + + + + + + diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 000000000..7801af7e1 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,11 @@ +odoo-addon-l10n_es_extension@git+https://github.com/nuobit/odoo-addons.git@refs/pull/769/head#subdirectory=l10n_es_extension +odoo-addon-account_asset_management_extension@git+https://github.com/nuobit/odoo-addons.git@refs/pull/754/head#subdirectory=account_asset_management_extension +odoo-addon-l10n_es_asset_extension@git+https://github.com/nuobit/odoo-addons.git@refs/pull/780/head#subdirectory=l10n_es_asset_extension +odoo-addon-l10n_es_account_capital_asset@git+https://github.com/nuobit/odoo-addons.git@refs/pull/814/head#subdirectory=l10n_es_account_capital_asset +odoo-addon-l10n_es_special_prorate@git+https://github.com/nuobit/odoo-addons.git@refs/pull/800/head#subdirectory=l10n_es_special_prorate +odoo-addon-l10n_es_aeat_mod303_special_prorate_regularization@git+https://github.com/nuobit/odoo-addons.git@refs/pull/846/head#subdirectory=l10n_es_aeat_mod303_special_prorate_regularization +odoo-addon-l10n_es_aeat_prorate_asset@git+https://github.com/nuobit/odoo-addons.git@refs/pull/834/head#subdirectory=l10n_es_aeat_prorate_asset +odoo-addon-l10n_es_aeat_vat_special_prorrate@git+https://github.com/nuobit/odoo-addons.git@refs/pull/835/head#subdirectory=l10n_es_aeat_vat_special_prorrate +odoo-addon-l10n_es_aeat_mod303_special_prorate_regularization_capital_asset@git+https://github.com/nuobit/odoo-addons.git@refs/pull/851/head#subdirectory=l10n_es_aeat_mod303_special_prorate_regularization_capital_asset +odoo-addon-account_asset_transfer_extension@git+https://github.com/nuobit/odoo-addons.git@refs/pull/763/head#subdirectory=account_asset_transfer_extension +odoo-addon-l10n_es_aeat_sii_oca_extension@git+https://github.com/nuobit/odoo-addons.git@refs/pull/801/head#subdirectory=l10n_es_aeat_sii_oca_extension