diff --git a/l10n_es_aeat_sii_oca/README.rst b/l10n_es_aeat_sii_oca/README.rst index 1c28a190ff8..36d28f6b763 100644 --- a/l10n_es_aeat_sii_oca/README.rst +++ b/l10n_es_aeat_sii_oca/README.rst @@ -70,29 +70,6 @@ En Linux se pueden usar los siguientes comandos: - Clave privada: "openssl pkcs12 -in Certifcado.p12 -nocerts -out privateKey.pem -nodes" -Además, el módulo queue_job necesita estar configurado de una de estas -formas: - -1. Ajustando variables de entorno: - - ODOO_QUEUE_JOB_CHANNELS=root:4 - - u otro canal de configuración. Por defecto es root:1 - - Si xmlrpc_port no está definido: ODOO_QUEUE_JOB_PORT=8069 - -2. Otra alternativa es usuando un fichero de configuración: - - [options] (...) workers = 4 server_wide_modules = - web,base_sparse_field,queue_job - - (...) [queue_job] channels = root:4 - -3. Por último, arrancando Odoo con - --load=web,base_sparse_field,queue_job y --workers más grande que 1. - -Más información http://odoo-connector.com - Usage ===== @@ -159,6 +136,7 @@ Contributors - `Sygel `__: - Valentin Vinagre + - Manuel Regidor - `Tecnativa `__: diff --git a/l10n_es_aeat_sii_oca/__manifest__.py b/l10n_es_aeat_sii_oca/__manifest__.py index aac61194733..d6bd65bcd11 100644 --- a/l10n_es_aeat_sii_oca/__manifest__.py +++ b/l10n_es_aeat_sii_oca/__manifest__.py @@ -40,7 +40,6 @@ "external_dependencies": {"python": ["zeep", "requests"]}, "depends": [ "account_invoice_refund_link", - "l10n_es", "l10n_es_aeat", ], "data": [ @@ -59,7 +58,7 @@ "security/ir.model.access.csv", "security/aeat_sii.xml", "views/product_view.xml", - "views/ir_cron_tigger_views.xml", + "views/ir_cron_trigger_views.xml", "views/account_fiscal_position_view.xml", "views/res_partner_views.xml", "views/aeat_tax_agency_view.xml", diff --git a/l10n_es_aeat_sii_oca/data/ir_config_parameter_data.xml b/l10n_es_aeat_sii_oca/data/ir_config_parameter_data.xml index 930e250a5a3..e5757af6993 100644 --- a/l10n_es_aeat_sii_oca/data/ir_config_parameter_data.xml +++ b/l10n_es_aeat_sii_oca/data/ir_config_parameter_data.xml @@ -1,11 +1,9 @@ - - - - l10n_es_aeat_sii_oca.sii_batch - 50 - - + + + l10n_es_aeat_sii_oca.sii_batch + 50 + diff --git a/l10n_es_aeat_sii_oca/data/l10n.es.aeat.map.tax.line.tax.csv b/l10n_es_aeat_sii_oca/data/l10n.es.aeat.map.tax.line.tax.csv index b9aa07b6e88..477bca7ea3f 100644 --- a/l10n_es_aeat_sii_oca/data/l10n.es.aeat.map.tax.line.tax.csv +++ b/l10n_es_aeat_sii_oca/data/l10n.es.aeat.map.tax.line.tax.csv @@ -64,15 +64,6 @@ p_iva10_sp_ex,account_tax_template_p_iva10_sp_ex p_iva5_isc,account_tax_template_p_iva5_isc p_iva4_sp_ex,account_tax_template_p_iva4_sp_ex p_iva0_isc,account_tax_template_p_iva0_isc -p_iva4_bi,account_tax_template_p_iva4_bi -p_iva10_bi,account_tax_template_p_iva10_bi -p_iva21_bi,account_tax_template_p_iva21_bi -p_iva21_isp_bi,account_tax_template_p_iva21_isp_bi -p_iva10_isp_bi,account_tax_template_p_iva10_isp_bi -p_iva4_isp_bi,account_tax_template_p_iva4_isp_bi -p_iva4_ic_bi,account_tax_template_p_iva4_ic_bi -p_iva10_ic_bi,account_tax_template_p_iva10_ic_bi -p_iva21_ic_bi,account_tax_template_p_iva21_ic_bi p_iva0_ns,account_tax_template_p_iva0_ns p_iva0_ns_b,account_tax_template_p_iva0_ns_b p_req52,account_tax_template_p_req52 @@ -121,20 +112,4 @@ p_irpf21td,account_tax_template_p_irpf21td p_irpf21te,account_tax_template_p_irpf21te s_irpf24,account_tax_template_s_irpf24 p_irpf24,account_tax_template_p_irpf24 -p_iva21_sp_ex,account_tax_template_p_iva21_sp_ex -p_iva10_sp_ex,account_tax_template_p_iva10_sp_ex -p_iva5_isc,account_tax_template_p_iva5_isc -p_iva4_sp_ex,account_tax_template_p_iva4_sp_ex -p_iva0_isc,account_tax_template_p_iva0_isc -p_iva4_sp_in,account_tax_template_p_iva4_sp_in -p_iva10_sp_in,account_tax_template_p_iva10_sp_in -p_iva21_sp_in,account_tax_template_p_iva21_sp_in -p_iva0_ic_bc,account_tax_template_p_iva0_ic_bc -p_iva4_ic_bc,account_tax_template_p_iva4_ic_bc -p_iva5_ic_bc,account_tax_template_p_iva5_ic_bc -p_iva10_ic_bc,account_tax_template_p_iva10_ic_bc -p_iva21_ic_bc,account_tax_template_p_iva21_ic_bc -p_iva4_ic_bi,account_tax_template_p_iva4_ic_bi -p_iva10_ic_bi,account_tax_template_p_iva10_ic_bi -p_iva21_ic_bi,account_tax_template_p_iva21_ic_bi s_iva0_ns,account_tax_template_s_iva0_ns diff --git a/l10n_es_aeat_sii_oca/models/account_move.py b/l10n_es_aeat_sii_oca/models/account_move.py index 16769a700ff..256c6866f14 100644 --- a/l10n_es_aeat_sii_oca/models/account_move.py +++ b/l10n_es_aeat_sii_oca/models/account_move.py @@ -678,7 +678,7 @@ def cancel_sii(self): raise exceptions.UserError( _( "You can not communicate the cancellation of this invoice " - "at this moment because there is a cron running!" + "at this moment. Please, try again later." ) ) for invoice in invoices: @@ -697,7 +697,7 @@ def cancel_sii(self): def button_cancel(self): if not self._cancel_sii_triggers(): raise exceptions.UserError( - _("You can not cancel this invoice because there is a cron running!") + _("You cannot cancel this invoice. Please, try again later.") ) res = super().button_cancel() for invoice in self.filtered(lambda x: x.sii_enabled): @@ -714,7 +714,7 @@ def button_draft(self): raise exceptions.UserError( _( "You can not set to draft this invoice because" - " there is a cron running!" + " the SII cron could not be cancelled." ) ) return super().button_draft() @@ -794,7 +794,7 @@ def _reverse_moves(self, default_values_list=None, cancel=False): # OVERRIDE if not default_values_list: default_values_list = [{} for move in self] - for move, default_values in zip(self, default_values_list): + for move, default_values in zip(self, default_values_list, strict=False): if move.sii_enabled: extra_dict = {} sii_refund_type = self.env.context.get("sii_refund_type", False) @@ -818,20 +818,13 @@ def cancel_one_invoice(self): @api.model def _send_to_sii(self): - batch = ( - self.env["ir.config_parameter"] - .sudo() - .get_param("l10n_es_aeat_sii_oca.sii_batch") - ) - if batch: - batch = int(batch) documents = all_documents = self.search( [ ("state", "in", self._get_valid_document_states()), ( "sii_state", - "in", - ["not_sent", "sent_modified", "cancelled_modified"], + "not in", + ["sent", "cancelled"], ), ("sii_send_date", "<=", fields.Datetime.now()), ] @@ -840,14 +833,26 @@ def _send_to_sii(self): cron_trigger_obj = self.env["ir.cron.trigger"].sudo() sii_send_cron = self.env.ref("l10n_es_aeat_sii_oca.invoice_send_to_sii") remaining_documents = False + batch = ( + self.env["ir.config_parameter"] + .sudo() + .get_param("l10n_es_aeat_sii_oca.sii_batch") + ) + if batch: + try: + batch = int(batch) + except ValueError as e: + raise exceptions.UserError( + _( + "The value in l10n_es_aeat_sii_oca.sii_batch system" + " parameter must be an integer. Please, check the " + "value of the parameter." + ) + ) from e if batch: documents = all_documents[:batch] remaining_documents = all_documents - documents documents.confirm_one_document() - logging.warning("documents") - logging.warning(documents) - logging.warning("remaining_documents") - logging.warning(remaining_documents) for document in remaining_documents: trigger = cron_trigger_obj.create( {"cron_id": sii_send_cron.id, "call_at": datetime.now()} diff --git a/l10n_es_aeat_sii_oca/models/ir_cron_trigger.py b/l10n_es_aeat_sii_oca/models/ir_cron_trigger.py index 9864e7f6bb7..6fd8bf6f6b2 100644 --- a/l10n_es_aeat_sii_oca/models/ir_cron_trigger.py +++ b/l10n_es_aeat_sii_oca/models/ir_cron_trigger.py @@ -22,6 +22,11 @@ def cancel_now(self): documents.write({"sii_send_date": False}) self.sudo().unlink() - # ESTO NO PARECE EXISTIR EN queue.job - def requeue_sudo(self): - self.sudo().requeue() + def reschedule_sudo(self): + documents = self.env["account.move"].search( + [("invoice_cron_trigger_ids", "in", self.ids)] + ) + for document in documents: + document.write( + {"sii_send_date": document.company_id._get_sii_sending_time()} + ) diff --git a/l10n_es_aeat_sii_oca/models/res_company.py b/l10n_es_aeat_sii_oca/models/res_company.py index 7f48f8a318d..8ad8748623e 100644 --- a/l10n_es_aeat_sii_oca/models/res_company.py +++ b/l10n_es_aeat_sii_oca/models/res_company.py @@ -4,7 +4,6 @@ # Copyright 2018 Javi Melendez # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -import logging from datetime import datetime, timedelta import pytz @@ -85,7 +84,6 @@ def _get_sii_sending_time(self): if now.hour > hour or (now.hour == hour and now.minute > minute): now += timedelta(days=1) now = now.replace(hour=hour, minute=minute) - logging.warning(now) return now elif self.send_mode == "delayed": return datetime.now() + timedelta(seconds=self.delay_time * 3600) diff --git a/l10n_es_aeat_sii_oca/models/sii_mixin.py b/l10n_es_aeat_sii_oca/models/sii_mixin.py index d469ae9dfe6..f105594f014 100644 --- a/l10n_es_aeat_sii_oca/models/sii_mixin.py +++ b/l10n_es_aeat_sii_oca/models/sii_mixin.py @@ -192,11 +192,12 @@ def _compute_sii_registration_key(self): @api.depends("sii_registration_key") def _compute_sii_registration_key_code(self): """ - Para evitar tiempos de instalación largos en BBDD grandes, es necesario que - sólo dependa de sii_registration_key, ya que en caso de añadirlo odoo buscará - todos los movimientos y cuando escribamos el key, aunque sea un campo no almacenado - A partir de v16.0 este cambio ya no es necesario, ya que el sistema ya revisa que el - campo sea almacenado o que este visualizandose (en caché) + Para evitar tiempos de instalación largos en BBDD grandes, es necesario + que sólo dependa de sii_registration_key, ya que en caso de añadirlo + odoo buscará todos los movimientos y cuando escribamos el key, aunque + sea un campo no almacenado + A partir de v16.0 este cambio ya no es necesario, ya que el sistema ya + revisa que el campo sea almacenado o que este visualizandose (en caché) """ for record in self: record.sii_registration_key_code = record.sii_registration_key.code @@ -297,7 +298,11 @@ def _get_sii_triggers_field_name(self): raise NotImplementedError() def _cancel_sii_triggers(self): - self.sudo().mapped(self._get_sii_triggers_field_name()).unlink() + try: + self.sudo().write({"sii_send_date": False}) + self.sudo().mapped(self._get_sii_triggers_field_name()).unlink() + except Exception: + return False return True def _get_valid_document_states(self): @@ -314,8 +319,8 @@ def send_sii(self): if not documents._cancel_sii_triggers(): raise UserError( _( - "You can not communicate this document at this moment " - "because there is a cron running!" + "You can not communicate this document at this moment. " + "Please, try again later." ) ) documents._process_sii_send() diff --git a/l10n_es_aeat_sii_oca/readme/CONFIGURE.md b/l10n_es_aeat_sii_oca/readme/CONFIGURE.md index 8af09257815..2cfcb6999a9 100644 --- a/l10n_es_aeat_sii_oca/readme/CONFIGURE.md +++ b/l10n_es_aeat_sii_oca/readme/CONFIGURE.md @@ -14,26 +14,3 @@ En Linux se pueden usar los siguientes comandos: publicCert.crt -nodes" - Clave privada: "openssl pkcs12 -in Certifcado.p12 -nocerts -out privateKey.pem -nodes" - -Además, el módulo queue_job necesita estar configurado de una de estas -formas: - -1. Ajustando variables de entorno: - - > ODOO_QUEUE_JOB_CHANNELS=root:4 - - u otro canal de configuración. Por defecto es root:1 - - Si xmlrpc_port no está definido: ODOO_QUEUE_JOB_PORT=8069 - -2. Otra alternativa es usuando un fichero de configuración: - - > \[options\] (...) workers = 4 server_wide_modules = - > web,base_sparse_field,queue_job - > - > (...) \[queue_job\] channels = root:4 - -3. Por último, arrancando Odoo con - --load=web,base_sparse_field,queue_job y --workers más grande que 1. - -Más información diff --git a/l10n_es_aeat_sii_oca/readme/CONTRIBUTORS.md b/l10n_es_aeat_sii_oca/readme/CONTRIBUTORS.md index 08b26876333..90d18dc281e 100644 --- a/l10n_es_aeat_sii_oca/readme/CONTRIBUTORS.md +++ b/l10n_es_aeat_sii_oca/readme/CONTRIBUTORS.md @@ -13,6 +13,7 @@ - Eric Antonés - NuoBiT Solutions, S.L. \<\> - [Sygel](https://www.sygel.es): - Valentin Vinagre + - Manuel Regidor - [Tecnativa](https://www.tecnativa.com): - Pedro M. Baeza - João Marques diff --git a/l10n_es_aeat_sii_oca/static/description/index.html b/l10n_es_aeat_sii_oca/static/description/index.html index a9258368999..c10f712fe39 100644 --- a/l10n_es_aeat_sii_oca/static/description/index.html +++ b/l10n_es_aeat_sii_oca/static/description/index.html @@ -418,28 +418,6 @@

Configuration

  • Clave privada: “openssl pkcs12 -in Certifcado.p12 -nocerts -out privateKey.pem -nodes”
  • -

    Además, el módulo queue_job necesita estar configurado de una de estas -formas:

    -
      -
    1. Ajustando variables de entorno:

      -
      -

      ODOO_QUEUE_JOB_CHANNELS=root:4

      -
      -

      u otro canal de configuración. Por defecto es root:1

      -

      Si xmlrpc_port no está definido: ODOO_QUEUE_JOB_PORT=8069

      -
    2. -
    3. Otra alternativa es usuando un fichero de configuración:

      -
      -

      [options] (…) workers = 4 server_wide_modules = -web,base_sparse_field,queue_job

      -

      (…) [queue_job] channels = root:4

      -
      -
    4. -
    5. Por último, arrancando Odoo con -–load=web,base_sparse_field,queue_job y –workers más grande que 1.

      -
    6. -
    -

    Más información http://odoo-connector.com

    Usage

    @@ -504,6 +482,7 @@

    Contributors

  • Eric Antonés - NuoBiT Solutions, S.L. <eantones@nuobit.com>
  • Sygel:
    • Valentin Vinagre
    • +
    • Manuel Regidor
  • Tecnativa:
      diff --git a/l10n_es_aeat_sii_oca/tests/test_l10n_es_aeat_sii.py b/l10n_es_aeat_sii_oca/tests/test_l10n_es_aeat_sii.py index 1e8b9727dcd..b3e8fd99b2b 100644 --- a/l10n_es_aeat_sii_oca/tests/test_l10n_es_aeat_sii.py +++ b/l10n_es_aeat_sii_oca/tests/test_l10n_es_aeat_sii.py @@ -7,7 +7,6 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) import json -import logging from odoo import exceptions from odoo.tools.misc import file_path @@ -56,7 +55,6 @@ def _create_and_test_invoice_sii_dict( xml_id = f"account_tax_template_{tax}" tax_id = self.company._get_tax_id_from_xmlid(xml_id) taxes += self.env["account.tax"].browse(tax_id) - logging.warning(taxes.mapped("name")) tax_names.append(tax) vals.append({"price_unit": line[0], "taxes": taxes}) return self._compare_sii_dict( @@ -376,28 +374,6 @@ def _check_tax_agencies(self, invoice): invoice.company_id.tax_agency_id = False self._check_binding_address(invoice) - # No parece que en v17 se puedan hacer tests con conexión - # Blocking un-mocked external HTTP request - # _request_handler - # def test_tax_agencies_sandbox(self): - # self.sii_cert.company_id = self.invoice.company_id.id - # self._activate_certificate() - # self.invoice.company_id.sii_test = True - # self._check_tax_agencies(self.invoice) - # in_invoice = self._create_invoice("in_invoice") - # self._check_tax_agencies(in_invoice) - - # No parece que en v17 se puedan hacer tests con conexión - # Blocking un-mocked external HTTP request - # _request_handler - # def test_tax_agencies_production(self): - # self.sii_cert.company_id = self.invoice.company_id.id - # self._activate_certificate() - # self.invoice.company_id.sii_test = False - # self._check_tax_agencies(self.invoice) - # in_invoice = self._create_invoice("in_invoice") - # self._check_tax_agencies(in_invoice) - def test_refund_sii_refund_type(self): invoice = self.env["account.move"].create( { diff --git a/l10n_es_aeat_sii_oca/views/ir_cron_tigger_views.xml b/l10n_es_aeat_sii_oca/views/ir_cron_trigger_views.xml similarity index 92% rename from l10n_es_aeat_sii_oca/views/ir_cron_tigger_views.xml rename to l10n_es_aeat_sii_oca/views/ir_cron_trigger_views.xml index 704aa46f2b4..5eb8de7ad5c 100644 --- a/l10n_es_aeat_sii_oca/views/ir_cron_tigger_views.xml +++ b/l10n_es_aeat_sii_oca/views/ir_cron_trigger_views.xml @@ -11,8 +11,8 @@