From c23a9b68314828b4428a7e1a325102863b08cf0a Mon Sep 17 00:00:00 2001
From: ernesto
Date: Tue, 9 Apr 2019 12:19:56 -0400
Subject: [PATCH 01/51] edi_voxel: new module
---
edi_voxel_oca/README.rst | 88 ++++
edi_voxel_oca/__init__.py | 3 +
edi_voxel_oca/__manifest__.py | 29 ++
edi_voxel_oca/data/data_voxel_connection.xml | 8 +
edi_voxel_oca/data/data_voxel_uom.xml | 23 +
edi_voxel_oca/i18n/es.po | 363 +++++++++++++++
edi_voxel_oca/models/__init__.py | 8 +
edi_voxel_oca/models/account.py | 40 ++
edi_voxel_oca/models/product_uom.py | 25 +
edi_voxel_oca/models/queue_job.py | 23 +
edi_voxel_oca/models/res_company.py | 46 ++
edi_voxel_oca/models/res_config_settings.py | 22 +
edi_voxel_oca/models/voxel_mixin.py | 108 +++++
edi_voxel_oca/readme/CONTRIBUTORS.rst | 4 +
edi_voxel_oca/readme/DESCRIPTION.rst | 13 +
edi_voxel_oca/security/ir.model.access.csv | 2 +
edi_voxel_oca/security/voxel_security.xml | 26 ++
edi_voxel_oca/static/description/index.html | 434 ++++++++++++++++++
edi_voxel_oca/views/account_tax_views.xml | 15 +
edi_voxel_oca/views/product_uom_views.xml | 15 +
edi_voxel_oca/views/res_company_view.xml | 35 ++
.../views/res_config_settings_views.xml | 69 +++
edi_voxel_oca/views/template_voxel_report.xml | 36 ++
23 files changed, 1435 insertions(+)
create mode 100644 edi_voxel_oca/README.rst
create mode 100644 edi_voxel_oca/__init__.py
create mode 100644 edi_voxel_oca/__manifest__.py
create mode 100644 edi_voxel_oca/data/data_voxel_connection.xml
create mode 100644 edi_voxel_oca/data/data_voxel_uom.xml
create mode 100644 edi_voxel_oca/i18n/es.po
create mode 100644 edi_voxel_oca/models/__init__.py
create mode 100644 edi_voxel_oca/models/account.py
create mode 100644 edi_voxel_oca/models/product_uom.py
create mode 100644 edi_voxel_oca/models/queue_job.py
create mode 100644 edi_voxel_oca/models/res_company.py
create mode 100644 edi_voxel_oca/models/res_config_settings.py
create mode 100644 edi_voxel_oca/models/voxel_mixin.py
create mode 100644 edi_voxel_oca/readme/CONTRIBUTORS.rst
create mode 100644 edi_voxel_oca/readme/DESCRIPTION.rst
create mode 100644 edi_voxel_oca/security/ir.model.access.csv
create mode 100644 edi_voxel_oca/security/voxel_security.xml
create mode 100644 edi_voxel_oca/static/description/index.html
create mode 100644 edi_voxel_oca/views/account_tax_views.xml
create mode 100644 edi_voxel_oca/views/product_uom_views.xml
create mode 100644 edi_voxel_oca/views/res_company_view.xml
create mode 100644 edi_voxel_oca/views/res_config_settings_views.xml
create mode 100644 edi_voxel_oca/views/template_voxel_report.xml
diff --git a/edi_voxel_oca/README.rst b/edi_voxel_oca/README.rst
new file mode 100644
index 0000000000..4c0847a2fa
--- /dev/null
+++ b/edi_voxel_oca/README.rst
@@ -0,0 +1,88 @@
+=====
+Voxel
+=====
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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-OCA%2Fedi-lightgray.png?logo=github
+ :target: https://github.com/OCA/edi/tree/11.0/edi_voxel
+ :alt: OCA/edi
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/edi-11-0/edi-11-0-edi_voxel
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+ :target: https://runbot.odoo-community.org/runbot/226/11.0
+ :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
+
+This is a base module that allows you to send and receive documents
+such as Invoices, Sales Orders, Delivery Orders in XML format using
+the baVel electronic platform belonging to Voxel Group.
+
+Voxel Group is a company that offers leading solutions for B2B payments,
+eInvoicing, VAT refund and supply chain via its baVel Platform. For more
+information visit `https://www.voxelgroup.net/ `_.
+
+This module doesn't do anything useful by itself, but it is used by other modules:
+
+* *edi_voxel_account_invoice* to send invoices to Voxel.
+* *edi_voxel_stock_picking* to send delivery orders to Voxel.
+* *edi_voxel_sale_order_import* to import a sale order received from Voxel.
+
+**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 smashing it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* `Tecnativa `_:
+
+ * Ernesto Tejeda
+ * Pedro M. Baeza
+
+Maintainers
+~~~~~~~~~~~
+
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
+This module is part of the `OCA/edi `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_voxel_oca/__init__.py b/edi_voxel_oca/__init__.py
new file mode 100644
index 0000000000..69f7babdfb
--- /dev/null
+++ b/edi_voxel_oca/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import models
diff --git a/edi_voxel_oca/__manifest__.py b/edi_voxel_oca/__manifest__.py
new file mode 100644
index 0000000000..a78a335f6a
--- /dev/null
+++ b/edi_voxel_oca/__manifest__.py
@@ -0,0 +1,29 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+{
+ "name": "Voxel",
+ "summary": "Base module for connecting with Voxel",
+ "version": "11.0.1.0.0",
+ "category": "Hidden",
+ "author": "Tecnativa, Odoo Community Association (OCA)",
+ "website": "https://github.com/oca/edi/",
+ "license": "AGPL-3",
+ "depends": [
+ "product",
+ "report_xml",
+ "base_iso3166",
+ "queue_job",
+ ],
+ "data": [
+ "data/data_voxel_connection.xml",
+ "data/data_voxel_uom.xml",
+ "views/res_company_view.xml",
+ "views/account_tax_views.xml",
+ "views/product_uom_views.xml",
+ "views/res_config_settings_views.xml",
+ "views/template_voxel_report.xml",
+ "security/voxel_security.xml",
+ "security/ir.model.access.csv",
+ ],
+ "installable": True,
+}
diff --git a/edi_voxel_oca/data/data_voxel_connection.xml b/edi_voxel_oca/data/data_voxel_connection.xml
new file mode 100644
index 0000000000..f723805bfd
--- /dev/null
+++ b/edi_voxel_oca/data/data_voxel_connection.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ https://fileconnector.voxelgroup.net
+
+
diff --git a/edi_voxel_oca/data/data_voxel_uom.xml b/edi_voxel_oca/data/data_voxel_uom.xml
new file mode 100644
index 0000000000..5c11daf6d9
--- /dev/null
+++ b/edi_voxel_oca/data/data_voxel_uom.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ Unidades
+
+
+ Kgs
+
+
+ Horas
+
+
+ Metros
+
+
+ Lts
+
+
+ Lbs
+
+
diff --git a/edi_voxel_oca/i18n/es.po b/edi_voxel_oca/i18n/es.po
new file mode 100644
index 0000000000..2251f82814
--- /dev/null
+++ b/edi_voxel_oca/i18n/es.po
@@ -0,0 +1,363 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * edi_voxel
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 11.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-04-12 15:25+0000\n"
+"PO-Revision-Date: 2019-04-12 15:25+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: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(EXENTO) Exento"
+msgstr "(EXENTO) Exento"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IBA) Impuesto sobre bebidas alcohólicas"
+msgstr "(IBA) Impuesto sobre bebidas alcohólicas"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(ICIO) Impuesto sobre las construcciones, instalaciones y obras"
+msgstr "(ICIO) Impuesto sobre las construcciones, instalaciones y obras"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IE) Impuestos especiales"
+msgstr "(IE) Impuestos especiales"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo en la comunidad Autónoma Canaria"
+msgstr "(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo en la comunidad Autónoma Canaria"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IGIC) IGIC"
+msgstr "(IGIC) IGIC"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en Ceuta y Melilla"
+msgstr "(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en Ceuta y Melilla"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IHC) Impuesto sobre harinas cárnicas"
+msgstr "(IHC) Impuesto sobre harinas cárnicas"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio ambiente en las Baleares"
+msgstr "(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio ambiente en las Baleares"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMGSN) Impuesto municipal sobre gastos suntuarios en Navarra"
+msgstr "(IMGSN) Impuesto municipal sobre gastos suntuarios en Navarra"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMPN) Impuesto municipal sobre publicidad en Navarra"
+msgstr "(IMPN) Impuesto municipal sobre publicidad en Navarra"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMSN) Impuesto municipal sobre solares en Navarra"
+msgstr "(IMSN) Impuesto municipal sobre solares en Navarra"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMVDN) Impuesto municipal sobre las viviendas desocupadas en Navarra"
+msgstr "(IMVDN) Impuesto municipal sobre las viviendas desocupadas en Navarra"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IRPF) IRPF"
+msgstr "(IRPF) IRPF"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos documentados"
+msgstr "(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos documentados"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IVA) IVA"
+msgstr "(IVA) IVA"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(OTRO) Otro"
+msgstr "(OTRO) Otro"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(RA) Renta aduanas"
+msgstr "(RA) Renta aduanas"
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(RE) Recargo de equivalencia"
+msgstr "(RE) Recargo de equivalencia"
+
+#. module: edi_voxel
+#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid ""
+msgstr ""
+
+#. module: edi_voxel
+#: selection:res.company,voxel_send_mode:0
+msgid "At fixed time"
+msgstr "A una hora fija"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Bultos"
+msgstr "Bultos"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Cajas"
+msgstr "Cajas"
+
+#. module: edi_voxel
+#: selection:account.invoice,voxel_state:0
+#: selection:stock.picking,voxel_state:0
+#: selection:voxel.mixin,voxel_state:0
+msgid "Cancelled"
+msgstr "Cancelado"
+
+#. module: edi_voxel
+#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Choose the send mode for documents to Voxel"
+msgstr "Escoge el modo de envío de los documentos a Voxel"
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_res_company
+msgid "Companies"
+msgstr "Compañías"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Contenedores"
+msgstr "Contenedores"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_delay_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_delay_time
+msgid "Delay time"
+msgstr "Tiempo de retardo"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_display_name
+msgid "Display Name"
+msgstr "Nombre mostrado"
+
+#. module: edi_voxel
+#: selection:account.invoice,voxel_state:0
+#: selection:stock.picking,voxel_state:0
+#: selection:voxel.mixin,voxel_state:0
+msgid "Errors"
+msgstr "Errores"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Horas"
+msgstr "Horas"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_id
+msgid "ID"
+msgstr "ID (identificación)"
+
+#. module: edi_voxel
+#: model:ir.model.fields,help:edi_voxel.field_account_invoice_voxel_state
+#: model:ir.model.fields,help:edi_voxel.field_stock_picking_voxel_state
+#: model:ir.model.fields,help:edi_voxel.field_voxel_mixin_voxel_state
+msgid "Indicates the state of the Voxel report send state"
+msgstr "Indica el estado del envío del reporte a Voxel"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Kgs"
+msgstr "Kgs"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin___last_update
+msgid "Last Modified on"
+msgstr "Última modificación en"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Lbs"
+msgstr "Lbs"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Lts"
+msgstr "Lts"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Metros"
+msgstr "Metros"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "MetrosCuadrados"
+msgstr "MetrosCuadrados"
+
+#. module: edi_voxel
+#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Mode"
+msgstr "Modo"
+
+#. module: edi_voxel
+#: selection:account.invoice,voxel_state:0
+#: selection:stock.picking,voxel_state:0
+#: selection:voxel.mixin,voxel_state:0
+msgid "Not sent"
+msgstr "No enviado"
+
+#. module: edi_voxel
+#: selection:res.company,voxel_send_mode:0
+msgid "On validate"
+msgstr "Al validar"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Otros"
+msgstr "Otros"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Palets"
+msgstr "Palets"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_api_password
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_api_password
+msgid "Password"
+msgstr "Contraseña"
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_product_uom
+msgid "Product Unit of Measure"
+msgstr "Unidad de medida del producto"
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_queue_job
+msgid "Queue Job"
+msgstr "Trabajo en cola"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_send_mode
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_send_mode
+#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Send mode"
+msgstr "Modo de envío"
+
+#. module: edi_voxel
+#: selection:account.invoice,voxel_state:0
+#: selection:stock.picking,voxel_state:0
+#: selection:voxel.mixin,voxel_state:0
+msgid "Sent"
+msgstr "Enviado"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_sent_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_sent_time
+msgid "Sent time"
+msgstr "Hora de envío"
+
+#. module: edi_voxel
+#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Set credentials for connection to Voxel using Web Service"
+msgstr "Establece las credenciales para la conexión con Voxel usando Servicio Web"
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_account_tax
+msgid "Tax"
+msgstr "Impuesto"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_api_url
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_api_url
+msgid "URL"
+msgstr "URL"
+
+#. module: edi_voxel
+#: selection:product.uom,voxel_code:0
+msgid "Unidades"
+msgstr "Unidades"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_api_user
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_api_user
+msgid "User"
+msgstr "Usuario"
+
+#. module: edi_voxel
+#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Voxel"
+msgstr "Voxel"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_product_uom_voxel_code
+msgid "Voxel Code"
+msgstr "Código Voxel"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_account_tax_voxel_tax_code
+msgid "Voxel Tax Code"
+msgstr "Código Voxel"
+
+#. module: edi_voxel
+#: model:res.groups,name:edi_voxel.group_voxel_manager
+msgid "Voxel manager"
+msgstr "Administrador Voxel"
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_voxel_mixin
+msgid "Voxel mixin"
+msgstr "Voxel mixin"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_account_invoice_voxel_state
+#: model:ir.model.fields,field_description:edi_voxel.field_stock_picking_voxel_state
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_voxel_state
+msgid "Voxel send state"
+msgstr "Estado del envío a Voxel"
+
+#. module: edi_voxel
+#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Web Sevice credentials"
+msgstr "Credenciales para el Servicio Web"
+
+#. module: edi_voxel
+#: selection:res.company,voxel_send_mode:0
+msgid "With delay"
+msgstr "Con retardo"
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_account_invoice_voxel_xml_report
+#: model:ir.model.fields,field_description:edi_voxel.field_stock_picking_voxel_xml_report
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_voxel_xml_report
+msgid "XML Report"
+msgstr "Reporte XML"
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_res_config_settings
+msgid "res.config.settings"
+msgstr "res.config.settings"
+
diff --git a/edi_voxel_oca/models/__init__.py b/edi_voxel_oca/models/__init__.py
new file mode 100644
index 0000000000..41e4799302
--- /dev/null
+++ b/edi_voxel_oca/models/__init__.py
@@ -0,0 +1,8 @@
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from . import res_company
+from . import res_config_settings
+from . import voxel_mixin
+from . import product_uom
+from . import account
+from . import queue_job
diff --git a/edi_voxel_oca/models/account.py b/edi_voxel_oca/models/account.py
new file mode 100644
index 0000000000..dc4bce1c91
--- /dev/null
+++ b/edi_voxel_oca/models/account.py
@@ -0,0 +1,40 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class AccountTax(models.Model):
+ _inherit = 'account.tax'
+
+ voxel_tax_code = fields.Selection(
+ selection=[
+ ('IVA', '(IVA) IVA'),
+ ('IGIC', '(IGIC) IGIC'),
+ ('IRPF', '(IRPF) IRPF'),
+ ('RE', '(RE) Recargo de equivalencia'),
+ ('ITPAJD', '(ITPAJD) Impuesto sobre transmisiones patrimoniales y '
+ 'actos jurídicos documentados'),
+ ('IE', '(IE) Impuestos especiales'),
+ ('RA', '(RA) Renta aduanas'),
+ ('IGTECM', '(IGTECM) Impuesto general sobre el tráfico de '
+ 'empresas que se aplica en Ceuta y Melilla'),
+ ('IECDPCAC', '(IECDPCAC) Impuesto especial sobre los combustibles '
+ 'derivados del petróleo en la comunidad Autónoma '
+ 'Canaria'),
+ ('IIIMAB', '(IIIMAB) Impuesto sobre las instalaciones que inciden '
+ 'sobre le medio ambiente en las Baleares'),
+ ('ICIO', '(ICIO) Impuesto sobre las construcciones, instalaciones '
+ 'y obras'),
+ ('IMVDN', '(IMVDN) Impuesto municipal sobre las viviendas '
+ 'desocupadas en Navarra'),
+ ('IMSN', '(IMSN) Impuesto municipal sobre solares en Navarra'),
+ ('IMGSN', '(IMGSN) Impuesto municipal sobre gastos '
+ 'suntuarios en Navarra'),
+ ('IMPN', '(IMPN) Impuesto municipal sobre publicidad en Navarra'),
+ ('IBA', '(IBA) Impuesto sobre bebidas alcohólicas'),
+ ('IHC', '(IHC) Impuesto sobre harinas cárnicas'),
+ ('EXENTO', '(EXENTO) Exento'),
+ ('OTRO', '(OTRO) Otro'),
+ ],
+ )
diff --git a/edi_voxel_oca/models/product_uom.py b/edi_voxel_oca/models/product_uom.py
new file mode 100644
index 0000000000..2fb4490a20
--- /dev/null
+++ b/edi_voxel_oca/models/product_uom.py
@@ -0,0 +1,25 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ProductUoM(models.Model):
+ _inherit = 'product.uom'
+
+ voxel_code = fields.Selection(
+ selection=[
+ ('Unidades', 'Unidades'),
+ ('Kgs', 'Kgs'),
+ ('Lts', 'Lts'),
+ ('Lbs', 'Lbs'),
+ ('Cajas', 'Cajas'),
+ ('Bultos', 'Bultos'),
+ ('Palets', 'Palets'),
+ ('Horas', 'Horas'),
+ ('Metros', 'Metros'),
+ ('MetrosCuadrados', 'MetrosCuadrados'),
+ ('Contenedores', 'Contenedores'),
+ ('Otros', 'Otros'),
+ ],
+ )
diff --git a/edi_voxel_oca/models/queue_job.py b/edi_voxel_oca/models/queue_job.py
new file mode 100644
index 0000000000..58958be38a
--- /dev/null
+++ b/edi_voxel_oca/models/queue_job.py
@@ -0,0 +1,23 @@
+# Copyright 2017 Tecnativa - Pedro M. Baeza
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+
+from odoo import api, models
+
+
+class QueueJob(models.Model):
+ _inherit = 'queue.job'
+
+ @api.multi
+ def voxel_do_now(self):
+ self.sudo().write({'eta': 0})
+
+ @api.multi
+ def voxel_cancel_now(self):
+ self.sudo().filtered(
+ lambda x: x.state in ['pending', 'enqueued']
+ ).unlink()
+
+ @api.multi
+ def voxel_requeue_sudo(self):
+ self.sudo().requeue()
diff --git a/edi_voxel_oca/models/res_company.py b/edi_voxel_oca/models/res_company.py
new file mode 100644
index 0000000000..b0997ce6c7
--- /dev/null
+++ b/edi_voxel_oca/models/res_company.py
@@ -0,0 +1,46 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# 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 Company(models.Model):
+ _inherit = "res.company"
+
+ voxel_enabled = fields.Boolean(string='Enable Voxel')
+ voxel_send_mode = fields.Selection(
+ string="Send mode",
+ selection=[
+ ('auto', 'On validate'),
+ ('fixed', 'At fixed time'),
+ ('delayed', 'With delay'),
+ ], default='auto',
+ )
+ voxel_sent_time = fields.Float(string="Sent time")
+ voxel_delay_time = fields.Float(string="Delay time")
+ # Web Sevice credentials
+ voxel_api_url = fields.Char(string="URL")
+ voxel_api_user = fields.Char(string="User")
+ voxel_api_password = fields.Char(string="Password")
+
+ def _get_voxel_report_eta(self):
+ if self.voxel_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.voxel_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.voxel_send_mode == 'delayed':
+ seconds = self.voxel_delay_time * 3600
+ return datetime.now() + timedelta(seconds=seconds)
+ else:
+ return None
diff --git a/edi_voxel_oca/models/res_config_settings.py b/edi_voxel_oca/models/res_config_settings.py
new file mode 100644
index 0000000000..44d5dc090a
--- /dev/null
+++ b/edi_voxel_oca/models/res_config_settings.py
@@ -0,0 +1,22 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models
+
+
+class ResConfigSettings(models.TransientModel):
+ _inherit = 'res.config.settings'
+
+ voxel_send_mode = fields.Selection(
+ related='company_id.voxel_send_mode', readonly=False)
+ voxel_sent_time = fields.Float(
+ related='company_id.voxel_sent_time', readonly=False)
+ voxel_delay_time = fields.Float(
+ related='company_id.voxel_delay_time', readonly=False)
+ # Web Sevice credentials
+ voxel_api_url = fields.Char(
+ related='company_id.voxel_api_url', readonly=False)
+ voxel_api_user = fields.Char(
+ related='company_id.voxel_api_user', readonly=False)
+ voxel_api_password = fields.Char(
+ related='company_id.voxel_api_password', readonly=False)
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
new file mode 100644
index 0000000000..035a890168
--- /dev/null
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -0,0 +1,108 @@
+# Copyright 2019 Tecnativa - Ernesto Tejeda
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from datetime import datetime
+import logging
+import requests
+from lxml import etree
+from odoo import api, fields, models
+
+_logger = logging.getLogger(__name__)
+
+try:
+ from odoo.addons.queue_job.job import job
+except ImportError:
+ _logger.debug('Can not `import queue_job`.')
+ import functools
+
+ def empty_decorator_factory(*argv, **kwargs):
+ return functools.partial
+ job = empty_decorator_factory
+
+
+class VoxelMixin(models.AbstractModel):
+ _name = "voxel.mixin"
+ _description = "Voxel mixin"
+
+ voxel_state = fields.Selection(
+ selection=[
+ ('not_sent', 'Not sent'),
+ ('sent', 'Sent'),
+ ('sent_errors', 'Errors'),
+ ('cancelled', 'Cancelled'),
+ ],
+ string="Voxel send state", default='not_sent', readonly=True,
+ copy=False,
+ help="Indicates the state of the Voxel report send state",
+ )
+ voxel_xml_report = fields.Text(
+ string="XML Report",
+ readonly=True)
+
+ @api.multi
+ def _get_voxel_filename(self):
+ self.ensure_one()
+ document_type = self.get_document_type()
+ date_time_seq = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
+ return "%s_%s.xml" % (document_type, date_time_seq)
+
+ @api.multi
+ def enqueue_voxel_report(self, report_name):
+ company = self.env['res.company']._company_default_get()
+ eta = company._get_voxel_report_eta()
+ queue_obj = self.env['queue.job'].sudo()
+ for record in self:
+ new_delay = record.sudo().with_delay(
+ eta=eta)._get_and_send_voxel_report(report_name)
+ job = queue_obj.search([
+ ('uuid', '=', new_delay.uuid)
+ ], limit=1)
+ record.sudo().voxel_job_ids |= job
+
+ @job(default_channel='root.voxel')
+ @api.multi
+ def _get_and_send_voxel_report(self, report_name):
+ self.ensure_one()
+ report = self.env.ref(report_name)
+ report_xml = report.render_qweb_xml(self.ids, {})[0]
+ # Remove blank spaces
+ tree = etree.fromstring(report_xml,
+ etree.XMLParser(remove_blank_text=True))
+ clean_report_xml = etree.tostring(tree, xml_declaration=True,
+ encoding='UTF-8')
+ self._send_voxel_report(clean_report_xml)
+ # Update last xml report
+ self.voxel_xml_report = report_xml
+
+ def _send_voxel_report(self, file_data):
+ company = self.env['res.company']._company_default_get()
+ outbox_url = "%s/Outbox" % company.voxel_api_url
+ user = company.voxel_api_user
+ password = company.voxel_api_password
+ file_name = self._get_voxel_filename()
+ try:
+ response = requests.put(
+ "%s/%s" % (outbox_url, file_name),
+ data=file_data,
+ auth=(user, password))
+ self.voxel_state = 'sent'
+ _logger.info("Voxel request response: %s", str(response))
+ except Exception:
+ self.voxel_state = 'sent_errors'
+ raise
+
+ def _get_outbox_url(self):
+ company = self.env['res.company']._company_default_get()
+ return "%s/Outbox" % company.voxel_api_url
+
+ @api.multi
+ def _cancel_voxel_jobs(self, jobs):
+ # set voxel state to cancelled
+ self.write({'voxel_state': 'cancelled'})
+ # Remove not started jobs
+ for queue in jobs:
+ if queue.state == 'started':
+ return False
+ elif queue.state in ('pending', 'enqueued', 'failed'):
+ queue.unlink()
+ return True
diff --git a/edi_voxel_oca/readme/CONTRIBUTORS.rst b/edi_voxel_oca/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..b31cef3217
--- /dev/null
+++ b/edi_voxel_oca/readme/CONTRIBUTORS.rst
@@ -0,0 +1,4 @@
+* `Tecnativa `_:
+
+ * Ernesto Tejeda
+ * Pedro M. Baeza
diff --git a/edi_voxel_oca/readme/DESCRIPTION.rst b/edi_voxel_oca/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..2e6161c937
--- /dev/null
+++ b/edi_voxel_oca/readme/DESCRIPTION.rst
@@ -0,0 +1,13 @@
+This is a base module that allows you to send and receive documents
+such as Invoices, Sales Orders, Delivery Orders in XML format using
+the baVel electronic platform belonging to Voxel Group.
+
+Voxel Group is a company that offers leading solutions for B2B payments,
+eInvoicing, VAT refund and supply chain via its baVel Platform. For more
+information visit `https://www.voxelgroup.net/ `_.
+
+This module doesn't do anything useful by itself, but it is used by other modules:
+
+* *edi_voxel_account_invoice* to send invoices to Voxel.
+* *edi_voxel_stock_picking* to send delivery orders to Voxel.
+* *edi_voxel_sale_order_import* to import a sale order received from Voxel.
diff --git a/edi_voxel_oca/security/ir.model.access.csv b/edi_voxel_oca/security/ir.model.access.csv
new file mode 100644
index 0000000000..a44729d2e8
--- /dev/null
+++ b/edi_voxel_oca/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_queue_job_voxel,access_queue_job voxel,queue_job.model_queue_job,group_voxel_manager,1,0,0,0
diff --git a/edi_voxel_oca/security/voxel_security.xml b/edi_voxel_oca/security/voxel_security.xml
new file mode 100644
index 0000000000..cafc228ab7
--- /dev/null
+++ b/edi_voxel_oca/security/voxel_security.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Voxel manager
+
+
+
+
+
+ Queue job Voxel visibility
+
+ [('channel', '=', 'root.voxel')]
+
+
+
+
+ Queue job manager
+
+ [(1, '=', 1)]
+
+
+
+
diff --git a/edi_voxel_oca/static/description/index.html b/edi_voxel_oca/static/description/index.html
new file mode 100644
index 0000000000..bc24c02ad7
--- /dev/null
+++ b/edi_voxel_oca/static/description/index.html
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+Voxel
+
+
+
+
+
Voxel
+
+
+
+
This is a base module that allows you to send and receive documents
+such as Invoices, Sales Orders, Delivery Orders in XML format using
+the baVel electronic platform belonging to Voxel Group.
+
Voxel Group is a company that offers leading solutions for B2B payments,
+eInvoicing, VAT refund and supply chain via its baVel Platform. For more
+information visit https://www.voxelgroup.net/.
+
This module doesn’t do anything useful by itself, but it is used by other modules:
+
+
edi_voxel_account_invoice to send invoices to Voxel.
+
edi_voxel_stock_picking to send delivery orders to Voxel.
+
edi_voxel_sale_order_import to import a sale order received from Voxel.
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 smashing it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
This module is part of the OCA/edi project on GitHub.
Set credentials for connection to Voxel using Web Service
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/edi_voxel_oca/views/res_partner_views.xml b/edi_voxel_oca/views/res_partner_views.xml
new file mode 100644
index 0000000000..78046256f2
--- /dev/null
+++ b/edi_voxel_oca/views/res_partner_views.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ res.partner.voxel.enabled
+ res.partner
+
+
+
+
+
+
+
+
diff --git a/edi_voxel_oca/views/voxel_login_views.xml b/edi_voxel_oca/views/voxel_login_views.xml
new file mode 100644
index 0000000000..491299b54c
--- /dev/null
+++ b/edi_voxel_oca/views/voxel_login_views.xml
@@ -0,0 +1,25 @@
+
+
+
+
+ voxel.login.view.form
+ voxel.login
+
+
+
+
+
From b7ce357db19674ca2bab8d4ecb0fdc9ca1c03bff Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Sat, 29 Jun 2019 14:20:05 +0200
Subject: [PATCH 04/51] [FIX+IMP] edi_voxel: 5 things:
[FIX] edi_voxel: ACL
[FIX] edi_voxel: Security files always first
[FIX+IMP] edi_voxel: Fine-tuning on the module
[FIX] edi_voxel: Propagate company
[FIX+IMP] edi_voxel: Raise if product not found + company UI reorder + play onchanges
---
edi_voxel_oca/__manifest__.py | 4 +--
edi_voxel_oca/i18n/es.po | 3 +-
edi_voxel_oca/models/voxel_mixin.py | 36 ++++++++++------------
edi_voxel_oca/security/ir.model.access.csv | 1 +
edi_voxel_oca/views/res_company_view.xml | 22 +++++++------
5 files changed, 32 insertions(+), 34 deletions(-)
diff --git a/edi_voxel_oca/__manifest__.py b/edi_voxel_oca/__manifest__.py
index 2f8281a67f..6eb96ccbf0 100644
--- a/edi_voxel_oca/__manifest__.py
+++ b/edi_voxel_oca/__manifest__.py
@@ -15,6 +15,8 @@
"queue_job",
],
"data": [
+ "security/voxel_security.xml",
+ "security/ir.model.access.csv",
"data/data_voxel_uom.xml",
"views/res_company_view.xml",
"views/account_tax_views.xml",
@@ -23,8 +25,6 @@
"views/res_partner_views.xml",
"views/template_voxel_report.xml",
"views/voxel_login_views.xml",
- "security/voxel_security.xml",
- "security/ir.model.access.csv",
],
"installable": True,
}
diff --git a/edi_voxel_oca/i18n/es.po b/edi_voxel_oca/i18n/es.po
index efb320aeb7..3900fb65ec 100644
--- a/edi_voxel_oca/i18n/es.po
+++ b/edi_voxel_oca/i18n/es.po
@@ -379,7 +379,7 @@ msgstr "Login Voxel"
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_login_ids
msgid "Voxel logins"
-msgstr "Voxel logins"
+msgstr "Logins de Voxel"
#. module: edi_voxel
#: model:res.groups,name:edi_voxel.group_voxel_manager
@@ -421,4 +421,3 @@ msgstr "Reporte XML"
#: model:ir.model,name:edi_voxel.model_res_config_settings
msgid "res.config.settings"
msgstr "res.config.settings"
-
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index b87c5c49fb..edc82d7d55 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -113,24 +113,20 @@ def enqueue_import_voxel_documents(self, company):
# iterate the list to import documents one by one
for voxel_filename in voxel_filenames:
# Look first if there's a job for the current filename.
- # If so, retry that one
+ # If not, create it
file_job = queue_job_obj.search([
('channel', '=', 'root.voxel_import')
]).filtered(lambda r: r.args == [voxel_filename, company])[:1]
- if file_job:
- if file_job.state == 'failed':
- file_job.voxel_requeue_sudo()
- continue
- # If not, create a new one
- self.with_context(
- company_id=company.id
- ).with_delay()._import_voxel_document(voxel_filename, company)
+ if not file_job:
+ self.with_context(
+ company_id=company.id
+ ).with_delay()._import_voxel_document(voxel_filename, company)
def _list_voxel_document_filenames(self, company):
try:
response = self._request_to_voxel(requests.get, company)
except Exception:
- _logger.info("Error reading the inbox in Voxel")
+ _logger.exception("Error reading the inbox in Voxel")
return []
# if no error, return list of documents file names
return response.content.decode('utf-8').split('\n')
@@ -145,21 +141,21 @@ def _import_voxel_document(self, voxel_filename, company):
# if no error, get xml content
content = response.content.decode('utf-8')
# call method that parse and create the document from the content
- doc = self.create_document_from_xml(content, voxel_filename)
+ doc = self.create_document_from_xml(content, voxel_filename, company)
if doc:
# write file content in the created object
doc.write({
'voxel_xml_report': content,
- 'voxel_filename': voxel_filename
+ 'voxel_filename': voxel_filename,
})
# Delete file from Voxel
- # self._delete_voxel_document(voxel_filename)
+ # self._delete_voxel_document(voxel_filename, company)
- # def _delete_voxel_document(self, voxel_filename):
- # try:
- # self._request_to_voxel(requests.delete, company, voxel_filename)
- # except Exception:
- # raise Exception("Error deleting document %s" % (voxel_filename))
+ def _delete_voxel_document(self, voxel_filename, company):
+ try:
+ self._request_to_voxel(requests.delete, company, voxel_filename)
+ except Exception:
+ raise Exception("Error deleting document %s" % (voxel_filename))
def _request_to_voxel(self, request_method, company=None,
voxel_filename=None, data=None):
@@ -172,10 +168,10 @@ def _request_to_voxel(self, request_method, company=None,
data=data)
_logger.debug("Voxel request response: %s", str(response))
if response.status_code != 200:
- raise Exception
+ response.raise_for_status()
return response
- def create_document_from_xml(self):
+ def create_document_from_xml(self, xml_content, voxel_filename, company):
""" This method must be overwritten by the model that use
`enqueue_import_voxel_documents` method """
return False
diff --git a/edi_voxel_oca/security/ir.model.access.csv b/edi_voxel_oca/security/ir.model.access.csv
index a44729d2e8..3a863c4e88 100644
--- a/edi_voxel_oca/security/ir.model.access.csv
+++ b/edi_voxel_oca/security/ir.model.access.csv
@@ -1,2 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_queue_job_voxel,access_queue_job voxel,queue_job.model_queue_job,group_voxel_manager,1,0,0,0
+access_voxel_login,access_voxel_login,model_voxel_login,group_voxel_manager,1,1,1,1
diff --git a/edi_voxel_oca/views/res_company_view.xml b/edi_voxel_oca/views/res_company_view.xml
index bcebf89039..8e1ffe478a 100644
--- a/edi_voxel_oca/views/res_company_view.xml
+++ b/edi_voxel_oca/views/res_company_view.xml
@@ -7,13 +7,25 @@
res.company.voxel.formres.company
+
+
+
+
+
+
+
+
+
+
+
@@ -24,16 +36,6 @@
-
-
-
-
-
-
-
-
-
-
From c97e41656a788dcbf5cc55f8b19a3fdbbed27195 Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Mon, 2 Dec 2019 16:41:25 +0100
Subject: [PATCH 05/51] [FIX] edi_voxel: Handle properly exceptions in sending
[ci skip]
---
edi_voxel_oca/models/voxel_mixin.py | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index edc82d7d55..062061b899 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -6,6 +6,7 @@
from datetime import datetime
from lxml import etree
from odoo import api, fields, models
+from odoo.modules.registry import Registry
_logger = logging.getLogger(__name__)
@@ -92,7 +93,13 @@ def _send_voxel_report(self, file_data):
data=file_data)
self.voxel_state = 'sent'
except Exception:
- self.voxel_state = 'sent_errors'
+ new_cr = Registry(self.env.cr.dbname).cursor()
+ env = api.Environment(new_cr, self.env.uid, self.env.context)
+ record = env[self._name].browse(self.id)
+ record.voxel_state = 'sent_errors'
+ new_cr.commit()
+ new_cr.close()
+ raise
@api.multi
def _cancel_voxel_jobs(self, jobs):
From d97960e6111a61f1b832ea468aeea52a28e98168 Mon Sep 17 00:00:00 2001
From: ernestotejeda
Date: Wed, 11 Dec 2019 10:15:09 -0500
Subject: [PATCH 06/51] [MIG] edi_voxel: Migration to 12.0
---
edi_voxel_oca/README.rst | 10 +-
edi_voxel_oca/__manifest__.py | 2 +-
edi_voxel_oca/data/data_voxel_uom.xml | 12 +-
edi_voxel_oca/i18n/edi_voxel.pot | 409 ++++++++++++++++++
edi_voxel_oca/i18n/es.po | 229 +++++-----
edi_voxel_oca/models/__init__.py | 2 +-
.../models/{product_uom.py => uom_uom.py} | 4 +-
edi_voxel_oca/static/description/index.html | 6 +-
edi_voxel_oca/views/product_uom_views.xml | 6 +-
.../views/res_config_settings_views.xml | 4 +-
10 files changed, 561 insertions(+), 123 deletions(-)
create mode 100644 edi_voxel_oca/i18n/edi_voxel.pot
rename edi_voxel_oca/models/{product_uom.py => uom_uom.py} (91%)
diff --git a/edi_voxel_oca/README.rst b/edi_voxel_oca/README.rst
index 4c0847a2fa..db8b9a39d1 100644
--- a/edi_voxel_oca/README.rst
+++ b/edi_voxel_oca/README.rst
@@ -14,13 +14,13 @@ Voxel
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github
- :target: https://github.com/OCA/edi/tree/11.0/edi_voxel
+ :target: https://github.com/OCA/edi/tree/12.0/edi_voxel
:alt: OCA/edi
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/edi-11-0/edi-11-0-edi_voxel
+ :target: https://translation.odoo-community.org/projects/edi-12-0/edi-12-0-edi_voxel
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/226/11.0
+ :target: https://runbot.odoo-community.org/runbot/226/12.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -50,7 +50,7 @@ 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 smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -83,6 +83,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/edi `_ project on GitHub.
+This module is part of the `OCA/edi `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_voxel_oca/__manifest__.py b/edi_voxel_oca/__manifest__.py
index 6eb96ccbf0..d2a21e1ea8 100644
--- a/edi_voxel_oca/__manifest__.py
+++ b/edi_voxel_oca/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Voxel",
"summary": "Base module for connecting with Voxel",
- "version": "11.0.1.0.0",
+ "version": "12.0.1.0.0",
"category": "Hidden",
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/oca/edi/",
diff --git a/edi_voxel_oca/data/data_voxel_uom.xml b/edi_voxel_oca/data/data_voxel_uom.xml
index 5c11daf6d9..9d7aff303a 100644
--- a/edi_voxel_oca/data/data_voxel_uom.xml
+++ b/edi_voxel_oca/data/data_voxel_uom.xml
@@ -2,22 +2,22 @@
-
+ Unidades
-
+ Kgs
-
+ Horas
-
+ Metros
-
+ Lts
-
+ Lbs
diff --git a/edi_voxel_oca/i18n/edi_voxel.pot b/edi_voxel_oca/i18n/edi_voxel.pot
new file mode 100644
index 0000000000..d0eda31d8e
--- /dev/null
+++ b/edi_voxel_oca/i18n/edi_voxel.pot
@@ -0,0 +1,409 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * edi_voxel
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 12.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2019-12-11 14:55+0000\n"
+"PO-Revision-Date: 2019-12-11 14:55+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: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(EXENTO) Exento"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IBA) Impuesto sobre bebidas alcohólicas"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(ICIO) Impuesto sobre las construcciones, instalaciones y obras"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IE) Impuestos especiales"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo en la comunidad Autónoma Canaria"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IGIC) IGIC"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en Ceuta y Melilla"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IHC) Impuesto sobre harinas cárnicas"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio ambiente en las Baleares"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMGSN) Impuesto municipal sobre gastos suntuarios en Navarra"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMPN) Impuesto municipal sobre publicidad en Navarra"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMSN) Impuesto municipal sobre solares en Navarra"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IMVDN) Impuesto municipal sobre las viviendas desocupadas en Navarra"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IRPF) IRPF"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos documentados"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(IVA) IVA"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(OTRO) Otro"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(RA) Renta aduanas"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:account.tax,voxel_tax_code:0
+msgid "(RE) Recargo de equivalencia"
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Send mode\n"
+" "
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Web Sevice credentials\n"
+" "
+msgstr ""
+
+#. module: edi_voxel
+#: selection:res.company,voxel_send_mode:0
+msgid "At fixed time"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Bultos"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Cajas"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Choose the send mode for documents to Voxel"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_res_company
+msgid "Companies"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_res_config_settings
+msgid "Config Settings"
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
+msgid "Configuration"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_res_partner
+msgid "Contact"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Contenedores"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_delay_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings__voxel_delay_time
+msgid "Delay time"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__display_name
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_enabled
+#: model:ir.model.fields,field_description:edi_voxel.field_res_partner__voxel_enabled
+#: model:ir.model.fields,field_description:edi_voxel.field_res_users__voxel_enabled
+msgid "Enable Voxel"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+msgid "Errors"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Horas"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__id
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__id
+msgid "ID"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,help:edi_voxel.field_voxel_mixin__voxel_state
+msgid "Indicates the state of the Voxel report send state"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Kgs"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login____last_update
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Lbs"
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
+msgid "Logins"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Lts"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Metros"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "MetrosCuadrados"
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Mode"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__name
+msgid "Name"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+msgid "Not sent"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:res.company,voxel_send_mode:0
+msgid "On validate"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Otros"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Palets"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__company_id
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__password
+msgid "Password"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_uom_uom
+msgid "Product Unit of Measure"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_queue_job
+msgid "Queue Job"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_send_mode
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings__voxel_send_mode
+msgid "Send mode"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+msgid "Sent"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_sent_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings__voxel_sent_time
+msgid "Sent time"
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+msgid "Set credentials for connection to Voxel using Web Service"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_account_tax
+msgid "Tax"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__url
+msgid "URL"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
+msgid "Unidades"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__user
+msgid "User"
+msgstr ""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
+msgid "Voxel"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_uom_uom__voxel_code
+msgid "Voxel Code"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_account_tax__voxel_tax_code
+msgid "Voxel Tax Code"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_voxel_login
+msgid "Voxel login"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_login_ids
+msgid "Voxel logins"
+msgstr ""
+
+#. module: edi_voxel
+#: model:res.groups,name:edi_voxel.group_voxel_manager
+msgid "Voxel manager"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_voxel_mixin
+msgid "Voxel mixin"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_state
+msgid "Voxel send state"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:res.company,voxel_send_mode:0
+msgid "With delay"
+msgstr ""
+
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_xml_report
+msgid "XML Report"
+msgstr ""
+
diff --git a/edi_voxel_oca/i18n/es.po b/edi_voxel_oca/i18n/es.po
index 3900fb65ec..9b4d7b8067 100644
--- a/edi_voxel_oca/i18n/es.po
+++ b/edi_voxel_oca/i18n/es.po
@@ -1,19 +1,21 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * edi_voxel
+# * edi_voxel
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-06-28 20:10+0000\n"
-"PO-Revision-Date: 2019-06-28 20:10+0000\n"
+"POT-Creation-Date: 2019-12-11 14:55+0000\n"
+"PO-Revision-Date: 2019-12-11 09:59-0500\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"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: \n"
+"X-Generator: Poedit 2.0.6\n"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
@@ -37,8 +39,12 @@ msgstr "(IE) Impuestos especiales"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
-msgid "(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo en la comunidad Autónoma Canaria"
-msgstr "(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo en la comunidad Autónoma Canaria"
+msgid ""
+"(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo "
+"en la comunidad Autónoma Canaria"
+msgstr ""
+"(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo "
+"en la comunidad Autónoma Canaria"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
@@ -47,8 +53,12 @@ msgstr "(IGIC) IGIC"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
-msgid "(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en Ceuta y Melilla"
-msgstr "(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en Ceuta y Melilla"
+msgid ""
+"(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en "
+"Ceuta y Melilla"
+msgstr ""
+"(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en "
+"Ceuta y Melilla"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
@@ -57,8 +67,12 @@ msgstr "(IHC) Impuesto sobre harinas cárnicas"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
-msgid "(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio ambiente en las Baleares"
-msgstr "(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio ambiente en las Baleares"
+msgid ""
+"(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio "
+"ambiente en las Baleares"
+msgstr ""
+"(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio "
+"ambiente en las Baleares"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
@@ -87,8 +101,12 @@ msgstr "(IRPF) IRPF"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
-msgid "(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos documentados"
-msgstr "(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos documentados"
+msgid ""
+"(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos "
+"documentados"
+msgstr ""
+"(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos "
+"documentados"
#. module: edi_voxel
#: selection:account.tax,voxel_tax_code:0
@@ -111,9 +129,34 @@ msgid "(RE) Recargo de equivalencia"
msgstr "(RE) Recargo de equivalencia"
#. module: edi_voxel
-#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
-msgid ""
-msgstr ""
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#, fuzzy
+#| msgid ""
+#| ""
+msgid ""
+"Send mode\n"
+" "
+msgstr ""
+""
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#, fuzzy
+#| msgid ""
+#| ""
+msgid ""
+"Web Sevice credentials\n"
+" "
+msgstr ""
+""
#. module: edi_voxel
#: selection:res.company,voxel_send_mode:0
@@ -121,25 +164,22 @@ msgid "At fixed time"
msgstr "A una hora fija"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Bultos"
msgstr "Bultos"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Cajas"
msgstr "Cajas"
#. module: edi_voxel
-#: selection:account.invoice,voxel_state:0
-#: selection:sale.order,voxel_state:0
-#: selection:stock.picking,voxel_state:0
#: selection:voxel.mixin,voxel_state:0
msgid "Cancelled"
msgstr "Cancelado"
#. module: edi_voxel
-#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
msgid "Choose the send mode for documents to Voxel"
msgstr "Escoge el modo de envío de los documentos a Voxel"
@@ -148,127 +188,137 @@ msgstr "Escoge el modo de envío de los documentos a Voxel"
msgid "Companies"
msgstr "Compañías"
+#. module: edi_voxel
+#: model:ir.model,name:edi_voxel.model_res_config_settings
+#, fuzzy
+#| msgid "res.config.settings"
+msgid "Config Settings"
+msgstr "res.config.settings"
+
+#. module: edi_voxel
+#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
+msgid "Configuration"
+msgstr "Configuración"
+
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_res_partner
msgid "Contact"
msgstr "Contacto"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Contenedores"
msgstr "Contenedores"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_create_uid
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_create_date
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__create_date
msgid "Created on"
msgstr "Creado en"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_delay_time
-#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_delay_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_delay_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings__voxel_delay_time
msgid "Delay time"
msgstr "Tiempo de retardo"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_display_name
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_display_name
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__display_name
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__display_name
msgid "Display Name"
msgstr "Nombre mostrado"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_enabled
-#: model:ir.model.fields,field_description:edi_voxel.field_res_partner_voxel_enabled
-#: model:ir.model.fields,field_description:edi_voxel.field_res_users_voxel_enabled
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_enabled
+#: model:ir.model.fields,field_description:edi_voxel.field_res_partner__voxel_enabled
+#: model:ir.model.fields,field_description:edi_voxel.field_res_users__voxel_enabled
msgid "Enable Voxel"
msgstr "Habilitar voxel"
#. module: edi_voxel
-#: selection:account.invoice,voxel_state:0
-#: selection:sale.order,voxel_state:0
-#: selection:stock.picking,voxel_state:0
#: selection:voxel.mixin,voxel_state:0
msgid "Errors"
msgstr "Errores"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Horas"
msgstr "Horas"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_id
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_id
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__id
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__id
msgid "ID"
msgstr "ID (identificación)"
#. module: edi_voxel
-#: model:ir.model.fields,help:edi_voxel.field_account_invoice_voxel_state
-#: model:ir.model.fields,help:edi_voxel.field_sale_order_voxel_state
-#: model:ir.model.fields,help:edi_voxel.field_stock_picking_voxel_state_5987
-#: model:ir.model.fields,help:edi_voxel.field_voxel_mixin_voxel_state
+#: model:ir.model.fields,help:edi_voxel.field_voxel_mixin__voxel_state
msgid "Indicates the state of the Voxel report send state"
msgstr "Indica el estado del envío del reporte a Voxel"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Kgs"
msgstr "Kgs"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login___last_update
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin___last_update
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login____last_update
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin____last_update
msgid "Last Modified on"
msgstr "Última modificación en"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_write_uid
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__write_uid
msgid "Last Updated by"
msgstr "Última actualización de"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_write_date
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__write_date
msgid "Last Updated on"
msgstr "Última actualización en"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Lbs"
msgstr "Lbs"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
+#, fuzzy
+#| msgid "Voxel Logins"
+msgid "Logins"
+msgstr "Voxel logins"
+
+#. module: edi_voxel
+#: selection:uom.uom,voxel_code:0
msgid "Lts"
msgstr "Lts"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Metros"
msgstr "Metros"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "MetrosCuadrados"
msgstr "MetrosCuadrados"
#. module: edi_voxel
-#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
msgid "Mode"
msgstr "Modo"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_name
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__name
msgid "Name"
msgstr "Nombre"
#. module: edi_voxel
-#: selection:account.invoice,voxel_state:0
-#: selection:sale.order,voxel_state:0
-#: selection:stock.picking,voxel_state:0
#: selection:voxel.mixin,voxel_state:0
msgid "Not sent"
msgstr "No enviado"
@@ -279,23 +329,23 @@ msgid "On validate"
msgstr "Al validar"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Otros"
msgstr "Otros"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Palets"
msgstr "Palets"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_company_id
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_password
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__company_id
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__password
msgid "Password"
msgstr "Contraseña"
#. module: edi_voxel
-#: model:ir.model,name:edi_voxel.model_product_uom
+#: model:ir.model,name:edi_voxel.model_uom_uom
msgid "Product Unit of Measure"
msgstr "Unidad de medida del producto"
@@ -305,30 +355,27 @@ msgid "Queue Job"
msgstr "Trabajo en cola"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_send_mode
-#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_send_mode
-#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_send_mode
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings__voxel_send_mode
msgid "Send mode"
msgstr "Modo de envío"
#. module: edi_voxel
-#: selection:account.invoice,voxel_state:0
-#: selection:sale.order,voxel_state:0
-#: selection:stock.picking,voxel_state:0
#: selection:voxel.mixin,voxel_state:0
msgid "Sent"
msgstr "Enviado"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_sent_time
-#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings_voxel_sent_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_sent_time
+#: model:ir.model.fields,field_description:edi_voxel.field_res_config_settings__voxel_sent_time
msgid "Sent time"
msgstr "Hora de envío"
#. module: edi_voxel
-#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
msgid "Set credentials for connection to Voxel using Web Service"
-msgstr "Establece las credenciales para la conexión con Voxel usando Servicio Web"
+msgstr ""
+"Establece las credenciales para la conexión con Voxel usando Servicio Web"
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_account_tax
@@ -336,38 +383,33 @@ msgid "Tax"
msgstr "Impuesto"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_url
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__url
msgid "URL"
msgstr "URL"
#. module: edi_voxel
-#: selection:product.uom,voxel_code:0
+#: selection:uom.uom,voxel_code:0
msgid "Unidades"
msgstr "Unidades"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login_user
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__user
msgid "User"
msgstr "Usuario"
#. module: edi_voxel
-#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
-#: model:ir.ui.view,arch_db:edi_voxel.view_company_form
+#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
+#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
msgid "Voxel"
msgstr "Voxel"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_product_uom_voxel_code
+#: model:ir.model.fields,field_description:edi_voxel.field_uom_uom__voxel_code
msgid "Voxel Code"
msgstr "Código Voxel"
#. module: edi_voxel
-#: model:ir.ui.view,arch_db:edi_voxel.view_company_form
-msgid "Voxel Logins"
-msgstr "Voxel logins"
-
-#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_account_tax_voxel_tax_code
+#: model:ir.model.fields,field_description:edi_voxel.field_account_tax__voxel_tax_code
msgid "Voxel Tax Code"
msgstr "Código Voxel"
@@ -377,7 +419,7 @@ msgid "Voxel login"
msgstr "Login Voxel"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_res_company_voxel_login_ids
+#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_login_ids
msgid "Voxel logins"
msgstr "Logins de Voxel"
@@ -392,32 +434,19 @@ msgid "Voxel mixin"
msgstr "Voxel mixin"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_account_invoice_voxel_state
-#: model:ir.model.fields,field_description:edi_voxel.field_sale_order_voxel_state
-#: model:ir.model.fields,field_description:edi_voxel.field_stock_picking_voxel_state_5987
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_voxel_state
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_state
msgid "Voxel send state"
msgstr "Estado del envío a Voxel"
-#. module: edi_voxel
-#: model:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
-msgid "Web Sevice credentials"
-msgstr "Credenciales para el Servicio Web"
-
#. module: edi_voxel
#: selection:res.company,voxel_send_mode:0
msgid "With delay"
msgstr "Con retardo"
#. module: edi_voxel
-#: model:ir.model.fields,field_description:edi_voxel.field_account_invoice_voxel_xml_report
-#: model:ir.model.fields,field_description:edi_voxel.field_sale_order_voxel_xml_report
-#: model:ir.model.fields,field_description:edi_voxel.field_stock_picking_voxel_xml_report_5988
-#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin_voxel_xml_report
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_xml_report
msgid "XML Report"
msgstr "Reporte XML"
-#. module: edi_voxel
-#: model:ir.model,name:edi_voxel.model_res_config_settings
-msgid "res.config.settings"
-msgstr "res.config.settings"
+#~ msgid "Web Sevice credentials"
+#~ msgstr "Credenciales para el Servicio Web"
diff --git a/edi_voxel_oca/models/__init__.py b/edi_voxel_oca/models/__init__.py
index 671e006f6d..5cb4bc98cb 100644
--- a/edi_voxel_oca/models/__init__.py
+++ b/edi_voxel_oca/models/__init__.py
@@ -3,7 +3,7 @@
from . import res_company
from . import res_config_settings
from . import voxel_mixin
-from . import product_uom
+from . import uom_uom
from . import account
from . import queue_job
from . import res_partner
diff --git a/edi_voxel_oca/models/product_uom.py b/edi_voxel_oca/models/uom_uom.py
similarity index 91%
rename from edi_voxel_oca/models/product_uom.py
rename to edi_voxel_oca/models/uom_uom.py
index 2fb4490a20..798dac28fd 100644
--- a/edi_voxel_oca/models/product_uom.py
+++ b/edi_voxel_oca/models/uom_uom.py
@@ -4,8 +4,8 @@
from odoo import fields, models
-class ProductUoM(models.Model):
- _inherit = 'product.uom'
+class UoM(models.Model):
+ _inherit = 'uom.uom'
voxel_code = fields.Selection(
selection=[
diff --git a/edi_voxel_oca/static/description/index.html b/edi_voxel_oca/static/description/index.html
index bc24c02ad7..b995e0eec5 100644
--- a/edi_voxel_oca/static/description/index.html
+++ b/edi_voxel_oca/static/description/index.html
@@ -367,7 +367,7 @@
Voxel
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This is a base module that allows you to send and receive documents
such as Invoices, Sales Orders, Delivery Orders in XML format using
the baVel electronic platform belonging to Voxel Group.
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 smashing it by providing a detailed and welcomed
-feedback.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/edi project on GitHub.
+
This module is part of the OCA/edi project on GitHub.
Choose the send mode for documents to Voxel
@@ -41,7 +41,7 @@
-
+ Web Sevice credentials
Set credentials for connection to Voxel using Web Service
From e20178e6aff1189dfa389a048ba52896786935b5 Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Mon, 24 Feb 2020 19:42:12 +0100
Subject: [PATCH 07/51] [FIX+IMP] edi_voxel: 3 things:
[IMP] edi_voxel: Several things:
* Move customer product SKU to main module for being used for all modules
* Improve customerinfo search code
[FIX] edi_voxel: Remove ETA
It should be False, not 0
[IMP] edi_voxel: Remove "ES" from VAT if exists
---
edi_voxel_oca/__manifest__.py | 1 +
edi_voxel_oca/models/queue_job.py | 2 +-
edi_voxel_oca/models/res_partner.py | 7 +++++++
edi_voxel_oca/models/voxel_mixin.py | 11 +++++++++++
4 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/edi_voxel_oca/__manifest__.py b/edi_voxel_oca/__manifest__.py
index d2a21e1ea8..011ad8d09c 100644
--- a/edi_voxel_oca/__manifest__.py
+++ b/edi_voxel_oca/__manifest__.py
@@ -13,6 +13,7 @@
"report_xml",
"base_iso3166",
"queue_job",
+ "product_supplierinfo_for_customer",
],
"data": [
"security/voxel_security.xml",
diff --git a/edi_voxel_oca/models/queue_job.py b/edi_voxel_oca/models/queue_job.py
index 83d38a5d40..6b5c23d234 100644
--- a/edi_voxel_oca/models/queue_job.py
+++ b/edi_voxel_oca/models/queue_job.py
@@ -10,7 +10,7 @@ class QueueJob(models.Model):
@api.multi
def voxel_do_now(self):
- self.sudo().write({'eta': 0})
+ self.sudo().write({'eta': False})
@api.multi
def voxel_cancel_now(self):
diff --git a/edi_voxel_oca/models/res_partner.py b/edi_voxel_oca/models/res_partner.py
index 495b778782..51468257b5 100644
--- a/edi_voxel_oca/models/res_partner.py
+++ b/edi_voxel_oca/models/res_partner.py
@@ -11,3 +11,10 @@ class ResPartner(models.Model):
def _commercial_fields(self):
return super(ResPartner, self)._commercial_fields() + ['voxel_enabled']
+
+ def _get_voxel_vat(self):
+ """Rip initial ES prefix if exists."""
+ self.ensure_one()
+ if self.vat.startswith("ES"):
+ return self.vat[2:]
+ return self.vat
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index 062061b899..3d80bfb36f 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -187,3 +187,14 @@ def get_voxel_login(self, company=None):
""" This method must be overwritten by the model that inherit from
voxel.mixin"""
return self.env['voxel.login']
+
+ def _get_customer_product_sku(self, product, partner):
+ customerinfo = self.env["product.customerinfo"].search([
+ ("name", "=", partner.id),
+ "|",
+ ("product_id", "=", product.id),
+ "&",
+ ("product_tmpl_id", "=", product.product_tmpl_id.id),
+ ("product_id", "=", False),
+ ], limit=1, order="product_id, sequence")
+ return customerinfo.product_code
From 084e7ca39a128778a14f1adf50de713162c271a1 Mon Sep 17 00:00:00 2001
From: Jairo Llopis
Date: Fri, 29 May 2020 10:03:12 +0100
Subject: [PATCH 08/51] [IMP] 1st pre-commit execution
---
edi_voxel_oca/data/data_voxel_uom.xml | 2 +-
edi_voxel_oca/i18n/edi_voxel.pot | 1 -
edi_voxel_oca/models/account.py | 75 +++++++----
edi_voxel_oca/models/queue_job.py | 6 +-
edi_voxel_oca/models/res_company.py | 26 ++--
edi_voxel_oca/models/res_config_settings.py | 11 +-
edi_voxel_oca/models/res_partner.py | 8 +-
edi_voxel_oca/models/uom_uom.py | 26 ++--
edi_voxel_oca/models/voxel_login.py | 4 +-
edi_voxel_oca/models/voxel_mixin.py | 124 +++++++++---------
edi_voxel_oca/security/voxel_security.xml | 27 ++--
edi_voxel_oca/views/account_tax_views.xml | 6 +-
edi_voxel_oca/views/product_uom_views.xml | 6 +-
edi_voxel_oca/views/res_company_view.xml | 49 ++++---
.../views/res_config_settings_views.xml | 66 +++++++---
edi_voxel_oca/views/res_partner_views.xml | 9 +-
edi_voxel_oca/views/template_voxel_report.xml | 30 +++--
edi_voxel_oca/views/voxel_login_views.xml | 10 +-
18 files changed, 277 insertions(+), 209 deletions(-)
diff --git a/edi_voxel_oca/data/data_voxel_uom.xml b/edi_voxel_oca/data/data_voxel_uom.xml
index 9d7aff303a..b84de93b39 100644
--- a/edi_voxel_oca/data/data_voxel_uom.xml
+++ b/edi_voxel_oca/data/data_voxel_uom.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/edi_voxel_oca/i18n/edi_voxel.pot b/edi_voxel_oca/i18n/edi_voxel.pot
index d0eda31d8e..d72dc76e9d 100644
--- a/edi_voxel_oca/i18n/edi_voxel.pot
+++ b/edi_voxel_oca/i18n/edi_voxel.pot
@@ -406,4 +406,3 @@ msgstr ""
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_xml_report
msgid "XML Report"
msgstr ""
-
diff --git a/edi_voxel_oca/models/account.py b/edi_voxel_oca/models/account.py
index dc4bce1c91..f31ecda5d2 100644
--- a/edi_voxel_oca/models/account.py
+++ b/edi_voxel_oca/models/account.py
@@ -5,36 +5,55 @@
class AccountTax(models.Model):
- _inherit = 'account.tax'
+ _inherit = "account.tax"
voxel_tax_code = fields.Selection(
selection=[
- ('IVA', '(IVA) IVA'),
- ('IGIC', '(IGIC) IGIC'),
- ('IRPF', '(IRPF) IRPF'),
- ('RE', '(RE) Recargo de equivalencia'),
- ('ITPAJD', '(ITPAJD) Impuesto sobre transmisiones patrimoniales y '
- 'actos jurídicos documentados'),
- ('IE', '(IE) Impuestos especiales'),
- ('RA', '(RA) Renta aduanas'),
- ('IGTECM', '(IGTECM) Impuesto general sobre el tráfico de '
- 'empresas que se aplica en Ceuta y Melilla'),
- ('IECDPCAC', '(IECDPCAC) Impuesto especial sobre los combustibles '
- 'derivados del petróleo en la comunidad Autónoma '
- 'Canaria'),
- ('IIIMAB', '(IIIMAB) Impuesto sobre las instalaciones que inciden '
- 'sobre le medio ambiente en las Baleares'),
- ('ICIO', '(ICIO) Impuesto sobre las construcciones, instalaciones '
- 'y obras'),
- ('IMVDN', '(IMVDN) Impuesto municipal sobre las viviendas '
- 'desocupadas en Navarra'),
- ('IMSN', '(IMSN) Impuesto municipal sobre solares en Navarra'),
- ('IMGSN', '(IMGSN) Impuesto municipal sobre gastos '
- 'suntuarios en Navarra'),
- ('IMPN', '(IMPN) Impuesto municipal sobre publicidad en Navarra'),
- ('IBA', '(IBA) Impuesto sobre bebidas alcohólicas'),
- ('IHC', '(IHC) Impuesto sobre harinas cárnicas'),
- ('EXENTO', '(EXENTO) Exento'),
- ('OTRO', '(OTRO) Otro'),
+ ("IVA", "(IVA) IVA"),
+ ("IGIC", "(IGIC) IGIC"),
+ ("IRPF", "(IRPF) IRPF"),
+ ("RE", "(RE) Recargo de equivalencia"),
+ (
+ "ITPAJD",
+ "(ITPAJD) Impuesto sobre transmisiones patrimoniales y "
+ "actos jurídicos documentados",
+ ),
+ ("IE", "(IE) Impuestos especiales"),
+ ("RA", "(RA) Renta aduanas"),
+ (
+ "IGTECM",
+ "(IGTECM) Impuesto general sobre el tráfico de "
+ "empresas que se aplica en Ceuta y Melilla",
+ ),
+ (
+ "IECDPCAC",
+ "(IECDPCAC) Impuesto especial sobre los combustibles "
+ "derivados del petróleo en la comunidad Autónoma "
+ "Canaria",
+ ),
+ (
+ "IIIMAB",
+ "(IIIMAB) Impuesto sobre las instalaciones que inciden "
+ "sobre le medio ambiente en las Baleares",
+ ),
+ (
+ "ICIO",
+ "(ICIO) Impuesto sobre las construcciones, instalaciones " "y obras",
+ ),
+ (
+ "IMVDN",
+ "(IMVDN) Impuesto municipal sobre las viviendas "
+ "desocupadas en Navarra",
+ ),
+ ("IMSN", "(IMSN) Impuesto municipal sobre solares en Navarra"),
+ (
+ "IMGSN",
+ "(IMGSN) Impuesto municipal sobre gastos " "suntuarios en Navarra",
+ ),
+ ("IMPN", "(IMPN) Impuesto municipal sobre publicidad en Navarra"),
+ ("IBA", "(IBA) Impuesto sobre bebidas alcohólicas"),
+ ("IHC", "(IHC) Impuesto sobre harinas cárnicas"),
+ ("EXENTO", "(EXENTO) Exento"),
+ ("OTRO", "(OTRO) Otro"),
],
)
diff --git a/edi_voxel_oca/models/queue_job.py b/edi_voxel_oca/models/queue_job.py
index 6b5c23d234..9202e365ed 100644
--- a/edi_voxel_oca/models/queue_job.py
+++ b/edi_voxel_oca/models/queue_job.py
@@ -6,16 +6,16 @@
class QueueJob(models.Model):
- _inherit = 'queue.job'
+ _inherit = "queue.job"
@api.multi
def voxel_do_now(self):
- self.sudo().write({'eta': False})
+ self.sudo().write({"eta": False})
@api.multi
def voxel_cancel_now(self):
self.sudo().filtered(
- lambda x: x.state in ['pending', 'enqueued', 'failed']
+ lambda x: x.state in ["pending", "enqueued", "failed"]
).unlink()
@api.multi
diff --git a/edi_voxel_oca/models/res_company.py b/edi_voxel_oca/models/res_company.py
index f85b23e7d3..e19e72a8da 100644
--- a/edi_voxel_oca/models/res_company.py
+++ b/edi_voxel_oca/models/res_company.py
@@ -2,35 +2,35 @@
# 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 Company(models.Model):
_inherit = "res.company"
- voxel_enabled = fields.Boolean(string='Enable Voxel')
+ voxel_enabled = fields.Boolean(string="Enable Voxel")
voxel_send_mode = fields.Selection(
string="Send mode",
selection=[
- ('auto', 'On validate'),
- ('fixed', 'At fixed time'),
- ('delayed', 'With delay'),
- ], default='auto',
+ ("auto", "On validate"),
+ ("fixed", "At fixed time"),
+ ("delayed", "With delay"),
+ ],
+ default="auto",
)
voxel_sent_time = fields.Float(string="Sent time")
voxel_delay_time = fields.Float(string="Delay time")
voxel_login_ids = fields.One2many(
- comodel_name="voxel.login",
- inverse_name="company_id",
- string="Voxel logins",
+ comodel_name="voxel.login", inverse_name="company_id", string="Voxel logins",
)
def _get_voxel_report_eta(self):
- if self.voxel_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'
+ if self.voxel_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.voxel_sent_time * 60, 60)
hour = int(hour - hour_diff)
@@ -40,7 +40,7 @@ def _get_voxel_report_eta(self):
now += timedelta(days=1)
now = now.replace(hour=hour, minute=minute)
return now
- elif self.voxel_send_mode == 'delayed':
+ elif self.voxel_send_mode == "delayed":
seconds = self.voxel_delay_time * 3600
return datetime.now() + timedelta(seconds=seconds)
else:
diff --git a/edi_voxel_oca/models/res_config_settings.py b/edi_voxel_oca/models/res_config_settings.py
index 394737c204..e150e4c74f 100644
--- a/edi_voxel_oca/models/res_config_settings.py
+++ b/edi_voxel_oca/models/res_config_settings.py
@@ -5,11 +5,12 @@
class ResConfigSettings(models.TransientModel):
- _inherit = 'res.config.settings'
+ _inherit = "res.config.settings"
voxel_send_mode = fields.Selection(
- related='company_id.voxel_send_mode', readonly=False)
- voxel_sent_time = fields.Float(
- related='company_id.voxel_sent_time', readonly=False)
+ related="company_id.voxel_send_mode", readonly=False
+ )
+ voxel_sent_time = fields.Float(related="company_id.voxel_sent_time", readonly=False)
voxel_delay_time = fields.Float(
- related='company_id.voxel_delay_time', readonly=False)
+ related="company_id.voxel_delay_time", readonly=False
+ )
diff --git a/edi_voxel_oca/models/res_partner.py b/edi_voxel_oca/models/res_partner.py
index 51468257b5..28b0752da7 100644
--- a/edi_voxel_oca/models/res_partner.py
+++ b/edi_voxel_oca/models/res_partner.py
@@ -1,16 +1,16 @@
# Copyright 2019 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from odoo import models, fields
+from odoo import fields, models
class ResPartner(models.Model):
- _inherit = 'res.partner'
+ _inherit = "res.partner"
- voxel_enabled = fields.Boolean(string='Enable Voxel')
+ voxel_enabled = fields.Boolean(string="Enable Voxel")
def _commercial_fields(self):
- return super(ResPartner, self)._commercial_fields() + ['voxel_enabled']
+ return super(ResPartner, self)._commercial_fields() + ["voxel_enabled"]
def _get_voxel_vat(self):
"""Rip initial ES prefix if exists."""
diff --git a/edi_voxel_oca/models/uom_uom.py b/edi_voxel_oca/models/uom_uom.py
index 798dac28fd..1c3e87e3ed 100644
--- a/edi_voxel_oca/models/uom_uom.py
+++ b/edi_voxel_oca/models/uom_uom.py
@@ -5,21 +5,21 @@
class UoM(models.Model):
- _inherit = 'uom.uom'
+ _inherit = "uom.uom"
voxel_code = fields.Selection(
selection=[
- ('Unidades', 'Unidades'),
- ('Kgs', 'Kgs'),
- ('Lts', 'Lts'),
- ('Lbs', 'Lbs'),
- ('Cajas', 'Cajas'),
- ('Bultos', 'Bultos'),
- ('Palets', 'Palets'),
- ('Horas', 'Horas'),
- ('Metros', 'Metros'),
- ('MetrosCuadrados', 'MetrosCuadrados'),
- ('Contenedores', 'Contenedores'),
- ('Otros', 'Otros'),
+ ("Unidades", "Unidades"),
+ ("Kgs", "Kgs"),
+ ("Lts", "Lts"),
+ ("Lbs", "Lbs"),
+ ("Cajas", "Cajas"),
+ ("Bultos", "Bultos"),
+ ("Palets", "Palets"),
+ ("Horas", "Horas"),
+ ("Metros", "Metros"),
+ ("MetrosCuadrados", "MetrosCuadrados"),
+ ("Contenedores", "Contenedores"),
+ ("Otros", "Otros"),
],
)
diff --git a/edi_voxel_oca/models/voxel_login.py b/edi_voxel_oca/models/voxel_login.py
index 046a4b4d36..6d7ee88183 100644
--- a/edi_voxel_oca/models/voxel_login.py
+++ b/edi_voxel_oca/models/voxel_login.py
@@ -1,11 +1,11 @@
# Copyright 2019 Tecnativa - Ernesto Tejeda
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from odoo import models, fields
+from odoo import fields, models
class VoxelLogin(models.Model):
- _name = 'voxel.login'
+ _name = "voxel.login"
_description = "Voxel login"
name = fields.Char(string="Name", required=True)
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index 3d80bfb36f..7b351fb294 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -2,9 +2,11 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
-import requests
from datetime import datetime
+
+import requests
from lxml import etree
+
from odoo import api, fields, models
from odoo.modules.registry import Registry
@@ -13,11 +15,12 @@
try:
from odoo.addons.queue_job.job import job
except ImportError:
- _logger.debug('Can not `import queue_job`.')
+ _logger.debug("Can not `import queue_job`.")
import functools
def empty_decorator_factory(*argv, **kwargs):
return functools.partial
+
job = empty_decorator_factory
@@ -27,61 +30,57 @@ class VoxelMixin(models.AbstractModel):
voxel_state = fields.Selection(
selection=[
- ('not_sent', 'Not sent'),
- ('sent', 'Sent'),
- ('sent_errors', 'Errors'),
- ('cancelled', 'Cancelled'),
+ ("not_sent", "Not sent"),
+ ("sent", "Sent"),
+ ("sent_errors", "Errors"),
+ ("cancelled", "Cancelled"),
],
- string="Voxel send state", default='not_sent', readonly=True,
+ string="Voxel send state",
+ default="not_sent",
+ readonly=True,
copy=False,
help="Indicates the state of the Voxel report send state",
)
- voxel_xml_report = fields.Text(
- string="XML Report",
- readonly=True)
+ voxel_xml_report = fields.Text(string="XML Report", readonly=True)
@api.multi
def _get_voxel_filename(self):
self.ensure_one()
document_type = self.get_document_type()
date_time_seq = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
- return "%s_%s.xml" % (document_type, date_time_seq)
+ return "{}_{}.xml".format(document_type, date_time_seq)
@api.multi
def enqueue_voxel_report(self, report_name):
eta = self.company_id._get_voxel_report_eta()
- queue_obj = self.env['queue.job'].sudo()
+ queue_obj = self.env["queue.job"].sudo()
for record in self.sudo():
# Look first if there's a failing job. If so, retry that one
- failing_job = record.voxel_job_ids.filtered(
- lambda x: x.state == 'failed'
- )[:1]
+ failing_job = record.voxel_job_ids.filtered(lambda x: x.state == "failed")[
+ :1
+ ]
if failing_job:
failing_job.voxel_requeue_sudo()
continue
# If not, create a new one
- new_delay = record.with_context(
- company_id=self.company_id.id
- ).with_delay(
- eta=eta
- )._get_and_send_voxel_report(report_name)
-
- job = queue_obj.search([
- ('uuid', '=', new_delay.uuid)
- ], limit=1)
+ new_delay = (
+ record.with_context(company_id=self.company_id.id)
+ .with_delay(eta=eta)
+ ._get_and_send_voxel_report(report_name)
+ )
+
+ job = queue_obj.search([("uuid", "=", new_delay.uuid)], limit=1)
record.voxel_job_ids |= job
- @job(default_channel='root.voxel_export')
+ @job(default_channel="root.voxel_export")
@api.multi
def _get_and_send_voxel_report(self, report_name):
self.ensure_one()
report = self.env.ref(report_name)
report_xml = report.render_qweb_xml(self.ids, {})[0]
# Remove blank spaces
- tree = etree.fromstring(report_xml,
- etree.XMLParser(remove_blank_text=True))
- clean_report_xml = etree.tostring(tree, xml_declaration=True,
- encoding='UTF-8')
+ tree = etree.fromstring(report_xml, etree.XMLParser(remove_blank_text=True))
+ clean_report_xml = etree.tostring(tree, xml_declaration=True, encoding="UTF-8")
self._send_voxel_report(clean_report_xml)
# Update last xml report
self.voxel_xml_report = report_xml
@@ -89,14 +88,15 @@ def _get_and_send_voxel_report(self, report_name):
def _send_voxel_report(self, file_data):
file_name = self._get_voxel_filename()
try:
- self._request_to_voxel(requests.put, voxel_filename=file_name,
- data=file_data)
- self.voxel_state = 'sent'
+ self._request_to_voxel(
+ requests.put, voxel_filename=file_name, data=file_data
+ )
+ self.voxel_state = "sent"
except Exception:
new_cr = Registry(self.env.cr.dbname).cursor()
env = api.Environment(new_cr, self.env.uid, self.env.context)
record = env[self._name].browse(self.id)
- record.voxel_state = 'sent_errors'
+ record.voxel_state = "sent_errors"
new_cr.commit()
new_cr.close()
raise
@@ -104,26 +104,26 @@ def _send_voxel_report(self, file_data):
@api.multi
def _cancel_voxel_jobs(self, jobs):
# set voxel state to cancelled
- self.write({'voxel_state': 'cancelled'})
+ self.write({"voxel_state": "cancelled"})
# Remove not started jobs
for queue in jobs:
- if queue.state == 'started':
+ if queue.state == "started":
return False
- elif queue.state in ('pending', 'enqueued', 'failed'):
+ elif queue.state in ("pending", "enqueued", "failed"):
queue.unlink()
return True
def enqueue_import_voxel_documents(self, company):
- queue_job_obj = self.env['queue.job']
+ queue_job_obj = self.env["queue.job"]
# list document names
voxel_filenames = self._list_voxel_document_filenames(company)
# iterate the list to import documents one by one
for voxel_filename in voxel_filenames:
# Look first if there's a job for the current filename.
# If not, create it
- file_job = queue_job_obj.search([
- ('channel', '=', 'root.voxel_import')
- ]).filtered(lambda r: r.args == [voxel_filename, company])[:1]
+ file_job = queue_job_obj.search(
+ [("channel", "=", "root.voxel_import")]
+ ).filtered(lambda r: r.args == [voxel_filename, company])[:1]
if not file_job:
self.with_context(
company_id=company.id
@@ -136,25 +136,21 @@ def _list_voxel_document_filenames(self, company):
_logger.exception("Error reading the inbox in Voxel")
return []
# if no error, return list of documents file names
- return response.content.decode('utf-8').split('\n')
+ return response.content.decode("utf-8").split("\n")
- @job(default_channel='root.voxel_import')
+ @job(default_channel="root.voxel_import")
def _import_voxel_document(self, voxel_filename, company):
try:
- response = self._request_to_voxel(requests.get, company,
- voxel_filename)
+ response = self._request_to_voxel(requests.get, company, voxel_filename)
except Exception:
raise Exception("Error importing document %s" % (voxel_filename))
# if no error, get xml content
- content = response.content.decode('utf-8')
+ content = response.content.decode("utf-8")
# call method that parse and create the document from the content
doc = self.create_document_from_xml(content, voxel_filename, company)
if doc:
# write file content in the created object
- doc.write({
- 'voxel_xml_report': content,
- 'voxel_filename': voxel_filename,
- })
+ doc.write({"voxel_xml_report": content, "voxel_filename": voxel_filename})
# Delete file from Voxel
# self._delete_voxel_document(voxel_filename, company)
@@ -164,15 +160,17 @@ def _delete_voxel_document(self, voxel_filename, company):
except Exception:
raise Exception("Error deleting document %s" % (voxel_filename))
- def _request_to_voxel(self, request_method, company=None,
- voxel_filename=None, data=None):
+ def _request_to_voxel(
+ self, request_method, company=None, voxel_filename=None, data=None
+ ):
login = self.get_voxel_login(company)
if not login:
raise Exception
response = request_method(
url="/".join(filter(None, [login.url, voxel_filename])),
auth=(login.user, login.password),
- data=data)
+ data=data,
+ )
_logger.debug("Voxel request response: %s", str(response))
if response.status_code != 200:
response.raise_for_status()
@@ -186,15 +184,19 @@ def create_document_from_xml(self, xml_content, voxel_filename, company):
def get_voxel_login(self, company=None):
""" This method must be overwritten by the model that inherit from
voxel.mixin"""
- return self.env['voxel.login']
+ return self.env["voxel.login"]
def _get_customer_product_sku(self, product, partner):
- customerinfo = self.env["product.customerinfo"].search([
- ("name", "=", partner.id),
- "|",
- ("product_id", "=", product.id),
- "&",
- ("product_tmpl_id", "=", product.product_tmpl_id.id),
- ("product_id", "=", False),
- ], limit=1, order="product_id, sequence")
+ customerinfo = self.env["product.customerinfo"].search(
+ [
+ ("name", "=", partner.id),
+ "|",
+ ("product_id", "=", product.id),
+ "&",
+ ("product_tmpl_id", "=", product.product_tmpl_id.id),
+ ("product_id", "=", False),
+ ],
+ limit=1,
+ order="product_id, sequence",
+ )
return customerinfo.product_code
diff --git a/edi_voxel_oca/security/voxel_security.xml b/edi_voxel_oca/security/voxel_security.xml
index 3a99771e78..6e20e2152d 100644
--- a/edi_voxel_oca/security/voxel_security.xml
+++ b/edi_voxel_oca/security/voxel_security.xml
@@ -1,29 +1,30 @@
-
+
Voxel manager
-
-
+
+
-
Queue job Voxel visibility
-
- ['|', ('channel', '=', 'root.voxel_export'), ('channel', '=', 'root.voxel_import')]
-
+
+ ['|', ('channel', '=', 'root.voxel_export'), ('channel', '=', 'root.voxel_import')]
+
-
Queue job manager
-
+ [(1, '=', 1)]
-
+
-
Voxel login multi-company
-
- ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+
+ ['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
diff --git a/edi_voxel_oca/views/account_tax_views.xml b/edi_voxel_oca/views/account_tax_views.xml
index 413efc7587..a7c2a33e98 100644
--- a/edi_voxel_oca/views/account_tax_views.xml
+++ b/edi_voxel_oca/views/account_tax_views.xml
@@ -1,14 +1,14 @@
-
+
account.tax.form.inherit.voxelaccount.tax
-
+
-
+
diff --git a/edi_voxel_oca/views/product_uom_views.xml b/edi_voxel_oca/views/product_uom_views.xml
index 4841c86ddc..a2de2187a5 100644
--- a/edi_voxel_oca/views/product_uom_views.xml
+++ b/edi_voxel_oca/views/product_uom_views.xml
@@ -1,14 +1,14 @@
-
+
uom.uom.form.inherituom.uom
-
+
-
+
diff --git a/edi_voxel_oca/views/res_company_view.xml b/edi_voxel_oca/views/res_company_view.xml
index 8e1ffe478a..2d002f0e51 100644
--- a/edi_voxel_oca/views/res_company_view.xml
+++ b/edi_voxel_oca/views/res_company_view.xml
@@ -1,40 +1,51 @@
-
+
-
res.company.voxel.formres.company
-
-
+
+
-
+
-
+
-
-
-
-
+
+
+
+
-
+
-
-
-
+
+
+
-
+
diff --git a/edi_voxel_oca/views/res_config_settings_views.xml b/edi_voxel_oca/views/res_config_settings_views.xml
index e737810f02..acbe424152 100644
--- a/edi_voxel_oca/views/res_config_settings_views.xml
+++ b/edi_voxel_oca/views/res_config_settings_views.xml
@@ -1,11 +1,11 @@
-
+
res.config.settings.view.form.voxelres.config.settings
-
+
Voxel
@@ -13,28 +13,50 @@
Send mode
-
+
Choose the send mode for documents to Voxel
-
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
@@ -42,11 +64,15 @@
Web Sevice credentials
-
+
Set credentials for connection to Voxel using Web Service
-
+
diff --git a/edi_voxel_oca/views/res_partner_views.xml b/edi_voxel_oca/views/res_partner_views.xml
index 78046256f2..7c4fe8ca9a 100644
--- a/edi_voxel_oca/views/res_partner_views.xml
+++ b/edi_voxel_oca/views/res_partner_views.xml
@@ -1,14 +1,17 @@
-
+
res.partner.voxel.enabledres.partner
-
+
-
+
diff --git a/edi_voxel_oca/views/template_voxel_report.xml b/edi_voxel_oca/views/template_voxel_report.xml
index 2312a84299..1cef4eda01 100644
--- a/edi_voxel_oca/views/template_voxel_report.xml
+++ b/edi_voxel_oca/views/template_voxel_report.xml
@@ -1,18 +1,20 @@
-
+
-
-
-
-
+
+
+
+
-
+
-
+
@@ -20,17 +22,21 @@
-
+
-
+
-
+
-
+
diff --git a/edi_voxel_oca/views/voxel_login_views.xml b/edi_voxel_oca/views/voxel_login_views.xml
index 491299b54c..dc9e7ceaac 100644
--- a/edi_voxel_oca/views/voxel_login_views.xml
+++ b/edi_voxel_oca/views/voxel_login_views.xml
@@ -1,4 +1,4 @@
-
+
@@ -10,12 +10,12 @@
-
-
+
+
-
-
+
+
From 20670b6f44db654fa8d063d2d6772b47a3ad5541 Mon Sep 17 00:00:00 2001
From: "Pedro M. Baeza"
Date: Tue, 23 Jun 2020 12:24:13 +0200
Subject: [PATCH 09/51] [IMP] edi_voxel: Look product customer code also in
commercial partner (squashed)
[FIX] edi_voxel: Trailing comma
[FIX] pre-commit
---
edi_voxel_oca/models/voxel_mixin.py | 28 +++++++++++++++++-----------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index 7b351fb294..e204797557 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -187,16 +187,22 @@ def get_voxel_login(self, company=None):
return self.env["voxel.login"]
def _get_customer_product_sku(self, product, partner):
+ """Look for an entry for specific contact (sending/invoicing contact),
+ and if not found, look for the commercial partner.
+ """
+ domain = [
+ "|",
+ ("product_id", "=", product.id),
+ "&",
+ ("product_tmpl_id", "=", product.product_tmpl_id.id),
+ ("product_id", "=", False),
+ ]
customerinfo = self.env["product.customerinfo"].search(
- [
- ("name", "=", partner.id),
- "|",
- ("product_id", "=", product.id),
- "&",
- ("product_tmpl_id", "=", product.product_tmpl_id.id),
- ("product_id", "=", False),
- ],
- limit=1,
- order="product_id, sequence",
+ [("name", "=", partner.id)] + domain, order="product_id, sequence",
)
- return customerinfo.product_code
+ if not customerinfo:
+ customerinfo = self.env["product.customerinfo"].search(
+ [("name", "=", partner.commercial_partner_id.id)] + domain,
+ order="product_id, sequence",
+ )
+ return customerinfo[:1].product_code
From 15bcdb8c175517a8fa85a0dfef5f29507b0a343e Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Thu, 2 Apr 2020 12:32:35 -0400
Subject: [PATCH 10/51] [IMP] edi_voxel: error detection
---
edi_voxel_oca/i18n/edi_voxel.pot | 38 ++++-
edi_voxel_oca/i18n/es.po | 67 ++++++--
edi_voxel_oca/models/res_partner.py | 2 +-
edi_voxel_oca/models/voxel_mixin.py | 232 ++++++++++++++++++++--------
4 files changed, 250 insertions(+), 89 deletions(-)
diff --git a/edi_voxel_oca/i18n/edi_voxel.pot b/edi_voxel_oca/i18n/edi_voxel.pot
index d72dc76e9d..98c74767a1 100644
--- a/edi_voxel_oca/i18n/edi_voxel.pot
+++ b/edi_voxel_oca/i18n/edi_voxel.pot
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-12-11 14:55+0000\n"
-"PO-Revision-Date: 2019-12-11 14:55+0000\n"
+"POT-Creation-Date: 2020-04-14 19:31+0000\n"
+"PO-Revision-Date: 2020-04-14 19:31+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@@ -201,11 +201,6 @@ msgstr ""
msgid "Enable Voxel"
msgstr ""
-#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
-msgid "Errors"
-msgstr ""
-
#. module: edi_voxel
#: selection:uom.uom,voxel_code:0
msgid "Horas"
@@ -304,6 +299,12 @@ msgstr ""
msgid "Password"
msgstr ""
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__processing_error
+#: selection:voxel.mixin,voxel_state:0
+msgid "Processing error"
+msgstr ""
+
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_uom_uom
msgid "Product Unit of Measure"
@@ -322,7 +323,17 @@ msgstr ""
#. module: edi_voxel
#: selection:voxel.mixin,voxel_state:0
-msgid "Sent"
+msgid "Sending error"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+msgid "Sent and accepted"
+msgstr ""
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+msgid "Sent not verified"
msgstr ""
#. module: edi_voxel
@@ -341,6 +352,12 @@ msgstr ""
msgid "Tax"
msgstr ""
+#. module: edi_voxel
+#: code:addons/edi_voxel/models/voxel_mixin.py:275
+#, python-format
+msgid "This operation cannot be performed because there are jobs running therefore cannot be unlinked."
+msgstr ""
+
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__url
msgid "URL"
@@ -372,6 +389,11 @@ msgstr ""
msgid "Voxel Tax Code"
msgstr ""
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_filename
+msgid "Voxel filename"
+msgstr ""
+
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_voxel_login
msgid "Voxel login"
diff --git a/edi_voxel_oca/i18n/es.po b/edi_voxel_oca/i18n/es.po
index 9b4d7b8067..e7c6e37577 100644
--- a/edi_voxel_oca/i18n/es.po
+++ b/edi_voxel_oca/i18n/es.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-12-11 14:55+0000\n"
-"PO-Revision-Date: 2019-12-11 09:59-0500\n"
+"POT-Creation-Date: 2020-04-14 19:31+0000\n"
+"PO-Revision-Date: 2020-04-14 15:35-0400\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"Language: es\n"
@@ -140,8 +140,10 @@ msgid ""
"\"Values set here are company-specific.\" groups=\"base.group_multi_company"
"\"/>"
msgstr ""
-""
+"Modo de envío\n"
+" "
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
@@ -239,11 +241,6 @@ msgstr "Nombre mostrado"
msgid "Enable Voxel"
msgstr "Habilitar voxel"
-#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
-msgid "Errors"
-msgstr "Errores"
-
#. module: edi_voxel
#: selection:uom.uom,voxel_code:0
msgid "Horas"
@@ -291,7 +288,7 @@ msgstr "Lbs"
#, fuzzy
#| msgid "Voxel Logins"
msgid "Logins"
-msgstr "Voxel logins"
+msgstr "Logins"
#. module: edi_voxel
#: selection:uom.uom,voxel_code:0
@@ -344,6 +341,12 @@ msgstr "Palets"
msgid "Password"
msgstr "Contraseña"
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__processing_error
+#: selection:voxel.mixin,voxel_state:0
+msgid "Processing error"
+msgstr "Error de procesamiento en Voxel"
+
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_uom_uom
msgid "Product Unit of Measure"
@@ -362,8 +365,20 @@ msgstr "Modo de envío"
#. module: edi_voxel
#: selection:voxel.mixin,voxel_state:0
-msgid "Sent"
-msgstr "Enviado"
+msgid "Sending error"
+msgstr "Error de envío"
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+msgid "Sent and accepted"
+msgstr "Enviado y aceptado"
+
+#. module: edi_voxel
+#: selection:voxel.mixin,voxel_state:0
+#, fuzzy
+#| msgid "Sent time"
+msgid "Sent not verified"
+msgstr "Enviado sin verificar"
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_res_company__voxel_sent_time
@@ -382,6 +397,15 @@ msgstr ""
msgid "Tax"
msgstr "Impuesto"
+#. module: edi_voxel
+#: code:addons/edi_voxel/models/voxel_mixin.py:275
+#, python-format
+msgid ""
+"This operation cannot be performed because there are jobs running therefore "
+"cannot be unlinked."
+msgstr "Esta operación no puede ser realizada porque hay trabajos "
+"ejecutandose y no pueden ser eliminados"
+
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__url
msgid "URL"
@@ -413,6 +437,13 @@ msgstr "Código Voxel"
msgid "Voxel Tax Code"
msgstr "Código Voxel"
+#. module: edi_voxel
+#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_filename
+#, fuzzy
+#| msgid "Voxel manager"
+msgid "Voxel filename"
+msgstr "Nombre de archivo Voxel"
+
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_voxel_login
msgid "Voxel login"
@@ -448,5 +479,17 @@ msgstr "Con retardo"
msgid "XML Report"
msgstr "Reporte XML"
+#~ msgid "Accepted"
+#~ msgstr "Aceptado"
+
+#~ msgid "In process"
+#~ msgstr "En proceso"
+
+#~ msgid "Errors"
+#~ msgstr "Errores"
+
+#~ msgid "Sent"
+#~ msgstr "Enviado"
+
#~ msgid "Web Sevice credentials"
#~ msgstr "Credenciales para el Servicio Web"
diff --git a/edi_voxel_oca/models/res_partner.py b/edi_voxel_oca/models/res_partner.py
index 28b0752da7..8b6ab49217 100644
--- a/edi_voxel_oca/models/res_partner.py
+++ b/edi_voxel_oca/models/res_partner.py
@@ -15,6 +15,6 @@ def _commercial_fields(self):
def _get_voxel_vat(self):
"""Rip initial ES prefix if exists."""
self.ensure_one()
- if self.vat.startswith("ES"):
+ if self.vat and self.vat.startswith("ES"):
return self.vat[2:]
return self.vat
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index e204797557..2865f4ff44 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -3,11 +3,12 @@
import logging
from datetime import datetime
+from urllib.parse import urljoin
import requests
from lxml import etree
-from odoo import api, fields, models
+from odoo import _, api, exceptions, fields, models
from odoo.modules.registry import Registry
_logger = logging.getLogger(__name__)
@@ -31,8 +32,10 @@ class VoxelMixin(models.AbstractModel):
voxel_state = fields.Selection(
selection=[
("not_sent", "Not sent"),
- ("sent", "Sent"),
- ("sent_errors", "Errors"),
+ ("sent", "Sent not verified"),
+ ("sent_errors", "Sending error"),
+ ("accepted", "Sent and accepted"),
+ ("processing_error", "Processing error"),
("cancelled", "Cancelled"),
],
string="Voxel send state",
@@ -42,14 +45,11 @@ class VoxelMixin(models.AbstractModel):
help="Indicates the state of the Voxel report send state",
)
voxel_xml_report = fields.Text(string="XML Report", readonly=True)
+ voxel_filename = fields.Char(string="Voxel filename", readonly=True)
+ processing_error = fields.Text(string="Processing error", readonly=True)
- @api.multi
- def _get_voxel_filename(self):
- self.ensure_one()
- document_type = self.get_document_type()
- date_time_seq = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
- return "{}_{}.xml".format(document_type, date_time_seq)
-
+ # Export methods
+ # --------------
@api.multi
def enqueue_voxel_report(self, report_name):
eta = self.company_id._get_voxel_report_eta()
@@ -73,7 +73,6 @@ def enqueue_voxel_report(self, report_name):
record.voxel_job_ids |= job
@job(default_channel="root.voxel_export")
- @api.multi
def _get_and_send_voxel_report(self, report_name):
self.ensure_one()
report = self.env.ref(report_name)
@@ -81,42 +80,84 @@ def _get_and_send_voxel_report(self, report_name):
# Remove blank spaces
tree = etree.fromstring(report_xml, etree.XMLParser(remove_blank_text=True))
clean_report_xml = etree.tostring(tree, xml_declaration=True, encoding="UTF-8")
- self._send_voxel_report(clean_report_xml)
- # Update last xml report
- self.voxel_xml_report = report_xml
-
- def _send_voxel_report(self, file_data):
file_name = self._get_voxel_filename()
- try:
- self._request_to_voxel(
- requests.put, voxel_filename=file_name, data=file_data
- )
- self.voxel_state = "sent"
- except Exception:
- new_cr = Registry(self.env.cr.dbname).cursor()
- env = api.Environment(new_cr, self.env.uid, self.env.context)
- record = env[self._name].browse(self.id)
- record.voxel_state = "sent_errors"
- new_cr.commit()
- new_cr.close()
- raise
+ self._send_voxel_report("Outbox", file_name, clean_report_xml)
+ self.write(
+ {
+ "voxel_state": "sent",
+ "voxel_filename": file_name,
+ "voxel_xml_report": report_xml,
+ }
+ )
- @api.multi
- def _cancel_voxel_jobs(self, jobs):
- # set voxel state to cancelled
- self.write({"voxel_state": "cancelled"})
- # Remove not started jobs
- for queue in jobs:
- if queue.state == "started":
- return False
- elif queue.state in ("pending", "enqueued", "failed"):
- queue.unlink()
- return True
+ # export error detection methods
+ # ------------------------------
+ def _cron_update_voxel_export_status(self):
+ for company in self.env["res.company"].search([]):
+ if company.voxel_enabled and self.get_voxel_login(company):
+ self._update_voxel_export_status(company)
+ def _update_voxel_export_status(self, company):
+ sent_docs = self.search([("voxel_state", "=", "sent")])
+ if not sent_docs:
+ return
+ queue_obj = self.env["queue.job"].sudo()
+ # Determine processed documents
+ filenames = self._list_voxel_document_filenames("Outbox", company)
+ processed = sent_docs.filtered(lambda r: r.voxel_filename not in filenames)
+ # Determine documents with errors
+ filenames = self._list_voxel_document_filenames("Error", company)
+ with_errors = processed.filtered(lambda r: r.voxel_filename in filenames)
+ doc_dict = {}
+ for doc in with_errors:
+ if doc.voxel_filename:
+ doc_dict[doc.voxel_filename] = doc
+ for filename in filenames:
+ if filename.endswith(".log"):
+ xml_file_name = filename[:-4] + ".xml"
+ if xml_file_name in doc_dict:
+ document = doc_dict[xml_file_name]
+ # Look first if there's a job for the current filename.
+ # If not, create it
+ file_job = queue_obj.search(
+ [("channel", "=", "root.voxel_status")]
+ ).filtered(lambda r: r.args == [filename, company])[:1]
+ if not file_job:
+ error_msg = (
+ document.with_context(company_id=company.id)
+ .with_delay()
+ ._update_error_status(company, filename)
+ )
+ # search queue job to add it to voxel job list
+ document.voxel_job_ids |= queue_obj.search(
+ [("uuid", "=", error_msg.uuid)], limit=1
+ )
+ # Update state of accepted documents
+ (processed - with_errors).write({"voxel_state": "accepted"})
+
+ @job(default_channel="root.voxel_status")
+ def _update_error_status(self, company, filename):
+ processing_error_log = self._read_voxel_document(
+ "Error", company, filename, "ISO-8859-1"
+ )
+ # Update state of documents with errors
+ self.write(
+ {
+ "processing_error": processing_error_log,
+ "voxel_state": "processing_error",
+ }
+ )
+ # Delete error files from Voxel
+ self._delete_voxel_document("Error", filename, company)
+ self._delete_voxel_document("Error", filename[:-4] + ".xml", company)
+ self._delete_voxel_document("Error", filename[:-4] + ".utlog", company)
+
+ # Import methods
+ # --------------
def enqueue_import_voxel_documents(self, company):
queue_job_obj = self.env["queue.job"]
# list document names
- voxel_filenames = self._list_voxel_document_filenames(company)
+ voxel_filenames = self._list_voxel_document_filenames("Inbox", company)
# iterate the list to import documents one by one
for voxel_filename in voxel_filenames:
# Look first if there's a job for the current filename.
@@ -129,45 +170,34 @@ def enqueue_import_voxel_documents(self, company):
company_id=company.id
).with_delay()._import_voxel_document(voxel_filename, company)
- def _list_voxel_document_filenames(self, company):
- try:
- response = self._request_to_voxel(requests.get, company)
- except Exception:
- _logger.exception("Error reading the inbox in Voxel")
- return []
- # if no error, return list of documents file names
- return response.content.decode("utf-8").split("\n")
-
@job(default_channel="root.voxel_import")
def _import_voxel_document(self, voxel_filename, company):
- try:
- response = self._request_to_voxel(requests.get, company, voxel_filename)
- except Exception:
- raise Exception("Error importing document %s" % (voxel_filename))
- # if no error, get xml content
- content = response.content.decode("utf-8")
+ content = self._read_voxel_document("Inbox", company, voxel_filename)
# call method that parse and create the document from the content
doc = self.create_document_from_xml(content, voxel_filename, company)
if doc:
# write file content in the created object
doc.write({"voxel_xml_report": content, "voxel_filename": voxel_filename})
# Delete file from Voxel
- # self._delete_voxel_document(voxel_filename, company)
+ self._delete_voxel_document("Inbox", voxel_filename, company)
- def _delete_voxel_document(self, voxel_filename, company):
- try:
- self._request_to_voxel(requests.delete, company, voxel_filename)
- except Exception:
- raise Exception("Error deleting document %s" % (voxel_filename))
+ def create_document_from_xml(self, xml_content, voxel_filename, company):
+ """ This method must be overwritten by the model that use
+ `enqueue_import_voxel_documents` method """
+ return False
+ # API request methods
+ # --------------------
def _request_to_voxel(
- self, request_method, company=None, voxel_filename=None, data=None
+ self, request_method, folder, company=None, voxel_filename=None, data=None
):
login = self.get_voxel_login(company)
if not login:
raise Exception
+ url = urljoin(login.url, folder)
+ url += url.endswith("/") and "" or "/"
response = request_method(
- url="/".join(filter(None, [login.url, voxel_filename])),
+ url=urljoin(url, voxel_filename),
auth=(login.user, login.password),
data=data,
)
@@ -176,10 +206,76 @@ def _request_to_voxel(
response.raise_for_status()
return response
- def create_document_from_xml(self, xml_content, voxel_filename, company):
- """ This method must be overwritten by the model that use
- `enqueue_import_voxel_documents` method """
- return False
+ def _send_voxel_report(self, folder, file_name, file_data):
+ try:
+ self._request_to_voxel(
+ requests.put, folder, voxel_filename=file_name, data=file_data
+ )
+ except Exception:
+ new_cr = Registry(self.env.cr.dbname).cursor()
+ env = api.Environment(new_cr, self.env.uid, self.env.context)
+ record = env[self._name].browse(self.id)
+ record.voxel_state = "sent_errors"
+ new_cr.commit()
+ new_cr.close()
+ raise
+
+ def _list_voxel_document_filenames(self, folder, company):
+ try:
+ response = self._request_to_voxel(requests.get, folder, company)
+ except Exception:
+ raise Exception("Error reading '{}' folder from Voxel".format(folder))
+ # if no error, return list of documents file names
+ content = response.content
+ return content and content.decode("utf-8").split("\n") or []
+
+ def _read_voxel_document(self, folder, company, filename, encoding="utf-8"):
+ try:
+ response = self._request_to_voxel(requests.get, folder, company, filename)
+ except Exception:
+ raise Exception(
+ "Error reading document {} from folder {}".format(filename, folder)
+ )
+ # Getting xml content with utf8 there are characters that can not
+ # be decoded, so 'ISO-8859-1' is used
+ return response.content.decode(encoding)
+
+ def _delete_voxel_document(self, folder, voxel_filename, company):
+ try:
+ self._request_to_voxel(requests.delete, folder, company, voxel_filename)
+ except Exception:
+ raise Exception(
+ "Error deleting document {} from folder {}".format(
+ voxel_filename, folder
+ )
+ )
+
+ # auxiliary methods
+ # -----------------
+ @api.multi
+ def _get_voxel_filename(self):
+ self.ensure_one()
+ document_type = self.get_document_type()
+ date_time_seq = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
+ return "{}_{}.xml".format(document_type, date_time_seq)
+
+ @api.multi
+ def _cancel_voxel_jobs(self):
+ # Remove not started jobs
+ not_started_jobs = self.env["queue.job"]
+ for queue in self.mapped("voxel_job_ids"):
+ if queue.state == "started":
+ raise exceptions.Warning(
+ _(
+ "This operation cannot be performed because there are "
+ "jobs running therefore cannot be unlinked."
+ )
+ )
+ else:
+ not_started_jobs |= queue
+ not_started_jobs.unlink()
+ # set voxel state to cancelled
+ self.write({"voxel_state": "cancelled"})
def get_voxel_login(self, company=None):
""" This method must be overwritten by the model that inherit from
From 23d3007ff9733d131b2d7ce4ee31423604f01062 Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Wed, 23 Sep 2020 13:20:31 -0400
Subject: [PATCH 11/51] [IMP] edi_voxel: black, isort, prettier
---
edi_voxel_oca/models/voxel_mixin.py | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index 2865f4ff44..fe794dbeaa 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -182,8 +182,8 @@ def _import_voxel_document(self, voxel_filename, company):
self._delete_voxel_document("Inbox", voxel_filename, company)
def create_document_from_xml(self, xml_content, voxel_filename, company):
- """ This method must be overwritten by the model that use
- `enqueue_import_voxel_documents` method """
+ """This method must be overwritten by the model that use
+ `enqueue_import_voxel_documents` method"""
return False
# API request methods
@@ -278,7 +278,7 @@ def _cancel_voxel_jobs(self):
self.write({"voxel_state": "cancelled"})
def get_voxel_login(self, company=None):
- """ This method must be overwritten by the model that inherit from
+ """This method must be overwritten by the model that inherit from
voxel.mixin"""
return self.env["voxel.login"]
From 287d787b9b91987f40b634453c27a561164073fe Mon Sep 17 00:00:00 2001
From: Ernesto Tejeda
Date: Wed, 23 Sep 2020 12:34:40 -0400
Subject: [PATCH 12/51] [MIG] edi_voxel: Migration to 13.0
---
edi_voxel_oca/README.rst | 10 +-
edi_voxel_oca/__manifest__.py | 3 +-
edi_voxel_oca/i18n/edi_voxel.pot | 118 ++++++-----
edi_voxel_oca/i18n/es.po | 207 ++++++++------------
edi_voxel_oca/models/queue_job.py | 5 +-
edi_voxel_oca/models/res_company.py | 3 +-
edi_voxel_oca/models/res_partner.py | 9 +-
edi_voxel_oca/models/voxel_login.py | 2 +-
edi_voxel_oca/models/voxel_mixin.py | 39 ++--
edi_voxel_oca/security/voxel_security.xml | 2 +-
edi_voxel_oca/static/description/index.html | 6 +-
edi_voxel_oca/views/account_tax_views.xml | 1 +
edi_voxel_oca/views/product_uom_views.xml | 1 +
edi_voxel_oca/views/res_partner_views.xml | 1 +
edi_voxel_oca/views/voxel_login_views.xml | 1 +
15 files changed, 186 insertions(+), 222 deletions(-)
diff --git a/edi_voxel_oca/README.rst b/edi_voxel_oca/README.rst
index db8b9a39d1..f73914cf8c 100644
--- a/edi_voxel_oca/README.rst
+++ b/edi_voxel_oca/README.rst
@@ -14,13 +14,13 @@ Voxel
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github
- :target: https://github.com/OCA/edi/tree/12.0/edi_voxel
+ :target: https://github.com/OCA/edi/tree/13.0/edi_voxel
:alt: OCA/edi
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/edi-12-0/edi-12-0-edi_voxel
+ :target: https://translation.odoo-community.org/projects/edi-13-0/edi-13-0-edi_voxel
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/226/12.0
+ :target: https://runbot.odoo-community.org/runbot/226/13.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -50,7 +50,7 @@ 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 smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -83,6 +83,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/edi `_ project on GitHub.
+This module is part of the `OCA/edi `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_voxel_oca/__manifest__.py b/edi_voxel_oca/__manifest__.py
index 011ad8d09c..e49e925e71 100644
--- a/edi_voxel_oca/__manifest__.py
+++ b/edi_voxel_oca/__manifest__.py
@@ -3,12 +3,13 @@
{
"name": "Voxel",
"summary": "Base module for connecting with Voxel",
- "version": "12.0.1.0.0",
+ "version": "13.0.1.0.0",
"category": "Hidden",
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/oca/edi/",
"license": "AGPL-3",
"depends": [
+ "account",
"product",
"report_xml",
"base_iso3166",
diff --git a/edi_voxel_oca/i18n/edi_voxel.pot b/edi_voxel_oca/i18n/edi_voxel.pot
index 98c74767a1..7d940ac80c 100644
--- a/edi_voxel_oca/i18n/edi_voxel.pot
+++ b/edi_voxel_oca/i18n/edi_voxel.pot
@@ -1,14 +1,14 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
-# * edi_voxel
+# * edi_voxel
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 12.0\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-14 19:31+0000\n"
-"PO-Revision-Date: 2020-04-14 19:31+0000\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2020-04-24 23:57+0000\n"
+"PO-Revision-Date: 2020-04-24 23:57+0000\n"
+"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -16,129 +16,139 @@ msgstr ""
"Plural-Forms: \n"
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__exento
msgid "(EXENTO) Exento"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iba
msgid "(IBA) Impuesto sobre bebidas alcohólicas"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__icio
msgid "(ICIO) Impuesto sobre las construcciones, instalaciones y obras"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__ie
msgid "(IE) Impuestos especiales"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
-msgid "(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo en la comunidad Autónoma Canaria"
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iecdpcac
+msgid ""
+"(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo "
+"en la comunidad Autónoma Canaria"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__igic
msgid "(IGIC) IGIC"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
-msgid "(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en Ceuta y Melilla"
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__igtecm
+msgid ""
+"(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en "
+"Ceuta y Melilla"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__ihc
msgid "(IHC) Impuesto sobre harinas cárnicas"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
-msgid "(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio ambiente en las Baleares"
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iiimab
+msgid ""
+"(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio "
+"ambiente en las Baleares"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__imgsn
msgid "(IMGSN) Impuesto municipal sobre gastos suntuarios en Navarra"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__impn
msgid "(IMPN) Impuesto municipal sobre publicidad en Navarra"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__imsn
msgid "(IMSN) Impuesto municipal sobre solares en Navarra"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__imvdn
msgid "(IMVDN) Impuesto municipal sobre las viviendas desocupadas en Navarra"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__irpf
msgid "(IRPF) IRPF"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
-msgid "(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos documentados"
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__itpajd
+msgid ""
+"(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos "
+"documentados"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iva
msgid "(IVA) IVA"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__otro
msgid "(OTRO) Otro"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__ra
msgid "(RA) Renta aduanas"
msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__re
msgid "(RE) Recargo de equivalencia"
msgstr ""
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
-msgid "Send mode\n"
+msgid ""
+"Send mode\n"
" "
msgstr ""
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
-msgid "Web Sevice credentials\n"
+msgid ""
+"Web Sevice credentials\n"
" "
msgstr ""
#. module: edi_voxel
-#: selection:res.company,voxel_send_mode:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__res_company__voxel_send_mode__fixed
msgid "At fixed time"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__bultos
msgid "Bultos"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__cajas
msgid "Cajas"
msgstr ""
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__cancelled
msgid "Cancelled"
msgstr ""
@@ -168,7 +178,7 @@ msgid "Contact"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__contenedores
msgid "Contenedores"
msgstr ""
@@ -202,7 +212,7 @@ msgid "Enable Voxel"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__horas
msgid "Horas"
msgstr ""
@@ -218,7 +228,7 @@ msgid "Indicates the state of the Voxel report send state"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__kgs
msgid "Kgs"
msgstr ""
@@ -239,7 +249,7 @@ msgid "Last Updated on"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__lbs
msgid "Lbs"
msgstr ""
@@ -249,17 +259,17 @@ msgid "Logins"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__lts
msgid "Lts"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__metros
msgid "Metros"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__metroscuadrados
msgid "MetrosCuadrados"
msgstr ""
@@ -274,22 +284,22 @@ msgid "Name"
msgstr ""
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__not_sent
msgid "Not sent"
msgstr ""
#. module: edi_voxel
-#: selection:res.company,voxel_send_mode:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__res_company__voxel_send_mode__auto
msgid "On validate"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__otros
msgid "Otros"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__palets
msgid "Palets"
msgstr ""
@@ -301,7 +311,7 @@ msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__processing_error
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__processing_error
msgid "Processing error"
msgstr ""
@@ -322,17 +332,17 @@ msgid "Send mode"
msgstr ""
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__sent_errors
msgid "Sending error"
msgstr ""
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__accepted
msgid "Sent and accepted"
msgstr ""
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__sent
msgid "Sent not verified"
msgstr ""
@@ -353,9 +363,11 @@ msgid "Tax"
msgstr ""
#. module: edi_voxel
-#: code:addons/edi_voxel/models/voxel_mixin.py:275
+#: code:addons/edi_voxel/models/voxel_mixin.py:0
#, python-format
-msgid "This operation cannot be performed because there are jobs running therefore cannot be unlinked."
+msgid ""
+"This operation cannot be performed because there are jobs running therefore "
+"cannot be unlinked."
msgstr ""
#. module: edi_voxel
@@ -364,7 +376,7 @@ msgid "URL"
msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__unidades
msgid "Unidades"
msgstr ""
@@ -420,7 +432,7 @@ msgid "Voxel send state"
msgstr ""
#. module: edi_voxel
-#: selection:res.company,voxel_send_mode:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__res_company__voxel_send_mode__delayed
msgid "With delay"
msgstr ""
diff --git a/edi_voxel_oca/i18n/es.po b/edi_voxel_oca/i18n/es.po
index e7c6e37577..c4c6d42d7c 100644
--- a/edi_voxel_oca/i18n/es.po
+++ b/edi_voxel_oca/i18n/es.po
@@ -4,11 +4,11 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Odoo Server 11.0\n"
+"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-14 19:31+0000\n"
-"PO-Revision-Date: 2020-04-14 15:35-0400\n"
-"Last-Translator: <>\n"
+"POT-Creation-Date: 2020-04-24 23:57+0000\n"
+"PO-Revision-Date: 2020-04-24 19:59-0400\n"
+"Last-Translator: \n"
"Language-Team: \n"
"Language: es\n"
"MIME-Version: 1.0\n"
@@ -18,139 +18,121 @@ msgstr ""
"X-Generator: Poedit 2.0.6\n"
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__exento
msgid "(EXENTO) Exento"
-msgstr "(EXENTO) Exento"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iba
msgid "(IBA) Impuesto sobre bebidas alcohólicas"
-msgstr "(IBA) Impuesto sobre bebidas alcohólicas"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__icio
msgid "(ICIO) Impuesto sobre las construcciones, instalaciones y obras"
-msgstr "(ICIO) Impuesto sobre las construcciones, instalaciones y obras"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__ie
msgid "(IE) Impuestos especiales"
-msgstr "(IE) Impuestos especiales"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iecdpcac
msgid ""
"(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo "
"en la comunidad Autónoma Canaria"
msgstr ""
-"(IECDPCAC) Impuesto especial sobre los combustibles derivados del petróleo "
-"en la comunidad Autónoma Canaria"
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__igic
msgid "(IGIC) IGIC"
-msgstr "(IGIC) IGIC"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__igtecm
msgid ""
"(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en "
"Ceuta y Melilla"
msgstr ""
-"(IGTECM) Impuesto general sobre el tráfico de empresas que se aplica en "
-"Ceuta y Melilla"
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__ihc
msgid "(IHC) Impuesto sobre harinas cárnicas"
-msgstr "(IHC) Impuesto sobre harinas cárnicas"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iiimab
msgid ""
"(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio "
"ambiente en las Baleares"
msgstr ""
-"(IIIMAB) Impuesto sobre las instalaciones que inciden sobre le medio "
-"ambiente en las Baleares"
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__imgsn
msgid "(IMGSN) Impuesto municipal sobre gastos suntuarios en Navarra"
-msgstr "(IMGSN) Impuesto municipal sobre gastos suntuarios en Navarra"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__impn
msgid "(IMPN) Impuesto municipal sobre publicidad en Navarra"
-msgstr "(IMPN) Impuesto municipal sobre publicidad en Navarra"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__imsn
msgid "(IMSN) Impuesto municipal sobre solares en Navarra"
-msgstr "(IMSN) Impuesto municipal sobre solares en Navarra"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__imvdn
msgid "(IMVDN) Impuesto municipal sobre las viviendas desocupadas en Navarra"
-msgstr "(IMVDN) Impuesto municipal sobre las viviendas desocupadas en Navarra"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__irpf
msgid "(IRPF) IRPF"
-msgstr "(IRPF) IRPF"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__itpajd
msgid ""
"(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos "
"documentados"
msgstr ""
-"(ITPAJD) Impuesto sobre transmisiones patrimoniales y actos jurídicos "
-"documentados"
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__iva
msgid "(IVA) IVA"
-msgstr "(IVA) IVA"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__otro
msgid "(OTRO) Otro"
-msgstr "(OTRO) Otro"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__ra
msgid "(RA) Renta aduanas"
-msgstr "(RA) Renta aduanas"
+msgstr ""
#. module: edi_voxel
-#: selection:account.tax,voxel_tax_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__account_tax__voxel_tax_code__re
msgid "(RE) Recargo de equivalencia"
-msgstr "(RE) Recargo de equivalencia"
+msgstr ""
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
-#, fuzzy
-#| msgid ""
-#| ""
msgid ""
"Send mode\n"
" "
msgstr ""
-"Modo de envío\n"
-" "
+""
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
-#, fuzzy
-#| msgid ""
-#| ""
msgid ""
"Web Sevice credentials\n"
" "
#. module: edi_voxel
-#: selection:res.company,voxel_send_mode:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__res_company__voxel_send_mode__fixed
msgid "At fixed time"
msgstr "A una hora fija"
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__bultos
msgid "Bultos"
-msgstr "Bultos"
+msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__cajas
msgid "Cajas"
-msgstr "Cajas"
+msgstr ""
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__cancelled
msgid "Cancelled"
msgstr "Cancelado"
@@ -192,10 +174,8 @@ msgstr "Compañías"
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_res_config_settings
-#, fuzzy
-#| msgid "res.config.settings"
msgid "Config Settings"
-msgstr "res.config.settings"
+msgstr "Opciones de Configuración"
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
@@ -208,9 +188,9 @@ msgid "Contact"
msgstr "Contacto"
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__contenedores
msgid "Contenedores"
-msgstr "Contenedores"
+msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__create_uid
@@ -242,9 +222,9 @@ msgid "Enable Voxel"
msgstr "Habilitar voxel"
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__horas
msgid "Horas"
-msgstr "Horas"
+msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__id
@@ -258,9 +238,9 @@ msgid "Indicates the state of the Voxel report send state"
msgstr "Indica el estado del envío del reporte a Voxel"
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__kgs
msgid "Kgs"
-msgstr "Kgs"
+msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login____last_update
@@ -279,31 +259,29 @@ msgid "Last Updated on"
msgstr "Última actualización en"
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__lbs
msgid "Lbs"
-msgstr "Lbs"
+msgstr ""
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
-#, fuzzy
-#| msgid "Voxel Logins"
msgid "Logins"
-msgstr "Logins"
+msgstr "Voxel logins"
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__lts
msgid "Lts"
-msgstr "Lts"
+msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__metros
msgid "Metros"
-msgstr "Metros"
+msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__metroscuadrados
msgid "MetrosCuadrados"
-msgstr "MetrosCuadrados"
+msgstr ""
#. module: edi_voxel
#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
@@ -316,24 +294,24 @@ msgid "Name"
msgstr "Nombre"
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__not_sent
msgid "Not sent"
msgstr "No enviado"
#. module: edi_voxel
-#: selection:res.company,voxel_send_mode:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__res_company__voxel_send_mode__auto
msgid "On validate"
msgstr "Al validar"
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__otros
msgid "Otros"
-msgstr "Otros"
+msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__palets
msgid "Palets"
-msgstr "Palets"
+msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__company_id
@@ -343,9 +321,9 @@ msgstr "Contraseña"
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__processing_error
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__processing_error
msgid "Processing error"
-msgstr "Error de procesamiento en Voxel"
+msgstr "Error de procesamiento"
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_uom_uom
@@ -364,19 +342,17 @@ msgid "Send mode"
msgstr "Modo de envío"
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__sent_errors
msgid "Sending error"
msgstr "Error de envío"
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__accepted
msgid "Sent and accepted"
msgstr "Enviado y aceptado"
#. module: edi_voxel
-#: selection:voxel.mixin,voxel_state:0
-#, fuzzy
-#| msgid "Sent time"
+#: model:ir.model.fields.selection,name:edi_voxel.selection__voxel_mixin__voxel_state__sent
msgid "Sent not verified"
msgstr "Enviado sin verificar"
@@ -398,23 +374,23 @@ msgid "Tax"
msgstr "Impuesto"
#. module: edi_voxel
-#: code:addons/edi_voxel/models/voxel_mixin.py:275
+#: code:addons/edi_voxel/models/voxel_mixin.py:0
#, python-format
msgid ""
"This operation cannot be performed because there are jobs running therefore "
"cannot be unlinked."
-msgstr "Esta operación no puede ser realizada porque hay trabajos "
-"ejecutandose y no pueden ser eliminados"
+msgstr "Esta operación no puede ser realizada porque hay trabajos ejecutándose "
+"y no pueden ser eliminados"
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__url
msgid "URL"
-msgstr "URL"
+msgstr ""
#. module: edi_voxel
-#: selection:uom.uom,voxel_code:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__uom_uom__voxel_code__unidades
msgid "Unidades"
-msgstr "Unidades"
+msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_login__user
@@ -425,7 +401,7 @@ msgstr "Usuario"
#: model_terms:ir.ui.view,arch_db:edi_voxel.res_config_settings_view_form
#: model_terms:ir.ui.view,arch_db:edi_voxel.view_company_form
msgid "Voxel"
-msgstr "Voxel"
+msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_uom_uom__voxel_code
@@ -439,10 +415,8 @@ msgstr "Código Voxel"
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_filename
-#, fuzzy
-#| msgid "Voxel manager"
msgid "Voxel filename"
-msgstr "Nombre de archivo Voxel"
+msgstr ""
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_voxel_login
@@ -462,7 +436,7 @@ msgstr "Administrador Voxel"
#. module: edi_voxel
#: model:ir.model,name:edi_voxel.model_voxel_mixin
msgid "Voxel mixin"
-msgstr "Voxel mixin"
+msgstr ""
#. module: edi_voxel
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_state
@@ -470,7 +444,7 @@ msgid "Voxel send state"
msgstr "Estado del envío a Voxel"
#. module: edi_voxel
-#: selection:res.company,voxel_send_mode:0
+#: model:ir.model.fields.selection,name:edi_voxel.selection__res_company__voxel_send_mode__delayed
msgid "With delay"
msgstr "Con retardo"
@@ -478,18 +452,3 @@ msgstr "Con retardo"
#: model:ir.model.fields,field_description:edi_voxel.field_voxel_mixin__voxel_xml_report
msgid "XML Report"
msgstr "Reporte XML"
-
-#~ msgid "Accepted"
-#~ msgstr "Aceptado"
-
-#~ msgid "In process"
-#~ msgstr "En proceso"
-
-#~ msgid "Errors"
-#~ msgstr "Errores"
-
-#~ msgid "Sent"
-#~ msgstr "Enviado"
-
-#~ msgid "Web Sevice credentials"
-#~ msgstr "Credenciales para el Servicio Web"
diff --git a/edi_voxel_oca/models/queue_job.py b/edi_voxel_oca/models/queue_job.py
index 9202e365ed..96dd267ba9 100644
--- a/edi_voxel_oca/models/queue_job.py
+++ b/edi_voxel_oca/models/queue_job.py
@@ -2,22 +2,19 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-from odoo import api, models
+from odoo import models
class QueueJob(models.Model):
_inherit = "queue.job"
- @api.multi
def voxel_do_now(self):
self.sudo().write({"eta": False})
- @api.multi
def voxel_cancel_now(self):
self.sudo().filtered(
lambda x: x.state in ["pending", "enqueued", "failed"]
).unlink()
- @api.multi
def voxel_requeue_sudo(self):
self.sudo().requeue()
diff --git a/edi_voxel_oca/models/res_company.py b/edi_voxel_oca/models/res_company.py
index e19e72a8da..158cc4f2ca 100644
--- a/edi_voxel_oca/models/res_company.py
+++ b/edi_voxel_oca/models/res_company.py
@@ -41,7 +41,6 @@ def _get_voxel_report_eta(self):
now = now.replace(hour=hour, minute=minute)
return now
elif self.voxel_send_mode == "delayed":
- seconds = self.voxel_delay_time * 3600
- return datetime.now() + timedelta(seconds=seconds)
+ return datetime.now() + timedelta(hours=self.voxel_delay_time)
else:
return None
diff --git a/edi_voxel_oca/models/res_partner.py b/edi_voxel_oca/models/res_partner.py
index 8b6ab49217..6f25e6a0a6 100644
--- a/edi_voxel_oca/models/res_partner.py
+++ b/edi_voxel_oca/models/res_partner.py
@@ -10,11 +10,12 @@ class ResPartner(models.Model):
voxel_enabled = fields.Boolean(string="Enable Voxel")
def _commercial_fields(self):
- return super(ResPartner, self)._commercial_fields() + ["voxel_enabled"]
+ return super()._commercial_fields() + ["voxel_enabled"]
def _get_voxel_vat(self):
"""Rip initial ES prefix if exists."""
self.ensure_one()
- if self.vat and self.vat.startswith("ES"):
- return self.vat[2:]
- return self.vat
+ vat = self.vat or ""
+ if vat.startswith("ES"):
+ return vat[2:]
+ return vat
diff --git a/edi_voxel_oca/models/voxel_login.py b/edi_voxel_oca/models/voxel_login.py
index 6d7ee88183..9d4e056b8b 100644
--- a/edi_voxel_oca/models/voxel_login.py
+++ b/edi_voxel_oca/models/voxel_login.py
@@ -12,4 +12,4 @@ class VoxelLogin(models.Model):
url = fields.Char(string="URL", required=True)
user = fields.Char(string="User", required=True)
password = fields.Char(string="Password", required=True)
- company_id = fields.Many2one(comodel_name="res.company", string="Password")
+ company_id = fields.Many2one(comodel_name="res.company", string="Company")
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index fe794dbeaa..6dc3b68b7b 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -42,7 +42,7 @@ class VoxelMixin(models.AbstractModel):
default="not_sent",
readonly=True,
copy=False,
- help="Indicates the state of the Voxel report send state",
+ help="Indicates the status of sending report to Voxel",
)
voxel_xml_report = fields.Text(string="XML Report", readonly=True)
voxel_filename = fields.Char(string="Voxel filename", readonly=True)
@@ -50,7 +50,6 @@ class VoxelMixin(models.AbstractModel):
# Export methods
# --------------
- @api.multi
def enqueue_voxel_report(self, report_name):
eta = self.company_id._get_voxel_report_eta()
queue_obj = self.env["queue.job"].sudo()
@@ -182,8 +181,8 @@ def _import_voxel_document(self, voxel_filename, company):
self._delete_voxel_document("Inbox", voxel_filename, company)
def create_document_from_xml(self, xml_content, voxel_filename, company):
- """This method must be overwritten by the model that use
- `enqueue_import_voxel_documents` method"""
+ """ This method must be overwritten by the model that use
+ `enqueue_import_voxel_documents` method """
return False
# API request methods
@@ -252,14 +251,12 @@ def _delete_voxel_document(self, folder, voxel_filename, company):
# auxiliary methods
# -----------------
- @api.multi
def _get_voxel_filename(self):
self.ensure_one()
document_type = self.get_document_type()
date_time_seq = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]
return "{}_{}.xml".format(document_type, date_time_seq)
- @api.multi
def _cancel_voxel_jobs(self):
# Remove not started jobs
not_started_jobs = self.env["queue.job"]
@@ -278,27 +275,21 @@ def _cancel_voxel_jobs(self):
self.write({"voxel_state": "cancelled"})
def get_voxel_login(self, company=None):
- """This method must be overwritten by the model that inherit from
+ """ This method must be overwritten by the model that inherit from
voxel.mixin"""
return self.env["voxel.login"]
def _get_customer_product_sku(self, product, partner):
- """Look for an entry for specific contact (sending/invoicing contact),
- and if not found, look for the commercial partner.
- """
- domain = [
- "|",
- ("product_id", "=", product.id),
- "&",
- ("product_tmpl_id", "=", product.product_tmpl_id.id),
- ("product_id", "=", False),
- ]
customerinfo = self.env["product.customerinfo"].search(
- [("name", "=", partner.id)] + domain, order="product_id, sequence",
+ [
+ ("name", "=", partner.id),
+ "|",
+ ("product_id", "=", product.id),
+ "&",
+ ("product_tmpl_id", "=", product.product_tmpl_id.id),
+ ("product_id", "=", False),
+ ],
+ limit=1,
+ order="product_id, sequence",
)
- if not customerinfo:
- customerinfo = self.env["product.customerinfo"].search(
- [("name", "=", partner.commercial_partner_id.id)] + domain,
- order="product_id, sequence",
- )
- return customerinfo[:1].product_code
+ return customerinfo.product_code
diff --git a/edi_voxel_oca/security/voxel_security.xml b/edi_voxel_oca/security/voxel_security.xml
index 6e20e2152d..7e998ee1d0 100644
--- a/edi_voxel_oca/security/voxel_security.xml
+++ b/edi_voxel_oca/security/voxel_security.xml
@@ -25,6 +25,6 @@
['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]
+ >['|',('company_id','=',False),('company_id','in',company_ids)]
diff --git a/edi_voxel_oca/static/description/index.html b/edi_voxel_oca/static/description/index.html
index b995e0eec5..d15cc1394c 100644
--- a/edi_voxel_oca/static/description/index.html
+++ b/edi_voxel_oca/static/description/index.html
@@ -367,7 +367,7 @@
Voxel
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This is a base module that allows you to send and receive documents
such as Invoices, Sales Orders, Delivery Orders in XML format using
the baVel electronic platform belonging to Voxel Group.
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 smashing it by providing a detailed and welcomed
-feedback.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/edi project on GitHub.
+
This module is part of the OCA/edi project on GitHub.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/edi project on GitHub.
+
This module is part of the OCA/edi project on GitHub.
From 0f6f8f6f2a1703e78692215c8ef80de1880e5959 Mon Sep 17 00:00:00 2001
From: sergio-teruel
Date: Tue, 1 Nov 2022 21:52:44 +0100
Subject: [PATCH 28/51] [MIG] agreement_rebate: Migration to v15.0
---
edi_voxel_oca/README.rst | 10 +++++-----
edi_voxel_oca/__manifest__.py | 2 +-
edi_voxel_oca/models/voxel_login.py | 6 +++---
edi_voxel_oca/models/voxel_mixin.py | 18 ++++++++++--------
edi_voxel_oca/static/description/index.html | 6 +++---
5 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/edi_voxel_oca/README.rst b/edi_voxel_oca/README.rst
index bdfd01e69a..8e4d6b615c 100644
--- a/edi_voxel_oca/README.rst
+++ b/edi_voxel_oca/README.rst
@@ -14,13 +14,13 @@ Voxel
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fedi-lightgray.png?logo=github
- :target: https://github.com/OCA/edi/tree/14.0/edi_voxel_oca
+ :target: https://github.com/OCA/edi/tree/15.0/edi_voxel_oca
:alt: OCA/edi
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/edi-14-0/edi-14-0-edi_voxel_oca
+ :target: https://translation.odoo-community.org/projects/edi-15-0/edi-15-0-edi_voxel_oca
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/226/14.0
+ :target: https://runbot.odoo-community.org/runbot/226/15.0
:alt: Try me on Runbot
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -50,7 +50,7 @@ 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 smashing it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -83,6 +83,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-This module is part of the `OCA/edi `_ project on GitHub.
+This module is part of the `OCA/edi `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/edi_voxel_oca/__manifest__.py b/edi_voxel_oca/__manifest__.py
index b570720bc9..12f255c384 100644
--- a/edi_voxel_oca/__manifest__.py
+++ b/edi_voxel_oca/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Voxel",
"summary": "Base module for connecting with Voxel",
- "version": "14.0.1.0.0",
+ "version": "15.0.1.0.0",
"category": "Hidden",
"author": "Tecnativa, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/edi",
diff --git a/edi_voxel_oca/models/voxel_login.py b/edi_voxel_oca/models/voxel_login.py
index 9d4e056b8b..4da60c8a2d 100644
--- a/edi_voxel_oca/models/voxel_login.py
+++ b/edi_voxel_oca/models/voxel_login.py
@@ -8,8 +8,8 @@ class VoxelLogin(models.Model):
_name = "voxel.login"
_description = "Voxel login"
- name = fields.Char(string="Name", required=True)
+ name = fields.Char(required=True)
url = fields.Char(string="URL", required=True)
- user = fields.Char(string="User", required=True)
- password = fields.Char(string="Password", required=True)
+ user = fields.Char(required=True)
+ password = fields.Char(required=True)
company_id = fields.Many2one(comodel_name="res.company", string="Company")
diff --git a/edi_voxel_oca/models/voxel_mixin.py b/edi_voxel_oca/models/voxel_mixin.py
index 053f6e4a14..25bfb37a8c 100644
--- a/edi_voxel_oca/models/voxel_mixin.py
+++ b/edi_voxel_oca/models/voxel_mixin.py
@@ -45,8 +45,8 @@ class VoxelMixin(models.AbstractModel):
help="Indicates the status of sending report to Voxel",
)
voxel_xml_report = fields.Text(string="XML Report", readonly=True)
- voxel_filename = fields.Char(string="Voxel filename", readonly=True)
- processing_error = fields.Text(string="Processing error", readonly=True)
+ voxel_filename = fields.Char(readonly=True)
+ processing_error = fields.Text(readonly=True)
# Export methods
# --------------
@@ -221,8 +221,10 @@ def _send_voxel_report(self, folder, file_name, file_data):
def _list_voxel_document_filenames(self, folder, company):
try:
response = self._request_to_voxel(requests.get, folder, company)
- except Exception:
- raise Exception("Error reading '{}' folder from Voxel".format(folder))
+ except Exception as exc:
+ raise Exception(
+ "Error reading '{}' folder from Voxel".format(folder)
+ ) from exc
# if no error, return list of documents file names
content = response.content
return content and content.decode("utf-8").split("\n") or []
@@ -230,10 +232,10 @@ def _list_voxel_document_filenames(self, folder, company):
def _read_voxel_document(self, folder, company, filename, encoding="utf-8"):
try:
response = self._request_to_voxel(requests.get, folder, company, filename)
- except Exception:
+ except Exception as exc:
raise Exception(
"Error reading document {} from folder {}".format(filename, folder)
- )
+ ) from exc
# Getting xml content with utf8 there are characters that can not
# be decoded, so 'ISO-8859-1' is used
return response.content.decode(encoding)
@@ -241,12 +243,12 @@ def _read_voxel_document(self, folder, company, filename, encoding="utf-8"):
def _delete_voxel_document(self, folder, voxel_filename, company):
try:
self._request_to_voxel(requests.delete, folder, company, voxel_filename)
- except Exception:
+ except Exception as exc:
raise Exception(
"Error deleting document {} from folder {}".format(
voxel_filename, folder
)
- )
+ ) from exc
# auxiliary methods
# -----------------
diff --git a/edi_voxel_oca/static/description/index.html b/edi_voxel_oca/static/description/index.html
index 51b5f44257..741515a60c 100644
--- a/edi_voxel_oca/static/description/index.html
+++ b/edi_voxel_oca/static/description/index.html
@@ -367,7 +367,7 @@
Voxel
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This is a base module that allows you to send and receive documents
such as Invoices, Sales Orders, Delivery Orders in XML format using
the baVel electronic platform belonging to Voxel Group.
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 smashing it by providing a detailed and welcomed
-feedback.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
-
This module is part of the OCA/edi project on GitHub.
+
This module is part of the OCA/edi project on GitHub.
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
This is a base module that allows you to send and receive documents
such as Invoices, Sales Orders, Delivery Orders in XML format using
the baVel electronic platform belonging to Voxel Group.
From f6142faac87d276194af5fbcc6ab932952b72eeb Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Sun, 3 Sep 2023 12:44:19 +0000
Subject: [PATCH 32/51] [UPD] README.rst
---
edi_voxel_oca/README.rst | 15 +++++----
edi_voxel_oca/static/description/index.html | 34 +++++++++++----------
2 files changed, 27 insertions(+), 22 deletions(-)
diff --git a/edi_voxel_oca/README.rst b/edi_voxel_oca/README.rst
index 8e32a7020e..2ea5e5da73 100644
--- a/edi_voxel_oca/README.rst
+++ b/edi_voxel_oca/README.rst
@@ -2,10 +2,13 @@
Voxel
=====
-.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:e630ee4dfa257b27f977ff0dbb9e843ff9e6e403cd6914ea293366dec54c1460
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png
:target: https://odoo-community.org/page/development-status
@@ -19,11 +22,11 @@ Voxel
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/edi-15-0/edi-15-0-edi_voxel_oca
:alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
- :target: https://runbot.odoo-community.org/runbot/226/15.0
- :alt: Try me on Runbot
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/edi&target_branch=15.0
+ :alt: Try me on Runboat
-|badge1| |badge2| |badge3| |badge4| |badge5|
+|badge1| |badge2| |badge3| |badge4| |badge5|
This is a base module that allows you to send and receive documents
such as Invoices, Sales Orders, Delivery Orders in XML format using
@@ -49,7 +52,7 @@ 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 smashing it by providing a detailed and welcomed
+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.
diff --git a/edi_voxel_oca/static/description/index.html b/edi_voxel_oca/static/description/index.html
index 6e6e2ca77a..9ddc373f76 100644
--- a/edi_voxel_oca/static/description/index.html
+++ b/edi_voxel_oca/static/description/index.html
@@ -1,20 +1,20 @@
-
+
-
+
Voxel