diff --git a/delivery_gls_asm/README.rst b/delivery_gls_asm/README.rst new file mode 100644 index 00000000000..e8dcf75a3b9 --- /dev/null +++ b/delivery_gls_asm/README.rst @@ -0,0 +1,207 @@ +================ +Delivery GLS-ASM +================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fl10n--spain-lightgray.png?logo=github + :target: https://github.com/OCA/l10n-spain/tree/15.0/delivery_gls_asm + :alt: OCA/l10n-spain +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/l10n-spain-15-0/l10n-spain-15-0-delivery_gls_asm + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/189/15.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Este módulo integra la API de GLS España (antigua API de ASM) con Odoo. No es +válido para integraciones de GLS en otros países, que podrían usar otras APIs. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Este módulo necesita la librería python `suds-py3` y depende igualmente de los +módulos de OCA/delivery-carrier `delivery_package_number` y `delivery_state`. + +La API de GLS/ASM no provee métodos de cálculo de precio, de modo que para poder +calcular los costes de envío sería recomendable instalar el módulo +`delivery_price_method`. + +Configuration +============= + +Para configurar el transportista: + +#. Vaya a *Inventario > Configuración > Entrega > Método de envío* y cree uno + nuevo. +#. Escoja *GLS ASM* Como proveedor. +#. Configure los datos de servicio que tiene contratados y el producto de + envío que desea utilizar. + +Si no tiene credenciales todavía, puede poner datos inventados y dejar el +método de envío en "Entorno de prueba". Se utilizará el usuario de pruebas de +la API GLS ASM. + +Si GLS cambiase en un futuro el usuario de prueba, puede cambiarlo en los +*Parámetros del sistema* en la clave `delivery_gls_asm.api_user_demo`. + +Usage +===== + +Estas son las distintas operaciones posibles con este módulo: + +Grabar servicios +~~~~~~~~~~~~~~~~ + + #. Al confirmar el albarán, el servicio se grabará en GLS. + #. Con la respuesta, se registrará en el chatter la referencia de envío y + las etiquetas correspondientes. + #. Para gestionar los bultos del envío, se puede utilizar el campo de número + de bultos que añade `delivery_package_number` (ver el README para mayor + información) o bien el flujo nativo de Odoo con paquetes de envío. El + módulo mandará a la API de GLS/ASM el número correspondiente y podremos + descargar las etiquetas en PDF con su correspondiente numeración. + +Pedir recogidas +~~~~~~~~~~~~~~~ + + #. Al confirmar el albarán con un servicio de recogida, + el envío NO se grabará en GLS. + #. Aparecerá un botón de "Enviar recogida" en la parte superior para solicitarlo + #. Con la respuesta, se registrará en el chatter la referencia de envío + #. Para gestionar los bultos del envío, se puede utilizar el campo de número + de bultos que añade `delivery_package_number` (ver el README para mayor + información) o bien el flujo nativo de Odoo con paquetes de envío. + +Cancelar servicios +~~~~~~~~~~~~~~~~~~ + + #. Al igual que en otros métodos de envío, en los albaranes de salida podemos + cancelar un servicio determinado mediante la acción correspondiente en la + pestaña de *Información Adicional*, sección *Información de entrega* una + vez el pedido esté confirmado y la expedición generada. + #. Podremos generar una nueva expedición una vez cancelado si fuese necesario. + +Obtener etiquetas +~~~~~~~~~~~~~~~~~~ + + #. Si por error hubiésemos eliminado el adjunto de las etiquetas que obtuvimos + en la grabación del servicio, podemos obtenerlas de nuevo pulsando en el + botón "Etiqueta GLS" que tenemos en la parte superior de la vista + formulario del albarán. + +Seguimiento de envíos +~~~~~~~~~~~~~~~~~~~~~ + + #. El módulo está integrado con `delivery_state` para poder recabar la + información de seguimiento de nuestros envíos directamente desde la API de + GLS-ASM. + #. Para ello, vaya al albarán con un envío GLS ya grabado y en la pestaña de + *Información adicional* verá el botón *Actualizar seguimiento* para pedir + a la API de GLS que actualice el estado de este envío en Odoo. + +Manifiesto de envíos +~~~~~~~~~~~~~~~~~~~~ + + #. Para obtener el manifiesto de expediciones que firmaría el repartidor, + puede ir al menú *Inventario > Informes > Manifiesto de Envíos GLS*. + #. También puede obtener el manifiesto desde un smart button en el formulario + del transportista. + #. En el asistente, seleccione el servicio GLS del cual quiere sacar el + manifiesto y la fecha desde la que desea listar los envíos. + #. Pulse en el botón "Manifiesto GLS" para obtener un listado en PDF de los + envíos del servicio seleccionado. + +Depuración de errores +~~~~~~~~~~~~~~~~~~~~~ + + #. Es importante tener en cuenta que solo funcionará con códigos postales de + España. + #. En cada servicio GLS-ASM dispone de una pestaña llamada "Técnico" en la + que puede consultar la última petición y respuesta a la API de GLS-ASM. + Esto le servirá como ayuda a la hora de depurar posibles errores de + comunicación. + #. También puede activar Odoo con `--log-level=debug` para registrar las + peticiones y las respuestas en el log. + +Known issues / Roadmap +====================== + +* La API no facilita métodos para cotizar el coste real de los envíos, por lo + que siempre se cotizan a 0. Si la cotización de envíos es necesaria, + puede instalarse el módulo OCA `delivery_price_method` o bien personalizar + el método de cotización para este tipo de transportista. + +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 `_: + + * David Vidal + * Víctor Martínez + +* `Studio73 `_: + + * Ethan Hildick + +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. + +.. |maintainer-chienandalu| image:: https://github.com/chienandalu.png?size=40px + :target: https://github.com/chienandalu + :alt: chienandalu +.. |maintainer-hildickethan-S73| image:: https://github.com/hildickethan-S73.png?size=40px + :target: https://github.com/hildickethan-S73 + :alt: hildickethan-S73 + +Current `maintainers `__: + +|maintainer-chienandalu| |maintainer-hildickethan-S73| + +This module is part of the `OCA/l10n-spain `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/delivery_gls_asm/__init__.py b/delivery_gls_asm/__init__.py new file mode 100644 index 00000000000..9b4296142f4 --- /dev/null +++ b/delivery_gls_asm/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizard diff --git a/delivery_gls_asm/__manifest__.py b/delivery_gls_asm/__manifest__.py new file mode 100644 index 00000000000..f9a9b03acfa --- /dev/null +++ b/delivery_gls_asm/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2020 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Delivery GLS-ASM", + "summary": "Delivery Carrier implementation for GLS with ASMRed API", + "version": "15.0.1.0.0", + "category": "Stock", + "website": "https://github.com/OCA/l10n-spain", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["delivery_package_number", "delivery_state"], + "external_dependencies": {"python": ["suds-py3"]}, + "data": [ + "data/delivery_asm_data.xml", + "security/ir.model.access.csv", + "views/delivery_asm_view.xml", + "views/gls_asm_manifest_template.xml", + "views/stock_picking_views.xml", + "wizard/gls_asm_manifest_wizard_views.xml", + ], + "maintainers": ["chienandalu", "hildickethan-S73"], +} diff --git a/delivery_gls_asm/api/gls_asm_api.wsdl b/delivery_gls_asm/api/gls_asm_api.wsdl new file mode 100644 index 00000000000..c1dfa803cbd --- /dev/null +++ b/delivery_gls_asm/api/gls_asm_api.wsdl @@ -0,0 +1,1482 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/delivery_gls_asm/data/delivery_asm_data.xml b/delivery_gls_asm/data/delivery_asm_data.xml new file mode 100644 index 00000000000..4ceb87f9bd0 --- /dev/null +++ b/delivery_gls_asm/data/delivery_asm_data.xml @@ -0,0 +1,8 @@ + + + + + delivery_gls_asm.api_user_demo + 6BAB7A53-3B6D-4D5A-9450-702D2FAC0B11 + + diff --git a/delivery_gls_asm/i18n/ca.po b/delivery_gls_asm/i18n/ca.po new file mode 100644 index 00000000000..d594d483c89 --- /dev/null +++ b/delivery_gls_asm/i18n/ca.po @@ -0,0 +1,989 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_gls_asm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-03-22 14:46+0000\n" +"Last-Translator: brendapaniagua \n" +"Language-Team: none\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__0 +msgid "10:00 Service" +msgstr "10:00 Servicio" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__2 +msgid "14:00 Service" +msgstr "14:00 Servicio" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__27 +msgid "14H SOBRES" +msgstr "14H SOBRES" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__28 +msgid "24H SOBRES" +msgstr "24H SOBRES" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__29 +msgid "72H SOBRES" +msgstr "72H SOBRES" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "
(Kg.)" +msgstr "
(Kg.)" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "
(Packages)" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "" +"\n" +" Carrier Signature / Stamp\n" +" " +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "TOTAL EXPEDITIONS: " +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Company:" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Date of printing" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "GLS MANIFEST" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Manifest Date:" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Printed by" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "TOTAL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__preconfirm +msgid "A preconfirmar" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__59 +msgid "ASM BUROFAX" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__60 +msgid "ASM GO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__parcelshop_confirm +msgid "ASM PARCELSHOP CONFIRMA RECEPCIÓN" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__30 +msgid "ASM0830" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__66 +msgid "ASMTRAVELLERS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__warehouse +msgid "Almacenado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__cancel +msgid "Anualada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__cancel +msgid "Anulada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__assigned +msgid "Asignada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__5 +msgid "BICI" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__3 +msgid "BusinessParcel" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__31 +msgid "CAN MUESTRAS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__6 +msgid "CARGA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__20 +msgid "CARGA MARITIMA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__52 +msgid "COMPRAS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__26 +msgid "CORREO INTERNO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__1 +msgid "COURIER" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "Cancel" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +msgid "Cancelar" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_postage_type__d +msgid "Cash On Delivery" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__closed +msgid "Cerrado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__closed_final +msgid "Cerrado Definitivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__closed_final +msgid "Cerrado definitivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__closed +msgid "Cerrado por siniestro" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_is_pickup_service +#: model:ir.model.fields,help:delivery_gls_asm.field_stock_picking__gls_carrier_is_pickup_service +msgid "Checked if this service is used for pickups" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "City" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__incidence +msgid "Con incidencia" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "Couldn't find the consignee street" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "Couldn't find the sender street" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Customer" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__9 +msgid "DEVOLUCION" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__14 +msgid "DISTRIBUCION PROPIA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__18 +msgid "DISTRIBUCION  RED" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__date_from +msgid "Date From" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__destroyed +msgid "Destruido por orden del cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__return_agency +msgid "Devuelta" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__return_customer +msgid "Devuelta al cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__display_name +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__display_name +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__display_name +msgid "Display Name" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__25 +msgid "EASYBAG" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__37 +msgid "ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__54 +msgid "EURO ESTANDAR" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__22 +msgid "EURO SMALL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__74 +msgid "EUROBUSINESS PARCEL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__76 +msgid "EUROBUSINESS SMALL PARCEL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__18 +msgid "EconomyParcel" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__agency_transit +msgid "En delegación destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__origin +msgid "En delegación origen" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__returning +msgid "En devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__in_platform +msgid "En plataforma de destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__shipping +msgid "En reparto" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__transit +msgid "En tránsito al destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__13 +msgid "Ent. Pto. ASM" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__cancel_returned +msgid "Entrega anulada (devuelta)" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__partially_delivered +msgid "Entrega parcial" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__delivered +msgid "Entregado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__parcelshop +msgid "Entregado en ASM PARCELSHOP" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_shipment_state +msgid "Estado envío GLS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_pickup_state +msgid "Estado recogida GLS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__9 +msgid "Franja Horaria" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__21 +msgid "GLASS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__delivery_type__gls_asm +msgid "GLS ASM" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS ASM API doesn't provide methods to compute delivery rates, so\n" +" you should relay on another price method instead or override " +"this\n" +" one in your custom code." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_asm_public_tracking_ref +msgid "GLS Barcode" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "GLS Cancellation failed with reason: %s" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_delivery_carrier_form +msgid "GLS Configuration" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.ui.menu,name:delivery_gls_asm.menu_gls_asm_manifest +msgid "GLS Deliveries Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "GLS Label" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#: model:ir.actions.act_window,name:delivery_gls_asm.action_delivery_gls_asm_manifest_wizard +#: model:ir.actions.report,name:delivery_gls_asm.gls_asm_manifest_report +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +#, python-format +msgid "GLS Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "GLS Pickup extra info:
Tracking number: %s
Bultos: %s" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_service +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__carrier_id +msgid "GLS Service" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS Shipping extra info:\n" +"barcode: %s" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_uid +msgid "GLS UID" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/stock_picking.py:0 +#, python-format +msgid "GLS label for %s" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS returned an error trying to record the shipping for {}.\n" +"Error:\n" +"{}" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS-ASM API doesn't admit a reference number higher than 15 characters. In " +"order to handle it, they trim thereference and as the reference is unique to " +"every customer we soon would have duplicated reference collisions. To " +"prevent this, you should edit your picking sequence to a max of 15 " +"characters." +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS: No response from server getting state from ref {}.\n" +"Traceback:\n" +"{}" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS: No response from server printing label with ref {}.\n" +"Traceback:\n" +"{}" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +msgid "Get Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_gls_asm_minifest_wizard +msgid "Get the GLS Manifest for the given date range" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__recorded +msgid "Grabado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__11 +msgid "IBEX" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__id +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__id +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__id +msgid "ID" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__34 +msgid "INT PAQUET" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__55 +msgid "INTERC. EUROESTANDAR" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__7 +msgid "INTERDIA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__13 +msgid "INTERNACIONAL ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__12 +msgid "INTERNACIONAL EXPRESS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__36 +msgid "Int. WEB" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/wizard/gls_asm_manifest_wizard.py:0 +#, python-format +msgid "" +"It wasn't possible to get the manifest. Maybe there aren'tdeliveries for the " +"selected date." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier____last_update +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard____last_update +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking____last_update +msgid "Last Modified on" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__53 +msgid "MR1" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_delivery_carrier_form +msgid "Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__manifested +msgid "Manifestada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__10 +msgid "Maritimo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__4 +msgid "Masivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__not_done +msgid "No Realizada" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"No response from server getting manifisto for GLS.\n" +"Traceback:\n" +"{}" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"No response from server recording GLS delivery {}.\n" +"Traceback:\n" +"{}" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__19 +msgid "OPERACIONES RED" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__24 +msgid "OPTIPLUS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__15 +msgid "OTROS PUENTES" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__23 +msgid "PREPAGO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__16 +msgid "PROPIO AGENTE" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Packages" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__19 +msgid "ParcelShop" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__pending +msgid "Pendiente Gestión" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__held +msgid "Pendiente autorización" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__pending +msgid "Pendiente datos en delegación" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__pending_auth +msgid "Pending Autorización" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_is_pickup_service +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_carrier_is_pickup_service +msgid "Pick-up service" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__possible_return +msgid "Posible devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_postage_type +msgid "Postage Type" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_postage_type +msgid "Postage type, usually 'Prepaid'" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__preconfirmed +msgid "Preconfirmada enrega" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_postage_type__p +msgid "Prepaid" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__delivery_type +msgid "Provider" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__58 +msgid "RC. PARCEL SHOP" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__32 +msgid "RC.SELLADA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__39 +msgid "REC. INT" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__51 +msgid "REC. INT WW" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__57 +msgid "REC. INTERCIUDAD ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__33 +msgid "RECANALIZA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__7 +msgid "RECOGIDA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__8 +msgid "RECOGIDA CRUZADA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__56 +msgid "RECOGIDA ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__48 +msgid "RECOGIDA MEN. CAMION" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__47 +msgid "RECOGIDA MEN. F.GRANDE" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__46 +msgid "RECOGIDA MEN. FURGONETA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__45 +msgid "RECOGIDA MEN. MOTO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__49 +msgid "RECOGIDA MENSAJERO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__17 +msgid "RECOGIDA SIN MERCANCIA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__10 +msgid "RETORNO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__incidence +msgid "Realizada con Incidencia" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__done +msgid "Realizada con éxito" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__11 +msgid "Rec. en NAVE." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__extinguished +msgid "Recanalizada (A extinguir)" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__picked_up_agency +msgid "Recepcionada en Agencia" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__received +msgid "Recibida" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__picked_up_customer +msgid "Recogido en Cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Ref." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__held_order +msgid "Retenido por orden de paga" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__44 +msgid "SERVICIO LOCAL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__43 +msgid "SERVICIO LOCAL CAMION" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__42 +msgid "SERVICIO LOCAL F. GRANDE" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__41 +msgid "SERVICIO LOCAL FURGONETA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__40 +msgid "SERVICIO LOCAL MOTO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__50 +msgid "SERVICIOS ESPECIALES" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__38 +msgid "SERVICIOS RUTAS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__5 +msgid "SaturdayService" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "Send pick-up" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_service +msgid "Set the contracted GLS Service" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_shiptime +msgid "Set the desired GLS shipping time for this carrier" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_delivery_carrier +msgid "Shipping Methods" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_shiptime +msgid "Shipping Time" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__recorded +msgid "Solicitada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__requested_return +msgid "Solicitud de devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"Unable to cancel GLS Expedition with reference {} as it is in state {}.\n" +"Please manage the cancellation of this shipment/pickup with GLS via email." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__2 +msgid "VALIJA" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Weight" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "ZIP Code" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__35 +msgid "dPRO" +msgstr "" diff --git a/delivery_gls_asm/i18n/delivery_gls_asm.pot b/delivery_gls_asm/i18n/delivery_gls_asm.pot new file mode 100644 index 00000000000..c589d50ff07 --- /dev/null +++ b/delivery_gls_asm/i18n/delivery_gls_asm.pot @@ -0,0 +1,1016 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_gls_asm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-10-20 12:24+0000\n" +"PO-Revision-Date: 2022-10-20 12:24+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: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__0 +msgid "10:00 Service" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__2 +msgid "14:00 Service" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__27 +msgid "14H SOBRES" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__28 +msgid "24H SOBRES" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__29 +msgid "72H SOBRES" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "
(Kg.)" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "
(Packages)" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "" +"\n" +" Carrier Signature / Stamp\n" +" " +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "TOTAL EXPEDITIONS: " +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Company:" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Date of printing" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "GLS MANIFEST" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Manifest Date:" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Printed by" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "TOTAL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__preconfirm +msgid "A preconfirmar" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__59 +msgid "ASM BUROFAX" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__60 +msgid "ASM GO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__parcelshop_confirm +msgid "ASM PARCELSHOP CONFIRMA RECEPCIÓN" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__30 +msgid "ASM0830" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__66 +msgid "ASMTRAVELLERS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__warehouse +msgid "Almacenado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__cancel +msgid "Anualada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__cancel +msgid "Anulada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__assigned +msgid "Asignada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__5 +msgid "BICI" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__3 +msgid "BusinessParcel" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__31 +msgid "CAN MUESTRAS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__6 +msgid "CARGA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__20 +msgid "CARGA MARITIMA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__52 +msgid "COMPRAS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__26 +msgid "CORREO INTERNO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__1 +msgid "COURIER" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "Cancel" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +msgid "Cancelar" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_postage_type__d +msgid "Cash On Delivery" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_cash_on_delivery +msgid "Cash on delivery" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__closed +msgid "Cerrado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__closed_final +msgid "Cerrado Definitivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__closed_final +msgid "Cerrado definitivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__closed +msgid "Cerrado por siniestro" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_with_return +msgid "" +"Check this field to mark the delivery as 'With return'. This means that the " +"customer receiving the delivery also has a package to return." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_is_pickup_service +#: model:ir.model.fields,help:delivery_gls_asm.field_stock_picking__gls_carrier_is_pickup_service +msgid "Checked if this service is used for pickups" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "City" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__incidence +msgid "Con incidencia" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "Couldn't find the consignee street" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "Couldn't find the sender street" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Customer" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__9 +msgid "DEVOLUCION" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__14 +msgid "DISTRIBUCION PROPIA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__18 +msgid "DISTRIBUCION  RED" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__date_from +msgid "Date From" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__destroyed +msgid "Destruido por orden del cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__return_agency +msgid "Devuelta" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__return_customer +msgid "Devuelta al cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__25 +msgid "EASYBAG" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__37 +msgid "ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__54 +msgid "EURO ESTANDAR" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__22 +msgid "EURO SMALL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__74 +msgid "EUROBUSINESS PARCEL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__76 +msgid "EUROBUSINESS SMALL PARCEL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__18 +msgid "EconomyParcel" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__agency_transit +msgid "En delegación destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__origin +msgid "En delegación origen" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__returning +msgid "En devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__in_platform +msgid "En plataforma de destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__shipping +msgid "En reparto" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__transit +msgid "En tránsito al destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__13 +msgid "Ent. Pto. ASM" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__cancel_returned +msgid "Entrega anulada (devuelta)" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__partially_delivered +msgid "Entrega parcial" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__delivered +msgid "Entregado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__parcelshop +msgid "Entregado en ASM PARCELSHOP" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_shipment_state +msgid "Estado envío GLS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_pickup_state +msgid "Estado recogida GLS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__9 +msgid "Franja Horaria" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__21 +msgid "GLASS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__delivery_type__gls_asm +msgid "GLS ASM" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS ASM API doesn't provide methods to compute delivery rates, so\n" +" you should relay on another price method instead or override this\n" +" one in your custom code." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_asm_public_tracking_ref +msgid "GLS Barcode" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "GLS Cancellation failed with reason: %s" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_delivery_carrier_form +msgid "GLS Configuration" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.ui.menu,name:delivery_gls_asm.menu_gls_asm_manifest +msgid "GLS Deliveries Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "GLS Label" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#: model:ir.actions.act_window,name:delivery_gls_asm.action_delivery_gls_asm_manifest_wizard +#: model:ir.actions.report,name:delivery_gls_asm.gls_asm_manifest_report +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +#, python-format +msgid "GLS Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_asm_picking_ref +msgid "GLS Picking Reference" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS Pickup extra info:
Tracking number: %(codigo)s
Bultos: " +"%(bultos)s" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_service +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__carrier_id +msgid "GLS Service" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS Shipping extra info:\n" +"barcode: %s" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_uid +msgid "GLS UID" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/stock_picking.py:0 +#, python-format +msgid "GLS label for %s" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS returned an error trying to record the shipping for %(ref).\n" +"Error:\n" +"%(error)" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS-ASM API doesn't admit a reference number higher than 15 characters. In " +"order to handle it, they trim thereference and as the reference is unique to" +" every customer we soon would have duplicated reference collisions. To " +"prevent this, you should edit your picking sequence to a max of 15 " +"characters." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_with_return +msgid "GLS/ASM With return" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS: No response from server getting state from ref %(ref).\n" +"Traceback:\n" +"%(error)" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS: No response from server printing label with ref %(ref).\n" +"Traceback:\n" +"%(error)" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +msgid "Get Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_gls_asm_minifest_wizard +msgid "Get the GLS Manifest for the given date range" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__recorded +msgid "Grabado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__11 +msgid "IBEX" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__id +msgid "ID" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__34 +msgid "INT PAQUET" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__55 +msgid "INTERC. EUROESTANDAR" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__7 +msgid "INTERDIA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__13 +msgid "INTERNACIONAL ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__12 +msgid "INTERNACIONAL EXPRESS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_cash_on_delivery +msgid "" +"If checked, it means that the carrier is paid with cash. It assumes there is" +" a sale order linked and it will use that total amount as the value to be " +"paid" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__36 +msgid "Int. WEB" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/wizard/gls_asm_manifest_wizard.py:0 +#, python-format +msgid "" +"It wasn't possible to get the manifest. Maybe there aren'tdeliveries for the" +" selected date." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard____last_update +msgid "Last Modified on" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__53 +msgid "MR1" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_delivery_carrier_form +msgid "Manifest" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__manifested +msgid "Manifestada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__10 +msgid "Maritimo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__4 +msgid "Masivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__not_done +msgid "No Realizada" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"No response from server getting manifisto for GLS.\n" +"Traceback:\n" +"%(error)" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"No response from server recording GLS delivery %(ref).\n" +"Traceback:\n" +"%(error)" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__19 +msgid "OPERACIONES RED" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__24 +msgid "OPTIPLUS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__15 +msgid "OTROS PUENTES" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__23 +msgid "PREPAGO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__16 +msgid "PROPIO AGENTE" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Packages" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__19 +msgid "ParcelShop" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__pending +msgid "Pendiente Gestión" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__held +msgid "Pendiente autorización" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__pending +msgid "Pendiente datos en delegación" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__pending_auth +msgid "Pending Autorización" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_is_pickup_service +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_carrier_is_pickup_service +msgid "Pick-up service" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__possible_return +msgid "Posible devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_postage_type +msgid "Postage Type" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_postage_type +msgid "Postage type, usually 'Prepaid'" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__preconfirmed +msgid "Preconfirmada enrega" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_postage_type__p +msgid "Prepaid" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__delivery_type +msgid "Provider" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__58 +msgid "RC. PARCEL SHOP" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__32 +msgid "RC.SELLADA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__39 +msgid "REC. INT" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__51 +msgid "REC. INT WW" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__57 +msgid "REC. INTERCIUDAD ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__33 +msgid "RECANALIZA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__7 +msgid "RECOGIDA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__8 +msgid "RECOGIDA CRUZADA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__56 +msgid "RECOGIDA ECONOMY" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__48 +msgid "RECOGIDA MEN. CAMION" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__47 +msgid "RECOGIDA MEN. F.GRANDE" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__46 +msgid "RECOGIDA MEN. FURGONETA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__45 +msgid "RECOGIDA MEN. MOTO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__49 +msgid "RECOGIDA MENSAJERO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__17 +msgid "RECOGIDA SIN MERCANCIA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__10 +msgid "RETORNO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__incidence +msgid "Realizada con Incidencia" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__done +msgid "Realizada con éxito" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__11 +msgid "Rec. en NAVE." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__extinguished +msgid "Recanalizada (A extinguir)" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__picked_up_agency +msgid "Recepcionada en Agencia" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__received +msgid "Recibida" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__picked_up_customer +msgid "Recogido en Cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Ref." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__held_order +msgid "Retenido por orden de paga" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__44 +msgid "SERVICIO LOCAL" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__43 +msgid "SERVICIO LOCAL CAMION" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__42 +msgid "SERVICIO LOCAL F. GRANDE" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__41 +msgid "SERVICIO LOCAL FURGONETA" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__40 +msgid "SERVICIO LOCAL MOTO" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__50 +msgid "SERVICIOS ESPECIALES" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__38 +msgid "SERVICIOS RUTAS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__5 +msgid "SaturdayService" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "Send pick-up" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_service +msgid "Set the contracted GLS Service" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_shiptime +msgid "Set the desired GLS shipping time for this carrier" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_delivery_carrier +msgid "Shipping Methods" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_shiptime +msgid "Shipping Time" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__recorded +msgid "Solicitada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__requested_return +msgid "Solicitud de devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"Unable to cancel GLS Expedition with reference {} as it is in state {}.\n" +"Please manage the cancellation of this shipment/pickup with GLS via email." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__2 +msgid "VALIJA" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Weight" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "ZIP Code" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__35 +msgid "dPRO" +msgstr "" diff --git a/delivery_gls_asm/i18n/es.po b/delivery_gls_asm/i18n/es.po new file mode 100644 index 00000000000..ee60d902995 --- /dev/null +++ b/delivery_gls_asm/i18n/es.po @@ -0,0 +1,1048 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_gls_asm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-10-20 12:24+0000\n" +"PO-Revision-Date: 2022-10-20 14:26+0200\n" +"Last-Translator: ethan@studio73.es\n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__0 +msgid "10:00 Service" +msgstr "10:00 Service" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__2 +msgid "14:00 Service" +msgstr "14:00 Service" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__27 +msgid "14H SOBRES" +msgstr "14H SOBRES" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__28 +msgid "24H SOBRES" +msgstr "24H SOBRES" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__29 +msgid "72H SOBRES" +msgstr "72H SOBRES" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "
(Kg.)" +msgstr "
(Kg.)" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "
(Packages)" +msgstr "
(Bultos)" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "" +"\n" +" Carrier Signature / Stamp\n" +" " +msgstr "" +"\n" +" Sello / Firma del " +"Transportista\n" +" " + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "TOTAL EXPEDITIONS: " +msgstr "TOTAL EXPEDICIONES: " + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Company:" +msgstr "Compañía:" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Date of printing" +msgstr "Fecha de impresión" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "GLS MANIFEST" +msgstr "MANIFIESTO GLS" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Manifest Date:" +msgstr "Fecha de manifiesto:" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Printed by" +msgstr "Imprimido por" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "TOTAL" +msgstr "TOTAL" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__preconfirm +msgid "A preconfirmar" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__59 +msgid "ASM BUROFAX" +msgstr "ASM BUROFAX" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__60 +msgid "ASM GO" +msgstr "ASM GO" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__parcelshop_confirm +msgid "ASM PARCELSHOP CONFIRMA RECEPCIÓN" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__30 +msgid "ASM0830" +msgstr "ASM0830" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__66 +msgid "ASMTRAVELLERS" +msgstr "ASMTRAVELLERS" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__warehouse +msgid "Almacenado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__cancel +msgid "Anualada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__cancel +msgid "Anulada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__assigned +msgid "Asignada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__5 +msgid "BICI" +msgstr "BICI" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__3 +msgid "BusinessParcel" +msgstr "BusinessParcel" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__31 +msgid "CAN MUESTRAS" +msgstr "CAN MUESTRAS" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__6 +msgid "CARGA" +msgstr "CARGA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__20 +msgid "CARGA MARITIMA" +msgstr "CARGA MARITIMA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__52 +msgid "COMPRAS" +msgstr "COMPRAS" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__26 +msgid "CORREO INTERNO" +msgstr "CORREO INTERNO" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__1 +msgid "COURIER" +msgstr "COURIER" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +msgid "Cancelar" +msgstr "Cancelar" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_postage_type__d +msgid "Cash On Delivery" +msgstr "Portes debidos" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_cash_on_delivery +msgid "Cash on delivery" +msgstr "Contra reembolso" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__closed +msgid "Cerrado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__closed_final +msgid "Cerrado Definitivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__closed_final +msgid "Cerrado definitivo" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__closed +msgid "Cerrado por siniestro" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_with_return +msgid "" +"Check this field to mark the delivery as 'With return'. This means that the " +"customer receiving the delivery also has a package to return." +msgstr "" +"Marcar campo para indicar que el envío es 'Con recogida'. Esto significa que " +"el cliente que recibe el envío también tiene un paquete para devolver." + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_is_pickup_service +#: model:ir.model.fields,help:delivery_gls_asm.field_stock_picking__gls_carrier_is_pickup_service +msgid "Checked if this service is used for pickups" +msgstr "Marcado si este servicio se usa para recogidas" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "City" +msgstr "Ciudad" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__incidence +msgid "Con incidencia" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "Couldn't find the consignee street" +msgstr "No se ha podido encontrar la calle del consignatario (obligatorio)" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "Couldn't find the sender street" +msgstr "No se ha podido encontrar la calle del remitente (obligatorio)" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Customer" +msgstr "Cliente" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__9 +msgid "DEVOLUCION" +msgstr "DEVOLUCION" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__14 +msgid "DISTRIBUCION PROPIA" +msgstr "DISTRIBUCION PROPIA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__18 +msgid "DISTRIBUCION  RED" +msgstr "DISTRIBUCION  RED" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__date_from +msgid "Date From" +msgstr "Fecha desde" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__destroyed +msgid "Destruido por orden del cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__return_agency +msgid "Devuelta" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__return_customer +msgid "Devuelta al cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__25 +msgid "EASYBAG" +msgstr "EASYBAG" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__37 +msgid "ECONOMY" +msgstr "ECONOMY" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__54 +msgid "EURO ESTANDAR" +msgstr "EURO ESTANDAR" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__22 +msgid "EURO SMALL" +msgstr "EURO SMALL" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__74 +msgid "EUROBUSINESS PARCEL" +msgstr "EUROBUSINESS PARCEL" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__76 +msgid "EUROBUSINESS SMALL PARCEL" +msgstr "EUROBUSINESS SMALL PARCEL" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__18 +msgid "EconomyParcel" +msgstr "EconomyParcel" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__agency_transit +msgid "En delegación destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__origin +msgid "En delegación origen" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__returning +msgid "En devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__in_platform +msgid "En plataforma de destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__shipping +msgid "En reparto" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__transit +msgid "En tránsito al destino" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__13 +msgid "Ent. Pto. ASM" +msgstr "Ent. Pto. ASM" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__cancel_returned +msgid "Entrega anulada (devuelta)" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__partially_delivered +msgid "Entrega parcial" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__delivered +msgid "Entregado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__parcelshop +msgid "Entregado en ASM PARCELSHOP" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_shipment_state +msgid "Estado envío GLS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_pickup_state +msgid "Estado recogida GLS" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__9 +msgid "Franja Horaria" +msgstr "Franja Horaria" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__21 +msgid "GLASS" +msgstr "GLASS" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__delivery_type__gls_asm +msgid "GLS ASM" +msgstr "GLS ASM" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS ASM API doesn't provide methods to compute delivery rates, so\n" +" you should relay on another price method instead or override " +"this\n" +" one in your custom code." +msgstr "" +"La API de GLS ASM no proporciona métodos para calcular las tasasde entrega, " +"por lo que debe confiar en otro método de precio ensu lugar o anular este " +"uno en su código personalizado." + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_asm_public_tracking_ref +msgid "GLS Barcode" +msgstr "Código de barras GLS" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "GLS Cancellation failed with reason: %s" +msgstr "La cancelación de GLS falló por esta causa: %s" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_delivery_carrier_form +msgid "GLS Configuration" +msgstr "Configuración GLS" + +#. module: delivery_gls_asm +#: model:ir.ui.menu,name:delivery_gls_asm.menu_gls_asm_manifest +msgid "GLS Deliveries Manifest" +msgstr "Manifiesto de Envíos GLS" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "GLS Label" +msgstr "Etiqueta GLS" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#: model:ir.actions.act_window,name:delivery_gls_asm.action_delivery_gls_asm_manifest_wizard +#: model:ir.actions.report,name:delivery_gls_asm.gls_asm_manifest_report +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +#, python-format +msgid "GLS Manifest" +msgstr "Manifiesto GLS" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_asm_picking_ref +msgid "GLS Picking Reference" +msgstr "Referencia albarán GLS" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS Pickup extra info:
Tracking number: %(codigo)s
Bultos: " +"%(bultos)s" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_service +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__carrier_id +msgid "GLS Service" +msgstr "Servicio GLS" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS Shipping extra info:\n" +"barcode: %s" +msgstr "" +"Información extra de la expedición GLS:\n" +"Código de barras: %s" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_uid +msgid "GLS UID" +msgstr "UID GLS" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/stock_picking.py:0 +#, python-format +msgid "GLS label for %s" +msgstr "Etiqueta GLS para% s" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS returned an error trying to record the shipping for %(ref).\n" +"Error:\n" +"%(error)" +msgstr "" +"GLS ha devuelto un error tratando de registrar la expedición para %(ref).\n" +"Error:\n" +"%(error)" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"GLS-ASM API doesn't admit a reference number higher than 15 characters. In " +"order to handle it, they trim thereference and as the reference is unique to " +"every customer we soon would have duplicated reference collisions. To " +"prevent this, you should edit your picking sequence to a max of 15 " +"characters." +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_with_return +msgid "GLS/ASM With return" +msgstr "Con recogida GLS/ASM" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS: No response from server getting state from ref %(ref).\n" +"Traceback:\n" +"%(error)" +msgstr "" +"GLS: Si respuesta del servidor intentando recuperar el estado de la " +"referencia %(ref).\n" +"Traceback:\n" +"%(error)" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"GLS: No response from server printing label with ref %(ref).\n" +"Traceback:\n" +"%(error)" +msgstr "" +"GLS: Sin respuesta del servidor trantando de imprimir la etiqueta con " +"referencia %(ref)..\n" +"Traceback:\n" +"%(error)" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.delivery_manifest_wizard_form +msgid "Get Manifest" +msgstr "Obtenter manifiesto" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_gls_asm_minifest_wizard +msgid "Get the GLS Manifest for the given date range" +msgstr "Obtener el Manifiesto de GLS para el rango de fechas indicado" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__recorded +msgid "Grabado" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__11 +msgid "IBEX" +msgstr "IBEX" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__id +msgid "ID" +msgstr "ID" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__34 +msgid "INT PAQUET" +msgstr "INT PAQUET" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__55 +msgid "INTERC. EUROESTANDAR" +msgstr "INTERC. EUROESTANDAR" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__7 +msgid "INTERDIA" +msgstr "INTERDIA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__13 +msgid "INTERNACIONAL ECONOMY" +msgstr "INTERNACIONAL ECONOMY" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__12 +msgid "INTERNACIONAL EXPRESS" +msgstr "INTERNACIONAL EXPRESS" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_cash_on_delivery +msgid "" +"If checked, it means that the carrier is paid with cash. It assumes there is " +"a sale order linked and it will use that total amount as the value to be paid" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__36 +msgid "Int. WEB" +msgstr "Int. WEB" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/wizard/gls_asm_manifest_wizard.py:0 +#, python-format +msgid "" +"It wasn't possible to get the manifest. Maybe there aren'tdeliveries for the " +"selected date." +msgstr "" +"No fue posible obtener el manifiesto. Quizá no haya expediciones para la " +"fecha seleccionada." + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_gls_asm_minifest_wizard__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__53 +msgid "MR1" +msgstr "MR1" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_delivery_carrier_form +msgid "Manifest" +msgstr "Manifiesto" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__manifested +msgid "Manifestada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__10 +msgid "Maritimo" +msgstr "Maritimo" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__4 +msgid "Masivo" +msgstr "Masivo" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__not_done +msgid "No Realizada" +msgstr "" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"No response from server getting manifisto for GLS.\n" +"Traceback:\n" +"%(error)" +msgstr "" +"No hay respuesta del servidor obteniendo manifisto para GLS.\n" +"Rastrear:\n" +"%(error)" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/gls_asm_request.py:0 +#, python-format +msgid "" +"No response from server recording GLS delivery %(ref).\n" +"Traceback:\n" +"%(error)" +msgstr "" +"No hay respuesta del servidor que registra la entrega de GLS %(ref).\n" +"Rastrear:\n" +"%(error)" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__19 +msgid "OPERACIONES RED" +msgstr "OPERACIONES RED" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__24 +msgid "OPTIPLUS" +msgstr "OPTIPLUS" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__15 +msgid "OTROS PUENTES" +msgstr "OTROS PUENTES" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__23 +msgid "PREPAGO" +msgstr "PREPAGO" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__16 +msgid "PROPIO AGENTE" +msgstr "PROPIO AGENTE" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Packages" +msgstr "Bultos" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__19 +msgid "ParcelShop" +msgstr "ParcelShop" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__pending +msgid "Pendiente Gestión" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__held +msgid "Pendiente autorización" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__pending +msgid "Pendiente datos en delegación" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__pending_auth +msgid "Pending Autorización" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_is_pickup_service +#: model:ir.model.fields,field_description:delivery_gls_asm.field_stock_picking__gls_carrier_is_pickup_service +msgid "Pick-up service" +msgstr "Servicio de recogida" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__possible_return +msgid "Posible devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_postage_type +msgid "Postage Type" +msgstr "Tipo de envío" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_postage_type +msgid "Postage type, usually 'Prepaid'" +msgstr "Tipo de envío, normalmente 'Portes pagados'" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__preconfirmed +msgid "Preconfirmada enrega" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_postage_type__p +msgid "Prepaid" +msgstr "Portes pagados" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__delivery_type +msgid "Provider" +msgstr "Proveedor" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__58 +msgid "RC. PARCEL SHOP" +msgstr "RC. PARCEL SHOP" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__32 +msgid "RC.SELLADA" +msgstr "RC.SELLADA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__39 +msgid "REC. INT" +msgstr "REC. INT" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__51 +msgid "REC. INT WW" +msgstr "REC. INT WW" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__57 +msgid "REC. INTERCIUDAD ECONOMY" +msgstr "REC. ECONOMÍA INTERCIUDAD" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__33 +msgid "RECANALIZA" +msgstr "RECANALIZA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__7 +msgid "RECOGIDA" +msgstr "RECOGIDA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__8 +msgid "RECOGIDA CRUZADA" +msgstr "RECOGIDA CRUZADA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__56 +msgid "RECOGIDA ECONOMY" +msgstr "ECONOMÍA RECOGIDA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__48 +msgid "RECOGIDA MEN. CAMION" +msgstr "RECOGIDA MEN. CAMIÓN" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__47 +msgid "RECOGIDA MEN. F.GRANDE" +msgstr "RECOGIDA MEN. F.GRANDE" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__46 +msgid "RECOGIDA MEN. FURGONETA" +msgstr "RECOGIDA MEN. FURGONETA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__45 +msgid "RECOGIDA MEN. MOTO" +msgstr "RECOGIDA MEN. MOTO" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__49 +msgid "RECOGIDA MENSAJERO" +msgstr "RECOGIDA MENSAJERO" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__17 +msgid "RECOGIDA SIN MERCANCIA" +msgstr "RECOGIDA SIN MERCANCIA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__10 +msgid "RETORNO" +msgstr "RETORNO" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__incidence +msgid "Realizada con Incidencia" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__done +msgid "Realizada con éxito" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__11 +msgid "Rec. en NAVE." +msgstr "Rec. en NAVE." + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__extinguished +msgid "Recanalizada (A extinguir)" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__picked_up_agency +msgid "Recepcionada en Agencia" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__received +msgid "Recibida" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__picked_up_customer +msgid "Recogido en Cliente" +msgstr "" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Ref." +msgstr "Ref." + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__held_order +msgid "Retenido por orden de paga" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__44 +msgid "SERVICIO LOCAL" +msgstr "SERVICIO LOCAL" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__43 +msgid "SERVICIO LOCAL CAMION" +msgstr "SERVICIO LOCAL CAMIÓN" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__42 +msgid "SERVICIO LOCAL F. GRANDE" +msgstr "SERVICIO LOCAL F. GRANDE" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__41 +msgid "SERVICIO LOCAL FURGONETA" +msgstr "SERVICIO LOCAL FURGONETA" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__40 +msgid "SERVICIO LOCAL MOTO" +msgstr "SERVICIO LOCAL MOTO" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__50 +msgid "SERVICIOS ESPECIALES" +msgstr "SERVICIOS ESPECIALES" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__38 +msgid "SERVICIOS RUTAS" +msgstr "SERVICIOS RUTAS" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_shiptime__5 +msgid "SaturdayService" +msgstr "Servicio Sábado" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.view_picking_form +msgid "Send pick-up" +msgstr "Enviar recogida" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_service +msgid "Set the contracted GLS Service" +msgstr "Establezca el servicio GLS contratado" + +#. module: delivery_gls_asm +#: model:ir.model.fields,help:delivery_gls_asm.field_delivery_carrier__gls_asm_shiptime +msgid "Set the desired GLS shipping time for this carrier" +msgstr "Establezca el tiempo de envío de las opciones de GLS" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_delivery_carrier +msgid "Shipping Methods" +msgstr "Métodos de envío" + +#. module: delivery_gls_asm +#: model:ir.model.fields,field_description:delivery_gls_asm.field_delivery_carrier__gls_asm_shiptime +msgid "Shipping Time" +msgstr "Tiempo de envío" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_pickup_state__recorded +msgid "Solicitada" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__stock_picking__gls_shipment_state__requested_return +msgid "Solicitud de devolución" +msgstr "" + +#. module: delivery_gls_asm +#: model:ir.model,name:delivery_gls_asm.model_stock_picking +msgid "Transfer" +msgstr "Albarán" + +#. module: delivery_gls_asm +#: code:addons/delivery_gls_asm/models/delivery_carrier.py:0 +#, python-format +msgid "" +"Unable to cancel GLS Expedition with reference {} as it is in state {}.\n" +"Please manage the cancellation of this shipment/pickup with GLS via email." +msgstr "" +"No es posible cancelar la expedición GLS con la reference {} ya que estáen " +"el estado {}. \n" +"Por favor gestonia la cancelación de este envío/recogida con GLS por correo." + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__2 +msgid "VALIJA" +msgstr "VALIJA" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "Weight" +msgstr "Peso" + +#. module: delivery_gls_asm +#: model_terms:ir.ui.view,arch_db:delivery_gls_asm.gls_asm_manifest_report_view +msgid "ZIP Code" +msgstr "C.P." + +#. module: delivery_gls_asm +#: model:ir.model.fields.selection,name:delivery_gls_asm.selection__delivery_carrier__gls_asm_service__35 +msgid "dPRO" +msgstr "dPRO" diff --git a/delivery_gls_asm/models/__init__.py b/delivery_gls_asm/models/__init__.py new file mode 100644 index 00000000000..0c424d37f19 --- /dev/null +++ b/delivery_gls_asm/models/__init__.py @@ -0,0 +1,3 @@ +from . import gls_asm_request +from . import delivery_carrier +from . import stock_picking diff --git a/delivery_gls_asm/models/delivery_carrier.py b/delivery_gls_asm/models/delivery_carrier.py new file mode 100644 index 00000000000..ccfd5470f36 --- /dev/null +++ b/delivery_gls_asm/models/delivery_carrier.py @@ -0,0 +1,512 @@ +# Copyright 2020 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import logging +from xml.sax.saxutils import escape + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + +from .gls_asm_master_data import ( + GLS_ASM_SERVICES, + GLS_DELIVERY_STATES_STATIC, + GLS_PICKUP_STATES_STATIC, + GLS_PICKUP_TYPE_STATES, + GLS_POSTAGE_TYPE, + GLS_SHIPMENT_TYPE_STATES, + GLS_SHIPPING_TIMES, + GLS_TRACKING_LINKS, +) +from .gls_asm_request import GlsAsmRequest + +_logger = logging.getLogger(__name__) + + +class DeliveryCarrier(models.Model): + _inherit = "delivery.carrier" + + delivery_type = fields.Selection( + selection_add=[("gls_asm", "GLS ASM")], ondelete={"gls_asm": "set default"} + ) + gls_asm_uid = fields.Char(string="GLS UID") + gls_asm_service = fields.Selection( + selection=GLS_ASM_SERVICES, + string="GLS Service", + help="Set the contracted GLS Service", + default="1", # Courier + ) + gls_asm_shiptime = fields.Selection( + selection=GLS_SHIPPING_TIMES, + string="Shipping Time", + help="Set the desired GLS shipping time for this carrier", + default="0", # 10h + ) + gls_asm_postage_type = fields.Selection( + selection=GLS_POSTAGE_TYPE, + string="Postage Type", + help="Postage type, usually 'Prepaid'", + default="P", + ) + gls_is_pickup_service = fields.Boolean( + string="Pick-up service", + help="Checked if this service is used for pickups", + compute="_compute_gls_pickup_service", + ) + gls_asm_cash_on_delivery = fields.Boolean( + string="Cash on delivery", + help=( + "If checked, it means that the carrier is paid with cash. It assumes " + "there is a sale order linked and it will use that " + "total amount as the value to be paid" + ), + ) + gls_asm_with_return = fields.Boolean( + string="GLS/ASM With return", + help=( + "Check this field to mark the delivery as 'With return'. This means that " + "the customer receiving the delivery also has a package to return." + ), + ) + + @api.depends("gls_asm_service") + def _compute_gls_pickup_service(self): + for carrier in self: + carrier.gls_is_pickup_service = carrier.gls_asm_service in [ + "7", # RECOGIDA + "8", # RECOGIDA CRUZADA + "17", # RECOGIDA SIN MERCANCIA + "39", # REC. INT + "45", # RECOGIDA MEN. MOTO + "46", # RECOGIDA MEN. FURGONETA + "47", # RECOGIDA MEN. F. GRANDE + "48", # RECGOIDA CAMIÓN + "49", # RECOGIDA MENSAJERO + "51", # REC. INT WW + "56", # RECOGIDA ECONOMY + "57", # REC. INTERCIUDAD ECONOMY + ] + + def _gls_asm_uid(self): + """The carrier can be put in test mode. The tests user must be set. + A default given by GLS is put in the config parameter data""" + self.ensure_one() + uid = ( + self.gls_asm_uid + if self.prod_environment + else self.env["ir.config_parameter"] + .sudo() + .get_param("delivery_gls_asm.api_user_demo", "") + ) + return uid + + def gls_asm_get_tracking_link(self, picking): + """Provide tracking link for the customer""" + # International + if picking.gls_asm_picking_ref: + if picking.partner_id.country_id.code == "PT": + base_link = GLS_TRACKING_LINKS.get("INT_PT") + else: + base_link = GLS_TRACKING_LINKS.get("INT") + tracking_url = base_link.format(picking.gls_asm_picking_ref) + else: + tracking_url = GLS_TRACKING_LINKS.get("ASM").format( + picking.carrier_tracking_ref, picking.partner_id.zip + ) + return tracking_url + + def _prepare_gls_asm_shipping(self, picking): + """Convert picking values for asm api + :param picking record with picking to send + :returns dict values for the connector + """ + self.ensure_one() + # A picking can be delivered from any warehouse + sender_partner = ( + picking.picking_type_id.warehouse_id.partner_id + or picking.company_id.partner_id + ) + consignee = picking.partner_id + consignee_entity = picking.partner_id.commercial_partner_id + if not sender_partner.street: + raise UserError(_("Couldn't find the sender street")) + cash_amount = 0 + if self.gls_asm_cash_on_delivery: + cash_amount = picking.sale_id.amount_total + return { + "fecha": fields.Date.today().strftime("%d/%m/%Y"), + "portes": self.gls_asm_postage_type, + "servicio": self.gls_asm_service, + "horario": self.gls_asm_shiptime, + "bultos": picking.number_of_packages, + "peso": round(picking.shipping_weight, 3), + "volumen": "", # [optional] Volume, in m3 + "declarado": "", # [optional] + "dninomb": "0", # [optional] + "fechaentrega": "", # [optional] + "retorno": "1" if self.gls_asm_with_return else "0", # [optional] + "pod": "N", # [optional] + "podobligatorio": "N", # [deprecated] + "remite_plaza": "", # [optional] Origin agency + "remite_nombre": escape( + sender_partner.name or sender_partner.parent_id.name + ), + "remite_direccion": escape(sender_partner.street or ""), + "remite_poblacion": escape(sender_partner.city or ""), + "remite_provincia": escape(sender_partner.state_id.name or ""), + "remite_pais": "34", # [mandatory] always 34=Spain + "remite_cp": sender_partner.zip or "", + "remite_telefono": sender_partner.phone or "", + "remite_movil": sender_partner.mobile or "", + "remite_email": escape(sender_partner.email or ""), + "remite_departamento": "", + "remite_nif": sender_partner.vat or "", + "remite_observaciones": "", + "destinatario_codigo": "", + "destinatario_plaza": "", + "destinatario_nombre": ( + escape(consignee.name or consignee.commercial_partner_id.name or "") + ), + "destinatario_direccion": escape(consignee.street or ""), + "destinatario_poblacion": escape(consignee.city or ""), + "destinatario_provincia": escape(consignee.state_id.name or ""), + "destinatario_pais": consignee.country_id.phone_code or "", + "destinatario_cp": consignee.zip, + # For certain destinations the consignee mobile and email are required to + # make the expedition. Try to fallback to the commercial entity one + "destinatario_telefono": consignee.phone or consignee_entity.phone or "", + "destinatario_movil": consignee.mobile or consignee_entity.mobile or "", + "destinatario_email": escape( + consignee.email or consignee_entity.email or "" + ), + "destinatario_observaciones": "", + "destinatario_att": "", + "destinatario_departamento": "", + "destinatario_nif": "", + "referencia_c": escape( + picking.name.replace("\\", "/") # It errors with \ characters + ), # Our unique reference + "referencia_0": "", # Not used if the above is set + "importes_debido": "0", # The customer pays the shipping + "importes_reembolso": cash_amount or "", + "seguro": "0", # [optional] + "seguro_descripcion": "", # [optional] + "seguro_importe": "", # [optional] + "etiqueta": "PDF", # Get Label in response + "etiqueta_devolucion": "PDF", + # [optional] GLS Customer Code + # (when customer have several codes in GLS) + "cliente_codigo": "", + "cliente_plaza": "", + "cliente_agente": "", + } + + def _prepare_gls_asm_pickup(self, picking): + """Convert picking values for asm api pickup + :param picking record with picking to send + :returns dict values for the connector + """ + self.ensure_one() + sender_partner = picking.partner_id + receiving_partner = ( + picking.picking_type_id.warehouse_id.partner_id + or picking.company_id.partner_id + ) + if not sender_partner.street: + raise UserError(_("Couldn't find the sender street")) + if not receiving_partner.street: + raise UserError(_("Couldn't find the consignee street")) + return { + "fecha": fields.Date.today().strftime("%d/%m/%Y"), + "portes": self.gls_asm_postage_type, + "servicio": self.gls_asm_service, + "horario": self.gls_asm_shiptime, + "bultos": picking.number_of_packages, + "peso": round(picking.shipping_weight, 3), + "fechaentrega": "", # [optional] + "observaciones": "", # [optional] + "remite_nombre": escape( + sender_partner.name or sender_partner.parent_id.name + ), + "remite_direccion": escape(sender_partner.street) or "", + "remite_poblacion": sender_partner.city or "", + "remite_provincia": sender_partner.state_id.name or "", + "remite_pais": (sender_partner.country_id.phone_code or ""), + "remite_cp": sender_partner.zip or "", + "remite_telefono": ( + sender_partner.phone or sender_partner.parent_id.phone or "" + ), + "remite_movil": ( + sender_partner.mobile or sender_partner.parent_id.mobile or "" + ), + "remite_email": ( + sender_partner.email or sender_partner.parent_id.email or "" + ), + "destinatario_nombre": escape( + receiving_partner.name or receiving_partner.parent_id.name + ), + "destinatario_direccion": escape(receiving_partner.street) or "", + "destinatario_poblacion": receiving_partner.city or "", + "destinatario_provincia": receiving_partner.state_id.name or "", + "destinatario_pais": (receiving_partner.country_id.phone_code or ""), + "destinatario_cp": receiving_partner.zip or "", + "destinatario_telefono": ( + receiving_partner.phone or receiving_partner.parent_id.phone or "" + ), + "destinatario_movil": ( + receiving_partner.mobile or receiving_partner.parent_id.mobile or "" + ), + "destinatario_email": ( + receiving_partner.email or receiving_partner.parent_id.email or "" + ), + "referencia_c": escape(picking.name), # Our unique reference + "referencia_a": "", # Not used if the above is set + } + + def gls_asm_send_shipping(self, pickings): + """Send the package to GLS + :param pickings: A recordset of pickings + :return list: A list of dictionaries although in practice it's + called one by one and only the first item in the dict is taken. Due + to this design, we have to inject vals in the context to be able to + add them to the message. + """ + gls_request = GlsAsmRequest(self._gls_asm_uid()) + result = [] + for picking in pickings: + if picking.carrier_id.gls_is_pickup_service: + continue + if len(picking.name) > 15: + raise UserError( + _( + "GLS-ASM API doesn't admit a reference number higher than " + "15 characters. In order to handle it, they trim the" + "reference and as the reference is unique to every " + "customer we soon would have duplicated reference " + "collisions. To prevent this, you should edit your picking " + "sequence to a max of 15 characters." + ) + ) + vals = self._prepare_gls_asm_shipping(picking) + vals.update({"tracking_number": False, "exact_price": 0}) + response = gls_request._send_shipping(vals) + self.log_xml( + response and response.get("gls_sent_xml", ""), + "GLS ASM Shipping Request", + ) + self.log_xml(response or "", "GLS ASM Shipping Response") + if not response or response.get("_return", -1) < 0: + result.append(vals) + continue + # For compatibility we provide this number although we get + # two more codes: codbarras and uid + vals["tracking_number"] = response.get("_codexp") + gls_asm_picking_ref = "" + try: + references = response.get("Referencias", {}).get("Referencia", []) + for ref in references: + if ref.get("_tipo", "") == "N": + gls_asm_picking_ref = ref.get("value", "") + break + except Exception as e: + _logger.warning(e) + picking.write( + { + "gls_asm_public_tracking_ref": response.get("_codbarras"), + "gls_asm_picking_ref": gls_asm_picking_ref, + } + ) + # We post an extra message in the chatter with the barcode and the + # label because there's clean way to override the one sent by core. + body = _("GLS Shipping extra info:\n" "barcode: %s") % response.get( + "_codbarras" + ) + attachment = [] + if response.get("gls_label"): + attachment = [ + ( + "gls_label_{}.pdf".format(response.get("_codbarras")), + response.get("gls_label"), + ) + ] + picking.message_post(body=body, attachments=attachment) + result.append(vals) + return result + + def gls_asm_send_pickup(self, pickings): + """Send the request to GLS to pick a package up + :param pickings: A recordset of pickings + :return list: A list of dictionaries although in practice it's + called one by one and only the first item in the dict is taken. Due + to this design, we have to inject vals in the context to be able to + add them to the message. + """ + gls_request = GlsAsmRequest(self._gls_asm_uid()) + result = [] + for picking in pickings: + if not picking.carrier_id.gls_is_pickup_service: + continue + vals = self._prepare_gls_asm_pickup(picking) + vals.update({"tracking_number": False, "exact_price": 0}) + response = gls_request._send_pickup(vals) + self.log_xml( + response and response.get("gls_sent_xml", ""), "GLS ASM Pick-up Request" + ) + self.log_xml(response or "", "GLS ASM Pick-up Response") + if not response or response.get("_return", -1) < 0: + result.append(vals) + continue + # For compatibility we provide this number although we get + # two more codes: codbarras and uid + vals["tracking_number"] = response.get("_codigo") + picking.gls_asm_public_tracking_ref = response.get("_codigo") + # We post an extra message in the chatter with the barcode and the + # label because there's clean way to override the one sent by core. + body = _( + "GLS Pickup extra info:
" + "Tracking number: %(codigo)s
Bultos: %(bultos)s", + ) % {"codigo": response.get("_codigo"), "bultos": vals["bultos"]} + picking.message_post(body=body) + result.append(vals) + return result + + def gls_asm_tracking_state_update(self, picking): + """Tracking state update""" + self.ensure_one() + if not picking.carrier_tracking_ref: + return + gls_request = GlsAsmRequest(self._gls_asm_uid()) + tracking_info = {} + if not picking.carrier_id.gls_is_pickup_service: + tracking_info = gls_request._get_tracking_states( + picking.carrier_tracking_ref + ) + tracking_states = tracking_info.get("tracking_list", {}).get("tracking", []) + # If there's just one state, we'll get a single dict, otherwise we + # get a list of dicts + if isinstance(tracking_states, dict): + tracking_states = [tracking_states] + else: + tracking_states = gls_request._get_pickup_tracking_states( + picking.carrier_tracking_ref + ) + if not tracking_states: + return + self.log_xml(tracking_states or "", "GLS ASM Tracking Response") + picking.tracking_state_history = "\n".join( + [ + "{} - [{}] {}".format( + t.get("fecha") or "{} {}".format(t.get("Fecha"), t.get("Hora")), + t.get("codigo") or t.get("Codigo"), + t.get("evento") or t.get("Descripcion"), + ) + for t in tracking_states + ] + ) + tracking = tracking_states.pop() + picking.tracking_state = "[{}] {}".format( + tracking_info.get("codestado") or tracking.get("Codigo"), + tracking_info.get("estado") or tracking.get("Descripcion"), + ) + if not picking.carrier_id.gls_is_pickup_service: + states_to_check = GLS_DELIVERY_STATES_STATIC + picking.gls_shipment_state = GLS_SHIPMENT_TYPE_STATES.get( + tracking_info.get("codestado"), "incidence" + ) + else: + states_to_check = GLS_PICKUP_STATES_STATIC + # Portuguese pick-ups use the 0 code for extra states that aren't "Canceled" + # In order to not incorrectly mark as canceled, we take the most recent + # non-0 code (that isn't "Cancel") as the current state + if ( + picking.partner_id.country_id.code == "PT" + and "Anulada" not in tracking.get("Descripcion") + ): + tracking = list( + filter(lambda t: t["Codigo"] != "0", tracking_states) + ).pop() + picking.gls_pickup_state = GLS_PICKUP_TYPE_STATES.get( + tracking.get("Codigo"), "incidence" + ) + picking.delivery_state = states_to_check.get( + tracking_info.get("codestado") or tracking.get("Codigo"), "incidence" + ) + + def gls_asm_cancel_shipment(self, pickings): + """Cancel the expedition""" + gls_request = GlsAsmRequest(self._gls_asm_uid()) + for picking in pickings.filtered("carrier_tracking_ref"): + self.gls_asm_tracking_state_update(picking=picking) + if picking.delivery_state != "shipping_recorded_in_carrier": + raise UserError( + _( + "Unable to cancel GLS Expedition with reference {} " + + "as it is in state {}.\nPlease manage the cancellation " + + "of this shipment/pickup with GLS via email." + ).format(picking.carrier_tracking_ref, picking.tracking_state) + ) + if picking.carrier_id.gls_is_pickup_service: + response = gls_request._cancel_pickup(picking.carrier_tracking_ref) + else: + response = gls_request._cancel_shipment(picking.carrier_tracking_ref) + self.log_xml( + response and response.get("gls_sent_xml", ""), "GLS ASM Cancel Request" + ) + self.log_xml(response or "", "GLS ASM Cancel Response") + if not response or response.get("_return") < 0: + msg = _("GLS Cancellation failed with reason: %s") % response.get( + "value", "Connection Error" + ) + picking.message_post(body=msg) + continue + picking.write( + {"gls_asm_public_tracking_ref": False, "gls_asm_picking_ref": False} + ) + self.gls_asm_tracking_state_update(picking=picking) + + def gls_asm_rate_shipment(self, order): + """There's no public API so another price method should be used + Not implemented with GLS-ASM, these values are so it works with websites""" + return { + "success": True, + "price": self.product_id.lst_price, + "error_message": _( + """GLS ASM API doesn't provide methods to compute delivery rates, so + you should relay on another price method instead or override this + one in your custom code.""" + ), + "warning_message": _( + """GLS ASM API doesn't provide methods to compute delivery rates, so + you should relay on another price method instead or override this + one in your custom code.""" + ), + } + + def gls_asm_get_label(self, gls_asm_public_tracking_ref): + """Generate label for picking + :param picking - stock.picking record + :returns pdf file + """ + self.ensure_one() + if not gls_asm_public_tracking_ref: + return False + gls_request = GlsAsmRequest(self._gls_asm_uid()) + label = gls_request._shipping_label(gls_asm_public_tracking_ref) + if not label: + return False + return label + + def action_get_manifest(self): + """Action to launch the manifest wizard""" + self.ensure_one() + wizard = self.env["gls.asm.minifest.wizard"].create({"carrier_id": self.id}) + view_id = self.env.ref("delivery_gls_asm.delivery_manifest_wizard_form").id + return { + "name": _("GLS Manifest"), + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "gls.asm.minifest.wizard", + "view_id": view_id, + "views": [(view_id, "form")], + "target": "new", + "res_id": wizard.id, + "context": self.env.context, + } diff --git a/delivery_gls_asm/models/gls_asm_master_data.py b/delivery_gls_asm/models/gls_asm_master_data.py new file mode 100644 index 00000000000..018701ce974 --- /dev/null +++ b/delivery_gls_asm/models/gls_asm_master_data.py @@ -0,0 +1,338 @@ +# Copyright 2020 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +GLS_ASM_SERVICES = [ + ("1", "COURIER"), + ("2", "VALIJA"), + ("5", "BICI"), + ("6", "CARGA"), + ("7", "RECOGIDA"), + ("8", "RECOGIDA CRUZADA"), + ("9", "DEVOLUCION"), + ("10", "RETORNO"), + ("11", "IBEX"), + ("12", "INTERNACIONAL EXPRESS"), + ("13", "INTERNACIONAL ECONOMY"), + ("14", "DISTRIBUCION PROPIA"), + ("15", "OTROS PUENTES"), + ("16", "PROPIO AGENTE"), + ("17", "RECOGIDA SIN MERCANCIA"), + ("18", "DISTRIBUCION  RED"), + ("19", "OPERACIONES RED"), + ("20", "CARGA MARITIMA"), + ("21", "GLASS"), + ("22", "EURO SMALL"), + ("23", "PREPAGO"), + ("24", "OPTIPLUS"), + ("25", "EASYBAG"), + ("26", "CORREO INTERNO"), + ("27", "14H SOBRES"), + ("28", "24H SOBRES"), + ("29", "72H SOBRES"), + ("30", "ASM0830"), + ("31", "CAN MUESTRAS"), + ("32", "RC.SELLADA"), + ("33", "RECANALIZA"), + ("34", "INT PAQUET"), + ("35", "dPRO"), + ("36", "Int. WEB"), + ("37", "ECONOMY"), + ("38", "SERVICIOS RUTAS"), + ("39", "REC. INT"), + ("40", "SERVICIO LOCAL MOTO"), + ("41", "SERVICIO LOCAL FURGONETA"), + ("42", "SERVICIO LOCAL F. GRANDE"), + ("43", "SERVICIO LOCAL CAMION"), + ("44", "SERVICIO LOCAL"), + ("45", "RECOGIDA MEN. MOTO"), + ("46", "RECOGIDA MEN. FURGONETA"), + ("47", "RECOGIDA MEN. F.GRANDE"), + ("48", "RECOGIDA MEN. CAMION"), + ("49", "RECOGIDA MENSAJERO"), + ("50", "SERVICIOS ESPECIALES"), + ("51", "REC. INT WW"), + ("52", "COMPRAS"), + ("53", "MR1"), + ("54", "EURO ESTANDAR"), + ("55", "INTERC. EUROESTANDAR"), + ("56", "RECOGIDA ECONOMY"), + ("57", "REC. INTERCIUDAD ECONOMY"), + ("58", "RC. PARCEL SHOP"), + ("59", "ASM BUROFAX"), + ("60", "ASM GO"), + ("66", "ASMTRAVELLERS"), + ("74", "EUROBUSINESS PARCEL"), + ("76", "EUROBUSINESS SMALL PARCEL"), +] + +GLS_SHIPPING_TIMES = [ + ("0", "10:00 Service"), + ("2", "14:00 Service"), + ("3", "BusinessParcel"), + ("5", "SaturdayService"), + ("7", "INTERDIA"), + ("9", "Franja Horaria"), + ("4", "Masivo"), + ("10", "Maritimo"), + ("11", "Rec. en NAVE."), + ("13", "Ent. Pto. ASM"), + ("18", "EconomyParcel"), + ("19", "ParcelShop"), +] + +GLS_POSTAGE_TYPE = [("P", "Prepaid"), ("D", "Cash On Delivery")] + +GLS_DELIVERY_STATES_STATIC = { + "-10": "shipping_recorded_in_carrier", # GRABADO + "0": "shipping_recorded_in_carrier", # MANIFESTADA + "2": "in_transit", # EN TRANSITO A DESTINO + "3": "in_transit", # EN DELEGACION DESTINO + "20": "incidence", # PERDIDA / ROTURA + "5": "canceled_shipment", # ANULADA + "6": "in_transit", # EN REPARTO + "7": "customer_delivered", # ENTREGADO + "8": "customer_delivered", # ENTREGA PARCIAL + "9": "in_transit", # ALMACENADO + "10": "incidence", # DEVUELTA + "11": "incidence", # PENDIENTE DATOS, EN DELEGACION + "1": "incidence", # RETENIDA EN DELEGACION + "91": "incidence", # CON INCIDENCIA + "90": "incidence", # CERRADO DEFINITIVO + "50": "in_transit", # PRECONFIRMADA ENTREGA + "51": "incidence", # ENTREGA ANULADA (DEVUELTA) + "12": "incidence", # DEVUELTA AL CLIENTE + "13": "incidence", # POSIBLE DEVOLUCION + "14": "incidence", # SOLICITUD DE DEVOLUCION + "15": "incidence", # EN DEVOLUCION + "16": "in_transit", # EN DELEGACION ORIGEN + "17": "incidence", # DESTRUIDO POR ORDEN DEL CLIENTE + "18": "incidence", # RETENIDO POR ORDEN DE PAGA + "19": "in_transit", # EN PLATAFORMA DE DESTINO + "21": "incidence", # RECANALIZADA (A EXTINGUIR) + "22": "in_transit", # ENTREGADO EN ASM PARCELSHOP + "25": "in_transit", # ASM PARCELSHOP CONFIRMA RECEPCION +} + +GLS_SHIPMENT_TYPE_STATES = { + "-10": "recorded", # GRABADO + "0": "manifested", # MANIFESTADA + "2": "transit", # EN TRANSITO A DESTINO + "3": "agency_transit", # EN DELEGACION DESTINO + "20": "closed", # CERRADO POR SINIESTRO + "5": "cancel", # ANULADA + "6": "shipping", # EN REPARTO + "7": "delivered", # ENTREGADO + "8": "partially_delivered", # ENTREGA PARCIAL + "9": "warehouse", # ALMACENADO + "10": "return_agency", # DEVUELTA + "11": "pending", # PENDIENTE DATOS. EN DELEGACIÓN + "1": "held", # PENDIENTE AUTORIZACIÓN + "91": "incidence", # CON INCIDENCIA + "90": "closed_final", # CERRADO DEFINITIVO + "50": "preconfirmed", # PRECONFIRMADA ENTREGA + "51": "cancel_returned", # ENTREGA ANULADA (DEVUELTA) + "12": "return_customer", # DEVUELTA AL CLIENTE + "13": "possible_return", # POSIBLE DEVOLUCIÓN + "14": "requested_return", # SOLICITUD DE DEVOLUCIÓN + "15": "returning", # EN DEVOLUCIÓN + "16": "origin", # EN DELEGACIÓN ORIGEN + "17": "destroyed", # DESTRUIDO POR ORDEN DEL CLIENTE + "18": "held_order", # RETENIDO POR ORDEN DE PAGA + "19": "in_platform", # EN PLATAFORMA DE DESTINO + "21": "extinguished", # RECANALIZADA (A EXTINGUIR) + "22": "parcelshop", # ENTREGADO EN ASM PARCELSHOP, + "25": "parcelshop_confirm", # ASM PARCELSHOP CONFIRMA RECEPCIÓN +} + +GLS_PICKUP_STATES_STATIC = { + "0": "canceled_shipment", # ANULADA + "1": "shipping_recorded_in_carrier", # SOLICITADA + "2": "customer_delivered", # REALIZADA CON ÉXITO + "3": "in_transit", # NO REALIZADA + "4": "customer_delivered", # RECIBIDA + "5": "incidence", # REALIZADA CON INCIDENCIA + "6": "in_transit", # RECOGIDO EN CLIENTE + "7": "in_transit", # RECEPCIONADA EN AGENCIA + "9": "shipping_recorded_in_carrier", # ASIGNADA + "10": "shipping_recorded_in_carrier", # A PRECONFIRMAR + "11": "shipping_recorded_in_carrier", # PENDIENTE GESTIÓN + "12": "customer_delivered", # CERRADO + "13": "shipping_recorded_in_carrier", # PENDIENTE AUTORIZACIÓN + "20": "customer_delivered", # CERRADO DEFINITIVO +} + +GLS_PICKUP_TYPE_STATES = { + "0": "cancel", # ANULADA + "1": "recorded", # SOLICITADA + "2": "done", # REALIZADA CON ÉXITO + "3": "not_done", # NO REALIZADA + "4": "received", # RECIBIDA + "5": "incidence", # REALIZADA CON INCIDENCIA + "6": "picked_up_customer", # RECOGIDO EN CLIENTE + "7": "picked_up_agency", # RECEPCIONADA EN AGENCIA + "9": "assigned", # ASIGNADA + "10": "preconfirm", # A PRECONFIRMAR + "11": "pending", # PENDIENTE GESTIÓN + "12": "closed", # CERRADO + "13": "pending_auth", # PENDIENTE AUTORIZACIÓN + "20": "closed_final", # CERRADO DEFINITIVO +} + +GLS_SHIPMENT_ERROR_CODES = { + 36: "Error, Consignee Zipcode, wrong format.", + 38: "Error, Invalid consignee phone number.", + -36: "Error, Consignee Zipcode, wrong format.", + -38: "Error, Invalid consignee phone number.", + -1: ( + "Exception. Timeout expired." + "Se ha forzado la interrupcion de una conexion existente por el host remoto." + ), + -3: "Error, The barcode of the shipment already exists.", + -33: """Error, Various reasons: + Cp destino no existe o no es de esa plaza + El reembolso debe ser mayor o igual a 0 + Este contrato de valija no existe/esta dado de baja + Formato de codigo de barras no reconocido + Fecha expedición anterior a hoy + Los bultos no pueden ser 0 o negativos + No estas autorizado a grabar envíos de ese cliente + Sin tienda ps y horario ps + El servicio / horario es incorrecto""", + -48: "Error, EuroEstandar/EBP service: the number of parcels should always be 1.", + -49: "Error, EuroEstandar/EBP service: weight should be <= 31.5 kgs ().", + -50: "Error, EuroEstandar/EBP service: there can be no RCS (return stamped copy).", + -51: "Error, EuroEstandar/EBP service: there can be no SWAP ().", + -52: ( + "Error, EuroEstandar/EBP service:" + "reported a country that is not included on the service." + ), + -53: ( + "Error, EuroEstandar/EBP service:" + "agency is not authorized to insert EuroEstandar/EBP service." + ), + -54: ( + "Error, EuroEstandar/EBP service:" + "The consignee mail address is required (.)." + ), + -55: ( + "Error, EuroEstandar/EBP service:" + "The consignee mobile phone is required (.)." + ), + -57: ( + "Error, EuroEstandar/EBP service:" + "reported a country that is not included on the service (.)." + ), + -69: "Error, I can not Channeling, wrong consignee zipcode.", + -70: "Error, The order number already exists to this date and customer code.", + -80: "EuroBusiness shipments. A mandatory field is missing.", + -81: "EuroBusiness shipments. A wrong format is transmitted in field.", + -82: ( + "EuroBusiness shipments." + "Wrong zipcode /wrong country code." + "Error in zip code or its format, " + "and maybe a bad combination of city and zip code." + ), + -83: ( + "EuroBusiness shipments." + "GLS internal error." + "No free parcel number is available within the range." + ), + -84: ( + "EuroBusiness shipments." + "GLS internal error." + "A parameter is missing within the configuration file of the UNI-BOX." + ), + -85: "EuroBusiness shipments. Is not able to make the routing.", + -86: ( + "EuroBusiness shipments." + "GLS internal error." + "A needed template-file cannot be found or opened." + ), + -87: "EuroBusiness shipments. GLS internal error. Duplicated sequence.", + -88: "EuroBusiness shipments. Other errors.", + -96: "Error, EBP service: Sequential error.", + -97: ( + "Error, EuroEstandar/EBP service:" + " can't be 'D', can't be > 0." + ), + -99: "Warning, Webservices are temporarily out of service.", + -103: "Error, plaza solicita es null (alta).", + -104: "Error, plaza origen es null (alta).", + -106: "Error, CodCli es null (alta).", + -107: "Error, CodCliRed es null (alta).", + -108: "Error, Sender Name must be at least three characters.", + -109: "Error, Sender Address must be at least three characters.", + -110: "Error, Sender City must be at least three characters.", + -111: "Error, Sender Zipcode must be at least four characters.", + -117: "Error, los locales solo en la plaza de origen para la web.", + -118: "Error, customer reference is duplicated.", + -119: "Error, exception, uncontrolled error.", + -128: "Error, Consignee Name must be at least three characters.", + -129: "Error, Consignee Address must be at least three characters.", + -130: "Error, Consignee City must be at least three characters.", + -131: "Error, Consignee Zipcode must be at least four characters.", + -6565: "Error, Volume is incorrect, remember that the unit is m3.", +} + +GLS_PICKUP_ERROR_CODES = { + -1: "Connection exception", + -103: "Impossible get the requesting agency", + -104: "Impossible get the origin agency.", + -105: "Collection date is empty o not informed.", + -106: "Impossible get the customer code (CodCli).", + -107: "Impossible get the CodCliRed.", + -108: "Collection name is empty or not informed.", + -109: "Collection Address name is empty or not informed.", + -110: "Collection City name is empty or not informed.", + -111: "Collection Zipcode is empty or not informed.", + -112: "Codsolicitud of agency is not valid.", + -113: "Generic zipcodes are not allowed.", + -114: "Collection interval must be greater than 2 hours.", + -115: "Minimum collection time is 8h.", + -116: "Maximum collection time is 22h.", + -117: "Los locales solo en la plaza de origen para la web.", + -118: "Customer reference is duplicated.", + -119: "Zonzoo no puede recoger en islas Portugal.", + -120: "Zipcode of consignee is incorrect.", + -122: "Login not exists or is deleted.", + -123: "Don't have permissions to insert on this agency.", + -125: "Can not ask a collect on festive.", + -126: ( + "When country is not Spain (34) the Phone and Celullar are mandatory" + "(tags and inside )." + ), + -128: ( + "It is mandatory to inform the Telephone or Email " + "where GLS must to collect (., . " + "or .)." + ), + -303: "Currency amounts must be allways greater than 0.", + -402: ( + "If Amount of insured goods > 0 (in Seguro), " + "then tipo and descripcion are mandatory." + ), + -504: ( + "Impossible get the last mile agency, " + "probably the consignee zipcode is wrong or not exists." + ), + -505: "Consignee name is not informed.", + -506: "Consignee address is not informed.", + -507: "Consignee city is not informed.", + -508: "Consignee zipcode is not informed.", + -602: "The reference must be informed.", + -603: "Shipment References, tipo not exists.", + -676: "Collection Zipcode is wrong, not exists.", +} + +GLS_TRACKING_LINKS = { + "ASM": ( + "http://www.asmred.com/extranet/public/ExpedicionASM.aspx?codigo={}&cpDst={}" + ), + "INT": ( + "https://www.gls-spain.es/en/receiving-parcels/shipping-tracking/" + "?match={}&international=1" + ), + "INT_PT": ( + "https://www.gls-portugal.pt/pt/seguimiento-envio/?match={}&international=1" + ), +} diff --git a/delivery_gls_asm/models/gls_asm_request.py b/delivery_gls_asm/models/gls_asm_request.py new file mode 100644 index 00000000000..d84e54d5d8b --- /dev/null +++ b/delivery_gls_asm/models/gls_asm_request.py @@ -0,0 +1,490 @@ +# Copyright 2020 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import binascii +import logging +import os + +from odoo import _ +from odoo.exceptions import UserError + +from .gls_asm_master_data import GLS_PICKUP_ERROR_CODES, GLS_SHIPMENT_ERROR_CODES + +_logger = logging.getLogger(__name__) + +try: + from suds.client import Client + from suds.sax.text import Raw + from suds.sudsobject import asdict +except (ImportError, IOError) as err: + _logger.debug(err) + + +class GlsAsmRequest: + """Interface between GLS-ASM SOAP API and Odoo recordset + Abstract GLS-ASM API Operations to connect them with Odoo + + Not all the features are implemented, but could be easily extended with + the provided API. We leave the operations empty for future. + """ + + def __init__(self, uidcustomer=None): + """As the wsdl isn't public, we have to load it from local""" + wsdl_path = os.path.join( + os.path.dirname(os.path.realpath(__file__)), "../api/gls_asm_api.wsdl" + ) + self.uidcustomer = uidcustomer or "" + self.client = Client("file:{}".format(wsdl_path)) + + def _recursive_asdict(self, suds_object): + """As suds response is an special object, we convert it into + a more usable python dict. Taken form: + https://stackoverflow.com/a/15678861 + """ + out = {} + for k, v in asdict(suds_object).items(): + if hasattr(v, "__keylist__"): + out[k] = self._recursive_asdict(v) + elif isinstance(v, list): + out[k] = [] + for item in v: + if hasattr(item, "__keylist__"): + out[k].append(self._recursive_asdict(item)) + else: + out[k].append(item) + else: + out[k] = v + return out + + def _prepare_cancel_shipment_docin(self, **kwargs): + """ASM API is not very standard. Prepare parameters to pass them raw in + the SOAP message""" + return """ + + + + """.format( + **kwargs + ) + + def _prepare_cancel_pickup_docin(self, **kwargs): + return """ + + + + """.format( + **kwargs + ) + + def _prepare__get_manifest_docin(self, **kwargs): + """ASM API is not very standard. Prepare parameters to pass them raw in + the SOAP message""" + return """ + + {date_from} + + + """.format( + **kwargs + ) + + def _prepare_send_shipping_docin(self, **kwargs): + """ASM API is not very standard. Prepare parameters to pass them raw in + the SOAP message""" + return """ + + + {fecha} + {portes} + {servicio} + {horario} + {bultos} + {peso} + {volumen} + {declarado} + {dninomb} + {fechaentrega} + {retorno} + {pod} + {podobligatorio} + + {remite_plaza} + {remite_nombre} + {remite_direccion} + {remite_poblacion} + {remite_provincia} + {remite_pais} + {remite_cp} + {remite_telefono} + {remite_movil} + {remite_email} + {remite_departamento} + {remite_nif} + {remite_observaciones} + + + {destinatario_codigo} + {destinatario_plaza} + {destinatario_nombre} + {destinatario_direccion} + {destinatario_poblacion} + {destinatario_provincia} + {destinatario_pais} + {destinatario_cp} + {destinatario_telefono} + {destinatario_movil} + {destinatario_email} + + {destinatario_observaciones} + + {destinatario_att} + {destinatario_departamento} + {destinatario_nif} + + + {referencia_c} + {referencia_0} + + + {importes_debido} + {importes_reembolso} + + + {seguro_descripcion} + {seguro_importe} + + + + + + + + + {cliente_codigo} + {cliente_plaza} + {cliente_agente} + + + + """.format( + **kwargs + ) + + def _prepare_send_pickup_docin(self, **kwargs): + """ASM API is not very standard. Prepare parameters to pass them raw in + the SOAP message""" + return """ + + + + + + + + + {remite_nombre} + {remite_direccion} + {remite_poblacion} + {remite_provincia} + {remite_pais} + {remite_cp} + {remite_telefono} + {remite_movil} + {remite_email} + + + + + {fechaentrega} + {portes} + {servicio} + {horario} + {bultos} + {peso} + + {destinatario_nombre} + {destinatario_direccion} + {destinatario_poblacion} + {destinatario_provincia} + {destinatario_pais} + {destinatario_cp} + {destinatario_telefono} + {destinatario_movil} + {destinatario_email} + {observaciones} + + + + + {referencia_c} + {referencia_a} + + + + """.format( + **kwargs + ) + + def _send_shipping(self, vals): + """Create new shipment + :params vals dict of needed values + :returns dict with GLS response containing the shipping codes, labels, + an other relevant data + """ + vals.update({"uidcustomer": self.uidcustomer}) + xml = Raw(self._prepare_send_shipping_docin(**vals)) + _logger.debug(xml) + try: + res = self.client.service.GrabaServicios(docIn=xml) + except Exception as e: + raise UserError( + _( + "No response from server recording GLS delivery %(ref).\n" + "Traceback:\n%(error)" + ) + % {"ref": vals.get("referencia_c", ""), "error": e} + ) from e + # Convert result suds object to dict and set the root conveniently + # GLS API Errors have codes below 0 so we have to + # convert to int as well + res = self._recursive_asdict(res)["Servicios"]["Envio"] + res["gls_sent_xml"] = xml + _logger.debug(res) + res["_return"] = int(res["Resultado"]["_return"]) + if res["_return"] < 0: + raise UserError( + _( + "GLS returned an error trying to record the shipping for %(ref).\n" + "Error:\n%(error)" + ) + % { + "ref": vals.get("referencia_c", ""), + "error": GLS_SHIPMENT_ERROR_CODES.get( + res["_return"], res["_return"] + ), + } + ) + if res.get("Etiquetas", {}).get("Etiqueta", {}).get("value"): + res["gls_label"] = binascii.a2b_base64( + res["Etiquetas"]["Etiqueta"]["value"] + ) + return res + + def _send_pickup(self, vals): + """Create new pickup + :params vals dict of needed values + :returns dict with GLS response containing the shipping codes, labels, + an other relevant data + """ + vals.update({"uidcustomer": self.uidcustomer}) + xml = Raw(self._prepare_send_pickup_docin(**vals)) + _logger.debug(xml) + try: + res = self.client.service.GrabaServicios(docIn=xml) + except Exception as e: + raise UserError( + _( + "No response from server recording GLS delivery %(ref).\n" + "Traceback:\n%(error)" + ) + % {"ref": vals.get("referencia_c", ""), "error": e} + ) from e + # Convert result suds object to dict and set the root conveniently + # GLS API Errors have codes below 0 so we have to + # convert to int as well + res = self._recursive_asdict(res)["Servicios"]["Recogida"] + res["gls_sent_xml"] = xml + _logger.debug(res) + res["_return"] = int(res["Resultado"]["_return"]) + if res["_return"] < 0: + raise UserError( + _( + "GLS returned an error trying to record the shipping for %(ref).\n" + "Error:\n%(error)" + ) + % { + "ref": vals.get("referencia_c", ""), + "error": GLS_PICKUP_ERROR_CODES.get(res["_return"], res["_return"]), + } + ) + return res + + def _get_delivery_info(self, reference=False): + """Get delivery info recorded in GLS for the given reference + :param str reference -- GLS tracking number + :returns: shipping info dict + """ + try: + res = self.client.service.GetExpCli(codigo=reference, uid=self.uidcustomer) + _logger.debug(res) + except Exception as e: + raise UserError( + _( + "GLS: No response from server getting state from ref %(ref).\n" + "Traceback:\n%(error)" + ) + % {"ref": reference, "error": e} + ) from e + res = self._recursive_asdict(res) + return res + + def _get_pickup_info(self, reference=False): + xml = Raw( + """ + + + + """.format( + uidcustomer=self.uidcustomer, codrecogida=reference + ) + ) + res = self.client.service.Tracking(docIn=xml) + _logger.debug(res) + return self._recursive_asdict(res) + + def _get_tracking_states(self, reference=False): + """Get just tracking states from GLS info for the given reference + :param str reference -- GLS tracking number + :returns: list of tracking states + """ + res = self._get_delivery_info(reference) + res = (res.get("expediciones") or {}).get("exp", {}) + return res + + def _get_pickup_tracking_states(self, reference=False): + res = self._get_pickup_info(reference) + res = ( + res.get("Servicios", {}) + .get("Recogida", {}) + .get("Tracking", {}) + .get("TrackingCliente", {}) + ) + # If there's just one state, we'll get a single dict, otherwise we + # get a list of dicts + if isinstance(res, dict): + return [res] + return res + + def _shipping_label(self, reference=False): + """Get shipping label for the given ref + :param str reference -- public shipping reference + :returns: base64 with pdf label or False + """ + try: + res = self.client.service.EtiquetaEnvio(reference, "PDF") + _logger.debug(res) + except Exception as e: + raise UserError( + _( + "GLS: No response from server printing label with ref %(ref).\n" + "Traceback:\n%(error)" + ) + % {"ref": reference, "error": e} + ) from e + res = self._recursive_asdict(res) + label = res.get("base64Binary") + return label and binascii.a2b_base64(str(label[0])) + + def _cancel_shipment(self, reference=False): + """Cancel shipment for a given reference + :param str reference -- shipping reference to cancel + :returns: dict -- result of operation with format + { + 'value': str - response message, + '_return': int - response status + } + Possible response values: + 0 -> Expedición anulada + -1 -> No existe envío + -2 -> Tiene tracking operativo + """ + xml = Raw( + self._prepare_cancel_shipment_docin( + uidcustomer=self.uidcustomer, referencia=reference + ) + ) + _logger.debug(xml) + try: + response = self.client.service.Anula(docIn=xml) + _logger.debug(response) + except Exception as e: + _logger.error( + "No response from server canceling GLS ref {}.\n" + "Traceback:\n{}".format(reference, e) + ) + return {} + response = self._recursive_asdict(response.Servicios.Envio.Resultado) + response["gls_sent_xml"] = xml + response["_return"] = int(response["_return"]) + return response + + def _cancel_pickup(self, reference=False): + """Cancel shipment for a given reference + :param str reference -- shipping reference to cancel + :returns: dict -- result of operation with format + { + 'value': str - response message, + '_return': int - response status + } + Possible response values: + 0 -> Recogida anulada + -1 -> No existe recogida + -2 -> Tiene tracking operativo + """ + xml = Raw( + self._prepare_cancel_pickup_docin( + uidcustomer=self.uidcustomer, referencia=reference + ) + ) + _logger.debug(xml) + try: + response = self.client.service.Anula(docIn=xml) + _logger.debug(response) + except Exception as e: + _logger.error( + "No response from server canceling GLS ref {}.\n" + "Traceback:\n{}".format(reference, e) + ) + return {} + response = self._recursive_asdict(response.Servicios.Recogida.Resultado) + response["gls_sent_xml"] = xml + response["_return"] = int(response["_return"]) + return response + + def _get_manifest(self, date_from): + """Get shipping manifest for a given range date + :param str date_from -- date in format "%d/%m&Y" + :returns: list of dicts with format + { + 'codplaza_pag': 771, 'codcli': 601, 'cliente': Pruebas WS + 'codplaza_org': 771, 'codexp': 468644476, 'codservicio': 74, + 'servicio': EUROBUSINESS PARCEL, 'codhorario': 3, + 'horario': BusinessParcel, 'codestado': -10, 'estado': GRABADO, + 'bultos': 1, 'kgs': 7,0, 'nombre_dst': TEST USER, + 'calle_dst': direccion, 'localidad_dst': Fontenay-Trésigny, + 'cp_dst': 77610, 'departamento_dst': , 'pais_dst': FR, + } + """ + xml = Raw( + self._prepare__get_manifest_docin( + uidcustomer=self.uidcustomer, date_from=date_from + ) + ) + _logger.debug(xml) + try: + res = self.client.service.GetManifiesto(docIn=xml) + _logger.debug(res) + except Exception as e: + raise UserError( + _( + "No response from server getting manifisto for GLS.\n" + "Traceback:\n%(error)" + ) + % {"error": e} + ) from e + res = self._recursive_asdict(res.Servicios.Envios).get("Envio", []) + return res diff --git a/delivery_gls_asm/models/stock_picking.py b/delivery_gls_asm/models/stock_picking.py new file mode 100644 index 00000000000..545ae67ab53 --- /dev/null +++ b/delivery_gls_asm/models/stock_picking.py @@ -0,0 +1,103 @@ +# Copyright 2020 Tecnativa - David Vidal +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, fields, models + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + # ASM API has two references for each delivery. This one is needed + # for some operations like getting the label + gls_asm_public_tracking_ref = fields.Char( + string="GLS Barcode", readonly=True, copy=False + ) + gls_asm_picking_ref = fields.Char( + string="GLS Picking Reference", readonly=True, copy=False + ) + gls_carrier_is_pickup_service = fields.Boolean( + related="carrier_id.gls_is_pickup_service" + ) + gls_pickup_state = fields.Selection( + string="Estado recogida GLS", + selection=[ + ("recorded", "Solicitada"), + ("received", "Recibida"), + ("assigned", "Asignada"), + ("picked_up_customer", "Recogido en Cliente"), + ("picked_up_agency", "Recepcionada en Agencia"), + ("done", "Realizada con éxito"), + ("not_done", "No Realizada"), + ("incidence", "Realizada con Incidencia"), + ("cancel", "Anulada"), + ("preconfirm", "A preconfirmar"), + ("pending", "Pendiente Gestión"), + ("closed", "Cerrado"), + ("pending_auth", "Pending Autorización"), + ("closed_final", "Cerrado Definitivo"), + ], + copy=False, + ) + gls_shipment_state = fields.Selection( + string="Estado envío GLS", + selection=[ + ("recorded", "Grabado"), + ("manifested", "Manifestada"), + ("transit", "En tránsito al destino"), + ("agency_transit", "En delegación destino"), + ("closed", "Cerrado por siniestro"), + ("cancel", "Anualada"), + ("shipping", "En reparto"), + ("delivered", "Entregado"), + ("partially_delivered", "Entrega parcial"), + ("warehouse", "Almacenado"), + ("return_agency", "Devuelta"), + ("pending", "Pendiente datos en delegación"), + ("held", "Pendiente autorización"), + ("incidence", "Con incidencia"), + ("closed_final", "Cerrado definitivo"), + ("preconfirmed", "Preconfirmada enrega"), + ("cancel_returned", "Entrega anulada (devuelta)"), + ("return_customer", "Devuelta al cliente"), + ("possible_return", "Posible devolución"), + ("requested_return", "Solicitud de devolución"), + ("returning", "En devolución"), + ("origin", "En delegación origen"), + ("destroyed", "Destruido por orden del cliente"), + ("held_order", "Retenido por orden de paga"), + ("in_platform", "En plataforma de destino"), + ("extinguished", "Recanalizada (A extinguir)"), + ("parcelshop", "Entregado en ASM PARCELSHOP"), + ("parcelshop_confirm", "ASM PARCELSHOP CONFIRMA RECEPCIÓN"), + ], + copy=False, + ) + + def gls_asm_get_label(self): + """Get GLS Label for this picking expedition""" + self.ensure_one() + if self.delivery_type != "gls_asm" or not self.gls_asm_public_tracking_ref: + return + pdf = self.carrier_id.gls_asm_get_label(self.gls_asm_public_tracking_ref) + label_name = "gls_{}.pdf".format(self.gls_asm_public_tracking_ref) + self.message_post( + body=(_("GLS label for %s") % self.gls_asm_public_tracking_ref), + attachments=[(label_name, pdf)], + ) + + def gls_asm_send_pickup(self): + self.ensure_one() + if self.delivery_type != "gls_asm" or not self.carrier_id.gls_is_pickup_service: + return + res = self.carrier_id.gls_asm_send_pickup(self)[0] + if res.get("tracking_number", ""): + self.carrier_tracking_ref = res["tracking_number"] + msg = _( + ( + "Request sent to carrier %(carrier_name)s for pick-up with" + " tracking number %(ref)s" + ), + carrier_name=self.carrier_id.name, + ref=self.carrier_tracking_ref, + ) + self.message_post(body=msg) + self.carrier_id.gls_asm_tracking_state_update(picking=self) diff --git a/delivery_gls_asm/readme/CONFIGURE.rst b/delivery_gls_asm/readme/CONFIGURE.rst new file mode 100644 index 00000000000..bfad09825f2 --- /dev/null +++ b/delivery_gls_asm/readme/CONFIGURE.rst @@ -0,0 +1,14 @@ +Para configurar el transportista: + +#. Vaya a *Inventario > Configuración > Entrega > Método de envío* y cree uno + nuevo. +#. Escoja *GLS ASM* Como proveedor. +#. Configure los datos de servicio que tiene contratados y el producto de + envío que desea utilizar. + +Si no tiene credenciales todavía, puede poner datos inventados y dejar el +método de envío en "Entorno de prueba". Se utilizará el usuario de pruebas de +la API GLS ASM. + +Si GLS cambiase en un futuro el usuario de prueba, puede cambiarlo en los +*Parámetros del sistema* en la clave `delivery_gls_asm.api_user_demo`. diff --git a/delivery_gls_asm/readme/CONTRIBUTORS.rst b/delivery_gls_asm/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..b9ee4e6b8da --- /dev/null +++ b/delivery_gls_asm/readme/CONTRIBUTORS.rst @@ -0,0 +1,8 @@ +* `Tecnativa `_: + + * David Vidal + * Víctor Martínez + +* `Studio73 `_: + + * Ethan Hildick diff --git a/delivery_gls_asm/readme/DESCRIPTION.rst b/delivery_gls_asm/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..1228d7570de --- /dev/null +++ b/delivery_gls_asm/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +Este módulo integra la API de GLS España (antigua API de ASM) con Odoo. No es +válido para integraciones de GLS en otros países, que podrían usar otras APIs. diff --git a/delivery_gls_asm/readme/INSTALL.rst b/delivery_gls_asm/readme/INSTALL.rst new file mode 100644 index 00000000000..8a5c693cc9b --- /dev/null +++ b/delivery_gls_asm/readme/INSTALL.rst @@ -0,0 +1,6 @@ +Este módulo necesita la librería python `suds-py3` y depende igualmente de los +módulos de OCA/delivery-carrier `delivery_package_number` y `delivery_state`. + +La API de GLS/ASM no provee métodos de cálculo de precio, de modo que para poder +calcular los costes de envío sería recomendable instalar el módulo +`delivery_price_method`. diff --git a/delivery_gls_asm/readme/ROADMAP.rst b/delivery_gls_asm/readme/ROADMAP.rst new file mode 100644 index 00000000000..7a2e7416179 --- /dev/null +++ b/delivery_gls_asm/readme/ROADMAP.rst @@ -0,0 +1,4 @@ +* La API no facilita métodos para cotizar el coste real de los envíos, por lo + que siempre se cotizan a 0. Si la cotización de envíos es necesaria, + puede instalarse el módulo OCA `delivery_price_method` o bien personalizar + el método de cotización para este tipo de transportista. diff --git a/delivery_gls_asm/readme/USAGE.rst b/delivery_gls_asm/readme/USAGE.rst new file mode 100644 index 00000000000..02f1ffc67c8 --- /dev/null +++ b/delivery_gls_asm/readme/USAGE.rst @@ -0,0 +1,75 @@ +Estas son las distintas operaciones posibles con este módulo: + +Grabar servicios +~~~~~~~~~~~~~~~~ + + #. Al confirmar el albarán, el servicio se grabará en GLS. + #. Con la respuesta, se registrará en el chatter la referencia de envío y + las etiquetas correspondientes. + #. Para gestionar los bultos del envío, se puede utilizar el campo de número + de bultos que añade `delivery_package_number` (ver el README para mayor + información) o bien el flujo nativo de Odoo con paquetes de envío. El + módulo mandará a la API de GLS/ASM el número correspondiente y podremos + descargar las etiquetas en PDF con su correspondiente numeración. + +Pedir recogidas +~~~~~~~~~~~~~~~ + + #. Al confirmar el albarán con un servicio de recogida, + el envío NO se grabará en GLS. + #. Aparecerá un botón de "Enviar recogida" en la parte superior para solicitarlo + #. Con la respuesta, se registrará en el chatter la referencia de envío + #. Para gestionar los bultos del envío, se puede utilizar el campo de número + de bultos que añade `delivery_package_number` (ver el README para mayor + información) o bien el flujo nativo de Odoo con paquetes de envío. + +Cancelar servicios +~~~~~~~~~~~~~~~~~~ + + #. Al igual que en otros métodos de envío, en los albaranes de salida podemos + cancelar un servicio determinado mediante la acción correspondiente en la + pestaña de *Información Adicional*, sección *Información de entrega* una + vez el pedido esté confirmado y la expedición generada. + #. Podremos generar una nueva expedición una vez cancelado si fuese necesario. + +Obtener etiquetas +~~~~~~~~~~~~~~~~~~ + + #. Si por error hubiésemos eliminado el adjunto de las etiquetas que obtuvimos + en la grabación del servicio, podemos obtenerlas de nuevo pulsando en el + botón "Etiqueta GLS" que tenemos en la parte superior de la vista + formulario del albarán. + +Seguimiento de envíos +~~~~~~~~~~~~~~~~~~~~~ + + #. El módulo está integrado con `delivery_state` para poder recabar la + información de seguimiento de nuestros envíos directamente desde la API de + GLS-ASM. + #. Para ello, vaya al albarán con un envío GLS ya grabado y en la pestaña de + *Información adicional* verá el botón *Actualizar seguimiento* para pedir + a la API de GLS que actualice el estado de este envío en Odoo. + +Manifiesto de envíos +~~~~~~~~~~~~~~~~~~~~ + + #. Para obtener el manifiesto de expediciones que firmaría el repartidor, + puede ir al menú *Inventario > Informes > Manifiesto de Envíos GLS*. + #. También puede obtener el manifiesto desde un smart button en el formulario + del transportista. + #. En el asistente, seleccione el servicio GLS del cual quiere sacar el + manifiesto y la fecha desde la que desea listar los envíos. + #. Pulse en el botón "Manifiesto GLS" para obtener un listado en PDF de los + envíos del servicio seleccionado. + +Depuración de errores +~~~~~~~~~~~~~~~~~~~~~ + + #. Es importante tener en cuenta que solo funcionará con códigos postales de + España. + #. En cada servicio GLS-ASM dispone de una pestaña llamada "Técnico" en la + que puede consultar la última petición y respuesta a la API de GLS-ASM. + Esto le servirá como ayuda a la hora de depurar posibles errores de + comunicación. + #. También puede activar Odoo con `--log-level=debug` para registrar las + peticiones y las respuestas en el log. diff --git a/delivery_gls_asm/security/ir.model.access.csv b/delivery_gls_asm/security/ir.model.access.csv new file mode 100644 index 00000000000..d4dac9564d7 --- /dev/null +++ b/delivery_gls_asm/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_gls_asm_manifest_wizard_user,gls.asm.manifest.wizard.user,model_gls_asm_minifest_wizard,base.group_user,1,1,1,1 diff --git a/delivery_gls_asm/static/description/icon.png b/delivery_gls_asm/static/description/icon.png new file mode 100644 index 00000000000..84c81ec4242 Binary files /dev/null and b/delivery_gls_asm/static/description/icon.png differ diff --git a/delivery_gls_asm/static/description/icon.svg b/delivery_gls_asm/static/description/icon.svg new file mode 100644 index 00000000000..bca2a61d9dd --- /dev/null +++ b/delivery_gls_asm/static/description/icon.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + diff --git a/delivery_gls_asm/static/description/index.html b/delivery_gls_asm/static/description/index.html new file mode 100644 index 00000000000..eaee879443c --- /dev/null +++ b/delivery_gls_asm/static/description/index.html @@ -0,0 +1,575 @@ + + + + + + +Delivery GLS-ASM + + + +
+

Delivery GLS-ASM

+ + +

Beta License: AGPL-3 OCA/l10n-spain Translate me on Weblate Try me on Runbot

+

Este módulo integra la API de GLS España (antigua API de ASM) con Odoo. No es +válido para integraciones de GLS en otros países, que podrían usar otras APIs.

+

Table of contents

+ +
+

Installation

+

Este módulo necesita la librería python suds-py3 y depende igualmente de los +módulos de OCA/delivery-carrier delivery_package_number y delivery_state.

+

La API de GLS/ASM no provee métodos de cálculo de precio, de modo que para poder +calcular los costes de envío sería recomendable instalar el módulo +delivery_price_method.

+
+
+

Configuration

+

Para configurar el transportista:

+
    +
  1. Vaya a Inventario > Configuración > Entrega > Método de envío y cree uno +nuevo.
  2. +
  3. Escoja GLS ASM Como proveedor.
  4. +
  5. Configure los datos de servicio que tiene contratados y el producto de +envío que desea utilizar.
  6. +
+

Si no tiene credenciales todavía, puede poner datos inventados y dejar el +método de envío en “Entorno de prueba”. Se utilizará el usuario de pruebas de +la API GLS ASM.

+

Si GLS cambiase en un futuro el usuario de prueba, puede cambiarlo en los +Parámetros del sistema en la clave delivery_gls_asm.api_user_demo.

+
+
+

Usage

+

Estas son las distintas operaciones posibles con este módulo:

+
+

Grabar servicios

+
+
    +
  1. Al confirmar el albarán, el servicio se grabará en GLS.
  2. +
  3. Con la respuesta, se registrará en el chatter la referencia de envío y +las etiquetas correspondientes.
  4. +
  5. Para gestionar los bultos del envío, se puede utilizar el campo de número +de bultos que añade delivery_package_number (ver el README para mayor +información) o bien el flujo nativo de Odoo con paquetes de envío. El +módulo mandará a la API de GLS/ASM el número correspondiente y podremos +descargar las etiquetas en PDF con su correspondiente numeración.
  6. +
+
+
+
+

Pedir recogidas

+
+
    +
  1. Al confirmar el albarán con un servicio de recogida, +el envío NO se grabará en GLS.
  2. +
  3. Aparecerá un botón de “Enviar recogida” en la parte superior para solicitarlo
  4. +
  5. Con la respuesta, se registrará en el chatter la referencia de envío
  6. +
  7. Para gestionar los bultos del envío, se puede utilizar el campo de número +de bultos que añade delivery_package_number (ver el README para mayor +información) o bien el flujo nativo de Odoo con paquetes de envío.
  8. +
+
+
+
+

Cancelar servicios

+
+
    +
  1. Al igual que en otros métodos de envío, en los albaranes de salida podemos +cancelar un servicio determinado mediante la acción correspondiente en la +pestaña de Información Adicional, sección Información de entrega una +vez el pedido esté confirmado y la expedición generada.
  2. +
  3. Podremos generar una nueva expedición una vez cancelado si fuese necesario.
  4. +
+
+
+
+

Obtener etiquetas

+
+
    +
  1. Si por error hubiésemos eliminado el adjunto de las etiquetas que obtuvimos +en la grabación del servicio, podemos obtenerlas de nuevo pulsando en el +botón “Etiqueta GLS” que tenemos en la parte superior de la vista +formulario del albarán.
  2. +
+
+
+
+

Seguimiento de envíos

+
+
    +
  1. El módulo está integrado con delivery_state para poder recabar la +información de seguimiento de nuestros envíos directamente desde la API de +GLS-ASM.
  2. +
  3. Para ello, vaya al albarán con un envío GLS ya grabado y en la pestaña de +Información adicional verá el botón Actualizar seguimiento para pedir +a la API de GLS que actualice el estado de este envío en Odoo.
  4. +
+
+
+
+

Manifiesto de envíos

+
+
    +
  1. Para obtener el manifiesto de expediciones que firmaría el repartidor, +puede ir al menú Inventario > Informes > Manifiesto de Envíos GLS.
  2. +
  3. También puede obtener el manifiesto desde un smart button en el formulario +del transportista.
  4. +
  5. En el asistente, seleccione el servicio GLS del cual quiere sacar el +manifiesto y la fecha desde la que desea listar los envíos.
  6. +
  7. Pulse en el botón “Manifiesto GLS” para obtener un listado en PDF de los +envíos del servicio seleccionado.
  8. +
+
+
+
+

Depuración de errores

+
+
    +
  1. Es importante tener en cuenta que solo funcionará con códigos postales de +España.
  2. +
  3. En cada servicio GLS-ASM dispone de una pestaña llamada “Técnico” en la +que puede consultar la última petición y respuesta a la API de GLS-ASM. +Esto le servirá como ayuda a la hora de depurar posibles errores de +comunicación.
  4. +
  5. También puede activar Odoo con –log-level=debug para registrar las +peticiones y las respuestas en el log.
  6. +
+
+
+
+
+

Known issues / Roadmap

+
    +
  • La API no facilita métodos para cotizar el coste real de los envíos, por lo +que siempre se cotizan a 0. Si la cotización de envíos es necesaria, +puede instalarse el módulo OCA delivery_price_method o bien personalizar +el método de cotización para este tipo de transportista.
  • +
+
+
+

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

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainers:

+

chienandalu hildickethan-S73

+

This module is part of the OCA/l10n-spain project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/delivery_gls_asm/tests/__init__.py b/delivery_gls_asm/tests/__init__.py new file mode 100644 index 00000000000..40bbcefad4c --- /dev/null +++ b/delivery_gls_asm/tests/__init__.py @@ -0,0 +1 @@ +from . import test_delivery_gls_asm diff --git a/delivery_gls_asm/tests/test_delivery_gls_asm.py b/delivery_gls_asm/tests/test_delivery_gls_asm.py new file mode 100644 index 00000000000..5fcdbddfa41 --- /dev/null +++ b/delivery_gls_asm/tests/test_delivery_gls_asm.py @@ -0,0 +1,75 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +# Copyright 2020 Tecnativa - David Vidal +# Copyright 2021 Tecnativa - Víctor Martínez +import time + +from odoo.exceptions import UserError +from odoo.tests import Form, common + + +class TestDeliveryGlsAsm(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.shipping_product = cls.env["product.product"].create( + {"type": "service", "name": "Test Shipping costs", "list_price": 10.0} + ) + cls.carrier_gls_asm = cls.env["delivery.carrier"].create( + { + "name": "GLS ASM", + "delivery_type": "gls_asm", + "product_id": cls.shipping_product.id, + "prod_environment": False, + } + ) + cls.product = cls.env["product.product"].create( + {"type": "product", "name": "Test product"} + ) + cls.partner = cls.env["res.partner"].create( + { + "name": "Mr. Odoo & Co.", + "city": "Odoo Ville", + "zip": "28001", + "street": "Calle de La Rua, 3", + } + ) + order_form = Form(cls.env["sale.order"].with_context(tracking_disable=True)) + order_form.partner_id = cls.partner + with order_form.order_line.new() as line: + line.product_id = cls.product + line.product_uom_qty = 20.0 + cls.sale_order = order_form.save() + cls.sale_order.carrier_id = cls.carrier_gls_asm.id + cls.sale_order.action_confirm() + cls.picking = cls.sale_order.picking_ids + cls.picking.move_lines.quantity_done = 20 + + def test_01_gls_picking_confirm_simple(self): + """The picking is confirm and the shipping is recorded to GLS""" + # GLS API prevents duplicated references so in order to test we need a + # unique key that doesn't collide with any CI around, as every test really + # records an expedition + self.picking.name = "ODOO-TEST-{}".format(time.time()) + with self.assertRaises(UserError): + self.picking.button_validate() + self.picking.name = "ODOO-{}".format(int(time.time())) + self.picking.button_validate() + self.assertTrue(self.picking.carrier_tracking_ref) + self.assertTrue(self.picking.gls_asm_public_tracking_ref) + self.picking.cancel_shipment() + self.assertFalse(self.picking.carrier_tracking_ref) + self.assertFalse(self.picking.gls_asm_public_tracking_ref) + + def test_02_gls_manifest(self): + """API work although without data""" + wizard = self.env["gls.asm.minifest.wizard"].create( + {"carrier_id": self.carrier_gls_asm.id, "date_from": "2050-05-31"} + ) + with self.assertRaises(UserError): + wizard.get_manifest() + + def test_03_gls_escaping(self): + """We must ensure that the values we'll be putting into the XML are + properly escaped""" + vals = self.carrier_gls_asm._prepare_gls_asm_shipping(self.picking) + self.assertEqual(vals.get("destinatario_nombre"), "Mr. Odoo & Co.") diff --git a/delivery_gls_asm/views/delivery_asm_view.xml b/delivery_gls_asm/views/delivery_asm_view.xml new file mode 100644 index 00000000000..a7543cfb311 --- /dev/null +++ b/delivery_gls_asm/views/delivery_asm_view.xml @@ -0,0 +1,50 @@ + + + + + delivery.carrier + + + + + + + + + + + + + + + + + +