Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MIG] delivery_seur: Migration to 14.0 #2290

Closed
wants to merge 37 commits into from
Closed
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
425722b
[ADD] delivery_seur
rlizana Jul 4, 2020
1bd82d2
[UPD] Update delivery_seur.pot
oca-travis Jul 28, 2020
af2dce7
Update translation files
oca-transbot Jul 30, 2020
a6403f2
[UPD] delivery_seur: replace field weight to shipping_weight for send…
rlizana Aug 11, 2020
877fb2b
[UPD] Update delivery_seur.pot
oca-travis Aug 12, 2020
5d46cf6
Update translation files
oca-transbot Aug 12, 2020
d3ae909
[UPD] Update delivery_seur.pot
oca-travis Aug 13, 2020
85ec353
Update translation files
oca-transbot Aug 13, 2020
47a1da4
[FIX] delivery_seur: Cash on Delivery value
chienandalu Sep 9, 2020
0975466
[FIX] delivery_seur: pesoBulto
chienandalu Sep 15, 2020
e6fb4f1
[IMP] delivery_seur: improve traceability and error catch
chienandalu Sep 15, 2020
bf1f607
[FIX] delivery_seur: avoid dead locks
chienandalu Sep 22, 2020
caad92f
[FIX] delivery_seur: full shipping addrees name
chienandalu Sep 22, 2020
29cb8c5
[IMP] delivery_gls and delivery_seur: add informative exceptions
chienandalu Oct 8, 2020
d40384a
[FIX] delivery_seur: zebra label
chienandalu Oct 13, 2020
546964d
[FIX] delivery_seur: Proper signature for seur_rate_shipment
pedrobaeza Feb 17, 2021
82d555a
[IMP] delivery_seur: black, isort, prettier
victoralmau Feb 18, 2021
2a9b4d7
[MIG] delivery_seur: Migration to 13.0
victoralmau Feb 25, 2021
8c298c4
[UPD] Update delivery_seur.pot
oca-travis Mar 11, 2021
a203a61
[UPD] README.rst
OCA-git-bot Mar 11, 2021
94706c2
Translated using Weblate (Spanish)
brendapaniagua Mar 19, 2021
065b0de
Added translation using Weblate (Catalan)
brendapaniagua Mar 24, 2021
65063b2
Translated using Weblate (Catalan)
jabelchi Apr 1, 2021
e90fcc2
[Fix] delivery_seur: avoid error due to non existent field
cubells Jul 14, 2021
a4d5aad
delivery_seur 13.0.1.0.1
OCA-git-bot Jul 14, 2021
84a67f4
[IMP] delivery_seur: missing product codes and fix id_mercancia bug
cubells Aug 15, 2021
8ca0267
[UPD] Update delivery_seur.pot
oca-travis Aug 17, 2021
b760061
delivery_seur 13.0.1.0.2
OCA-git-bot Aug 17, 2021
6326b2e
delivery_seur: Code refactor
victoralmau Nov 8, 2021
05514af
[UPD] Update delivery_seur.pot
oca-travis Nov 9, 2021
5c12e07
delivery_seur 13.0.1.1.0
OCA-git-bot Nov 9, 2021
1e8978f
[FIX] delivery_seur: partner name
chienandalu Dec 27, 2021
a19797a
[FIX] delivery_seur: label filename
chienandalu Feb 18, 2022
a053c44
delivery_seur 13.0.1.1.2
OCA-git-bot Feb 18, 2022
1bc67ae
[IMP] delivery_seur: black, isort, prettier
Vicenteagf May 16, 2022
e67cf82
[MIG] delivery_seur: Migration to 14.0
Vicenteagf May 17, 2022
c7ebe19
[FIX] delivery_seur: dependencies
Vicenteagf May 18, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 95 additions & 0 deletions delivery_seur/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
=============
Delivery SEUR
=============

.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! 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/13.0/delivery_seur
: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-13-0/l10n-spain-13-0-delivery_seur
: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/13.0
:alt: Try me on Runbot

|badge1| |badge2| |badge3| |badge4| |badge5|

This module allows the integration of SEUR web services.

Register shipping, generate label, read shipping state and cancel shippment by webservices

**Table of contents**

.. contents::
:local:

Usage
=====

You have to set Seur carrier in the stock picking you want to ship:

* In the stock picking form go to *Additional Info* tab and choose Seur as carrier and the service and product code. You only be able to choose this if the state of the picking is 'Ready to Transfer.

* When the picking is 'Transferred', it appears a *Create Shipping Label* button. Just push it, and if all went well the label will be 'attached'

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/l10n-spain/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 <https://github.com/OCA/l10n-spain/issues/new?body=module:%20delivery_seur%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

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

Credits
=======

Authors
~~~~~~~

* Trey (www.trey.es)
* FactorLibre

Contributors
~~~~~~~~~~~~

* `Trey <https://www.trey.es>`_:
* Roberto Lizana <roberto@trey.es>

* `FactorLibre <https://www.factorlibre.com>`_:
* Zahra Velasco <zahra.velasco@factorlibre.com>

* `Tecnativa <https://www.tecnativa.com>`_:

* Pedro M. Baeza
* David Vidal
* Víctor Martínez

Maintainers
~~~~~~~~~~~

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/l10n-spain <https://github.com/OCA/l10n-spain/tree/13.0/delivery_seur>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
4 changes: 4 additions & 0 deletions delivery_seur/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2020 Trey, Kilobytes de Soluciones
# Copyright 2020 FactorLibre
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models
20 changes: 20 additions & 0 deletions delivery_seur/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright 2020 Trey, Kilobytes de Soluciones
# Copyright 2020 FactorLibre
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
{
"name": "Delivery SEUR",
"summary": "Integrate SEUR webservice",
"author": "Trey (www.trey.es), FactorLibre, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/l10n-spain",
"license": "AGPL-3",
"category": "Delivery",
"version": "14.0.1.1.2",
"depends": [
"delivery",
"delivery_package_number",
"delivery_state",
"delivery_price_method",
],
"external_dependencies": {"python": ["zeep"]},
"data": ["views/delivery_carrier_views.xml"],
}
Binary file not shown.
Binary file added delivery_seur/doc/Servicios_WEB_Seur.doc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
379 changes: 379 additions & 0 deletions delivery_seur/i18n/ca.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,379 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * delivery_seur
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2021-04-01 11:56+0000\n"
"Last-Translator: jabelchi <jabelchi@gmail.com>\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_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid ""
"\n"
" SEUR 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.\n"
" "
msgstr ""
"\n"
" L'API SEUR no proveeix mètodes per a calcular costos de trameses,"
"\n"
" per tant, hauríeu de basar-vos en altres mètodes de càlcul, o "
"bé, \n"
" sobreescriure aquest en el vostre codi personalitzat.\n"
" "

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_size__1d
msgid "1D"
msgstr "1D"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_size__2c
msgid "2C"
msgstr "2C"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_size__2d
msgid "2D"
msgstr "2D"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_accounting_code
msgid "Accounting Code (CCC)"
msgstr "Codi comptable (CCC)"

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "CIT Credentials"
msgstr "Credencials CIT"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__076
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__077
msgid "CLASSIC"
msgstr "CLASSIC"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__007
msgid "COURIER"
msgstr "COURIER"

#. module: delivery_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid "Cancel SEUR shipment (%s): %s"
msgstr "Cancel·lar tramesa SEUR (%s): %s"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__datamax:e_class_4203
msgid "DATAMAX E CLASS 4203"
msgstr "DATAMAX E CLASS 4203"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__054
msgid "DOCUMENTOS"
msgstr "DOCUMENTS"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__031
msgid "ENTREGA PARTIC"
msgstr "ENTREGA PARTIC"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__002
msgid "ESTANDAR"
msgstr "ESTÀNDARD"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__018
msgid "FRIO"
msgstr "FRED"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_franchise_code
msgid "Franchise Code"
msgstr "Codi franquícia"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__hp:laserjet_ii
msgid "HP LASERJET II"
msgstr "HP LASERJET II"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__intermec:c4
msgid "INTERMEC C4"
msgstr "INTERMEC C4"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__072
msgid "INTERNACIONAL A"
msgstr "INTERNACIONAL A"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__070
msgid "INTERNACIONAL ´T"
msgstr "INTERNACIONAL ´T"

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Identification"
msgstr "Identificació"

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Integration"
msgstr "Integració"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_integration_code
msgid "Integration Code (CI)"
msgstr "Codi integració (CI)"

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Label"
msgstr "Etiqueta"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_label_format
msgid "Label format"
msgstr "Format etiqueta"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_label_size
msgid "Label size"
msgstr "Mida etiqueta"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_stock_picking__seur_last_request
msgid "Last SEUR xml request"
msgstr "Darrera petició xml SEUR"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_stock_picking__seur_last_response
msgid "Last SEUR xml response"
msgstr "Darrera resposta xml SEUR"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__017
msgid "MARITIMO"
msgstr "MARÍTIM"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__005
msgid "MISMO DIA"
msgstr "MATEIX DIA"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__006
msgid "MULTI BOX"
msgstr "MULTI BOX"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__052
msgid "MULTI DOC"
msgstr "MULTI DOC"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__004
msgid "MULTIPACK"
msgstr "MULTIPACK"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__019
msgid "NETEXPRESS"
msgstr "NETEXPRESS"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_format__pdf
msgid "PDF"
msgstr "PDF"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_ws_password
msgid "Password WS"
msgstr "Contrasenya WS"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_printer
msgid "Printer"
msgstr "Impressora"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_product_code
msgid "Product code"
msgstr "Codi de producte"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__delivery_type
msgid "Provider"
msgstr "Proveïdor"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__015
msgid "S-48"
msgstr "S-48"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__003
msgid "SEUR - 10"
msgstr "SEUR - 10"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__001
msgid "SEUR - 24"
msgstr "SEUR - 24"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__013
msgid "SEUR - 72"
msgstr "SEUR - 72"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__009
msgid "SEUR 13:30"
msgstr "SEUR 13:30"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__083
msgid "SEUR 8:30"
msgstr "SEUR 8:30"

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_picking_withcarrier_out_form
msgid "SEUR Technical"
msgstr "SEUR Tècnic"

#. module: delivery_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid "SEUR exception: %s"
msgstr "SEUR excepció: %s"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_send_sms
msgid "Send SMS to customer"
msgstr "Enviar SMS al client"

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Service"
msgstr "Servei"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_service_code
msgid "Service code"
msgstr "Codi de servei"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__delivery_type__seur
msgid "Seur"
msgstr "Seur"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_cit_password
msgid "Seur Cit Password"
msgstr "Contrasenya Seur Cit"

#. module: delivery_seur
#: model:ir.model,name:delivery_seur.model_delivery_carrier
msgid "Shipping Methods"
msgstr "Mètodes de tramesa"

#. module: delivery_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid "Status cannot be checked, enter webservice carrier credentials"
msgstr ""
"No es pot comprovar l'estat. Introduir credencials del webservice del "
"transportista"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__tec:b430
msgid "TEC B430"
msgstr "TEC B430"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_format__txt
msgid "TXT"
msgstr "TXT"

#. module: delivery_seur
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_send_sms
msgid "This feature has delivery cost"
msgstr "Aquesta característica té costos de tramesa"

#. module: delivery_seur
#: model:ir.model,name:delivery_seur.model_stock_picking
msgid "Transfer"
msgstr "Transfer"

#. module: delivery_seur
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_cit_password
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_cit_username
msgid "Used for cit.seur.com webservice (generate labels)"
msgstr "Usat pel webservice cit.seur.com (generar etiquetes)"

#. module: delivery_seur
#: model:ir.model.fields,help:delivery_seur.field_stock_picking__seur_last_request
#: model:ir.model.fields,help:delivery_seur.field_stock_picking__seur_last_response
msgid "Used for issues debugging"
msgstr "Usat per depuració d'incidències"

#. module: delivery_seur
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_ws_password
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_ws_username
msgid "Used for ws.seur.com webservice (pickup services)"
msgstr "Usat pel webservice ws.seur.com (serveis de recollida)"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_cit_username
msgid "Username CIT"
msgstr "Usuari CIT"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_ws_username
msgid "Username WS"
msgstr "Usuari WS"

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_vat
msgid "VAT"
msgstr "NIF"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__118
msgid "VINO"
msgstr "VI"

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "WS Credentials"
msgstr "Credencials WS"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__zebra:lp2844-z
msgid "ZEBRA LP2844-Z"
msgstr "ZEBRA LP2844-Z"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__zebra:s600
msgid "ZEBRA S600"
msgstr "ZEBRA S600"

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__zebra:z4m_plus
msgid "ZEBRA Z4M PLUS"
msgstr "ZEBRA Z4M PLUS"
381 changes: 381 additions & 0 deletions delivery_seur/i18n/delivery_seur.pot
Original file line number Diff line number Diff line change
@@ -0,0 +1,381 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * delivery_seur
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \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_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid ""
"\n"
" SEUR 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.\n"
" "
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_size__1d
msgid "1D"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_size__2c
msgid "2C"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_size__2d
msgid "2D"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_accounting_code
msgid "Accounting Code (CCC)"
msgstr ""

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "CIT Credentials"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__076
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__077
msgid "CLASSIC"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__116
msgid "CLASSIC MULTIPARCEL"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__007
msgid "COURIER"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__108
msgid "COURIER MUESTRAS"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__104
msgid "CROSSBORDER NETEXPRES INTERNACIONAL"
msgstr ""

#. module: delivery_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid "Cancel SEUR shipment (%s): %s"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__datamax:e_class_4203
msgid "DATAMAX E CLASS 4203"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__054
msgid "DOCUMENTOS"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__086
msgid "ECCOMMERCE RETURN 2HOME"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__088
msgid "ECCOMMERCE RETURN 2SHOP"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__031
msgid "ENTREGA PARTIC"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__002
msgid "ESTANDAR"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__018
msgid "FRIO"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_franchise_code
msgid "Franchise Code"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__hp:laserjet_ii
msgid "HP LASERJET II"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__intermec:c4
msgid "INTERMEC C4"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__072
msgid "INTERNACIONAL A"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__070
msgid "INTERNACIONAL ´T"
msgstr ""

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Identification"
msgstr ""

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Integration"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_integration_code
msgid "Integration Code (CI)"
msgstr ""

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Label"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_label_format
msgid "Label format"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_label_size
msgid "Label size"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__017
msgid "MARITIMO"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__005
msgid "MISMO DIA"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__006
msgid "MULTI BOX"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__052
msgid "MULTI DOC"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__004
msgid "MULTIPACK"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__019
msgid "NETEXPRESS"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__122
msgid "NEUMATICOS B2B"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__124
msgid "NEUMATICOS B2C"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_format__pdf
msgid "PDF"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_ws_password
msgid "Password WS"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_printer
msgid "Printer"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_product_code
msgid "Product code"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__delivery_type
msgid "Provider"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__015
msgid "S-48"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__003
msgid "SEUR - 10"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__001
msgid "SEUR - 24"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__013
msgid "SEUR - 72"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__009
msgid "SEUR 13:30"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__048
msgid "SEUR 24 PICKUP"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_service_code__083
msgid "SEUR 8:30"
msgstr ""

#. module: delivery_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid "SEUR exception: %s"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_send_sms
msgid "Send SMS to customer"
msgstr ""

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "Service"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_service_code
msgid "Service code"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__delivery_type__seur
msgid "Seur"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_cit_password
msgid "Seur Cit Password"
msgstr ""

#. module: delivery_seur
#: model:ir.model,name:delivery_seur.model_delivery_carrier
msgid "Shipping Methods"
msgstr ""

#. module: delivery_seur
#: code:addons/delivery_seur/models/delivery_carrier.py:0
#, python-format
msgid "Status cannot be checked, enter webservice carrier credentials"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__tec:b430
msgid "TEC B430"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_label_format__txt
msgid "TXT"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_send_sms
msgid "This feature has delivery cost"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_cit_password
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_cit_username
msgid "Used for cit.seur.com webservice (generate labels)"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_ws_password
#: model:ir.model.fields,help:delivery_seur.field_delivery_carrier__seur_ws_username
msgid "Used for ws.seur.com webservice (pickup services)"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_cit_username
msgid "Username CIT"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_ws_username
msgid "Username WS"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields,field_description:delivery_seur.field_delivery_carrier__seur_vat
msgid "VAT"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_product_code__118
msgid "VINO"
msgstr ""

#. module: delivery_seur
#: model_terms:ir.ui.view,arch_db:delivery_seur.view_delivery_carrier_form
msgid "WS Credentials"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__zebra:lp2844-z
msgid "ZEBRA LP2844-Z"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__zebra:s600
msgid "ZEBRA S600"
msgstr ""

#. module: delivery_seur
#: model:ir.model.fields.selection,name:delivery_seur.selection__delivery_carrier__seur_printer__zebra:z4m_plus
msgid "ZEBRA Z4M PLUS"
msgstr ""
404 changes: 404 additions & 0 deletions delivery_seur/i18n/es.po

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions delivery_seur/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Copyright 2020 Trey, Kilobytes de Soluciones
# Copyright 2020 FactorLibre
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import delivery_carrier
from . import seur_request
218 changes: 218 additions & 0 deletions delivery_seur/models/delivery_carrier.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,218 @@
# Copyright 2020 Trey, Kilobytes de Soluciones
# Copyright 2020 FactorLibre
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import base64
import logging

from odoo import _, exceptions, fields, models

from .seur_request import SeurRequest

_logger = logging.getLogger(__name__)


class DeliveryCarrier(models.Model):
_inherit = "delivery.carrier"

delivery_type = fields.Selection(
selection_add=[("seur", "Seur")], ondelete={"seur": "set default"}
)
seur_vat = fields.Char(
string="VAT",
default=lambda self: self.env.user.company_id.vat,
)
seur_franchise_code = fields.Char(
string="Franchise Code",
)
seur_accounting_code = fields.Char(
string="Accounting Code (CCC)",
)
seur_integration_code = fields.Char(
string="Integration Code (CI)",
)
seur_cit_username = fields.Char(
string="Username CIT",
help="Used for cit.seur.com webservice (generate labels)",
)
seur_cit_password = fields.Char(
string="Password CIT",
help="Used for cit.seur.com webservice (generate labels)",
)
seur_ws_username = fields.Char(
string="Username WS",
help="Used for ws.seur.com webservice (pickup services)",
)
seur_ws_password = fields.Char(
string="Password WS",
help="Used for ws.seur.com webservice (pickup services)",
)
seur_service_code = fields.Selection(
selection=[
("001", "SEUR - 24"),
("003", "SEUR - 10"),
("005", "MISMO DIA"),
("007", "COURIER"),
("009", "SEUR 13:30"),
("013", "SEUR - 72"),
("015", "S-48"),
("017", "MARITIMO"),
("019", "NETEXPRESS"),
("031", "ENTREGA PARTIC"),
("077", "CLASSIC"),
("083", "SEUR 8:30"),
],
default="031",
string="Service code",
)
seur_product_code = fields.Selection(
selection=[
("002", "ESTANDAR"),
("004", "MULTIPACK"),
("006", "MULTI BOX"),
("018", "FRIO"),
("048", "SEUR 24 PICKUP"),
("052", "MULTI DOC"),
("054", "DOCUMENTOS"),
("070", "INTERNACIONAL ´T"),
("072", "INTERNACIONAL A"),
("076", "CLASSIC"),
("086", "ECCOMMERCE RETURN 2HOME"),
("088", "ECCOMMERCE RETURN 2SHOP"),
("104", "CROSSBORDER NETEXPRES INTERNACIONAL"),
("108", "COURIER MUESTRAS"),
("116", "CLASSIC MULTIPARCEL"),
("118", "VINO"),
("122", "NEUMATICOS B2B"),
("124", "NEUMATICOS B2C"),
],
default="002",
string="Product code",
)
seur_send_sms = fields.Boolean(
string="Send SMS to customer",
help="This feature has delivery cost",
)
seur_label_format = fields.Selection(
selection=[("pdf", "PDF"), ("txt", "TXT")],
default="pdf",
string="Label format",
)
seur_label_size = fields.Selection(
selection=[("1D", "1D"), ("2D", "2D"), ("2C", "2C")],
default="2C",
string="Label size",
)
seur_printer = fields.Selection(
selection=[
("DATAMAX:E CLASS 4203", "DATAMAX E CLASS 4203"),
("HP:LASERJET II", "HP LASERJET II"),
("INTERMEC:C4", "INTERMEC C4"),
("TEC:B430", "TEC B430"),
("ZEBRA:LP2844-Z", "ZEBRA LP2844-Z"),
("ZEBRA:S600", "ZEBRA S600"),
("ZEBRA:Z4M PLUS", "ZEBRA Z4M PLUS"),
],
string="Printer",
default="ZEBRA:LP2844-Z",
)

def seur_test_connection(self):
self.ensure_one()
seur_request = SeurRequest(self, self)
res = seur_request.test_connection()
return res and res["mensaje"] == "ERROR"

def seur_send_shipping(self, pickings):
return [self.seur_create_shipping(p) for p in pickings]

def _zebra_label_custom(self, label):
"""Some printers might have special configurations so we could need
to tweak the label in advance. For example, we could need to adjust
initial position:
label.replace("^LH105,40", "^LH50,0")
"""
return label

def seur_create_shipping(self, picking):
self.ensure_one()
seur_request = SeurRequest(self, picking)
res = seur_request.create_shipping()
# The error message could be more complex than a simple 'ERROR' string.
# For example, if there's wrong address info, it will return an
# xml with the API error.
error = res["mensaje"] == "ERROR" or not res.get("ECB", {}).get("string", [])
if error:
raise exceptions.UserError(_("SEUR exception: %s") % res["mensaje"])
picking.carrier_tracking_ref = res["ECB"]["string"][0]
if self.seur_label_format == "txt":
label_content = self._zebra_label_custom(res["traza"])
# SEUR sends the label in spanish format (^CI10) so we need
# to encode the file in such ISO as well so special characters
# print fine
label_content = label_content.encode("iso-8859-15")
label_content = base64.b64encode(label_content)
else:
label_content = res["PDF"]
filename = "seur_{}.{}".format(
picking.carrier_tracking_ref, self.seur_label_format
)
self.env["ir.attachment"].create(
{
"name": filename,
"datas": label_content,
"store_fname": filename,
"res_model": "stock.picking",
"res_id": picking.id,
"mimetype": (
"application/pdf"
if self.seur_label_format == "pdf"
else "text/plain"
),
}
)
res["tracking_number"] = picking.carrier_tracking_ref
res["exact_price"] = 0
return res

def seur_tracking_state_update(self, picking):
self.ensure_one()
if not self.seur_ws_username:
picking.tracking_state_history = _(
"Status cannot be checked, enter webservice carrier credentials"
)
return

seur_request = SeurRequest(self, picking)
res = seur_request.tracking_state_update()
picking.tracking_state_history = res["tracking_state_history"]
if "delivery_state" in res:
picking.delivery_state = res["delivery_state"]

def seur_cancel_shipment(self, pickings):
for picking in pickings:
seur_request = SeurRequest(self, picking)
res = seur_request.cancel_shipment()
if res["estado"] == "KO":
raise UserWarning(
_("Cancel SEUR shipment (%s): %s")
% (picking.carrier_tracking_ref, res["mensaje"])
)
return True

def seur_get_tracking_link(self, picking):
return "https://www.seur.com/livetracking/?segOnlineIdentificador=%s" % (
picking.carrier_tracking_ref
)

def seur_rate_shipment(self, order):
"""There's no public API so another price method should be used"""
raise NotImplementedError(
_(
"""
SEUR 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.
"""
)
)
282 changes: 282 additions & 0 deletions delivery_seur/models/seur_request.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,282 @@
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import logging

from lxml import etree
from zeep import Client, Plugin, helpers
from zeep.plugins import HistoryPlugin
from zeep.transports import Transport

_logger = logging.getLogger(__name__)


class RewritePlugin(Plugin):
def __init__(self, xpath, value):
self.xpath = xpath
self.value = value
super().__init__()

def egress(self, envelope, http_headers, operation, binding_options):
node = envelope.xpath(self.xpath)
if node:
node[0].text = etree.CDATA(self.value.decode("utf-8"))


class SeurRequest(object):
def __init__(self, carrier, record):
self.carrier = carrier
self.record = record
self.ws_username = self.carrier.seur_ws_username
self.ws_password = self.carrier.seur_ws_password
self.cit_username = self.carrier.seur_cit_username
self.cit_password = self.carrier.seur_cit_password
self.franchise_code = self.carrier.seur_franchise_code
self.vat = self.carrier.seur_vat
self.accounting_code = self.carrier.seur_accounting_code
self.printer = self.carrier.seur_printer
self.label_size = self.carrier.seur_label_size
self.integration_code = self.carrier.seur_integration_code
self.service_code = self.carrier.seur_service_code
self.product_code = self.carrier.seur_product_code
self.send_sms = self.carrier.seur_send_sms
self.label_format = self.carrier.seur_label_format

def wsdl_get(self, service):
if service in ["ImprimirECBWebService", "IntAppletWebService"]:
return "http://cit.seur.com/CIT-war/services/%s?wsdl" % service
if service == "WSConsultaExpediciones":
return "https://ws.seur.com/webseur/services/%s?wsdl" % service
raise NotImplementedError

def soap_send(self, service, method, data):
def create_rewrite_plugin(data):
key = [k for k, v in data.items() if isinstance(v, dict)]
if not key:
return RewritePlugin("//no-dict", "")
key = key[0]
if "total_bultos" not in data[key]:
return RewritePlugin("//missing-key", "")
xml_root = etree.Element("root")
xml_exp = etree.SubElement(xml_root, "exp")
for _index in range(int(data[key].get("total_bultos") or 1)):
package = etree.SubElement(xml_exp, "bulto")
for k, v in data[key].items():
etree.SubElement(package, k).text = str(v or "")
xml = etree.tostring(xml_root, encoding="utf8", method="xml")
data[key] = "-RewritePlugin-"
return RewritePlugin('//*[text()="-RewritePlugin-"]', xml)

history = HistoryPlugin()
client = Client(
wsdl=self.wsdl_get(service),
transport=Transport(),
plugins=[history, create_rewrite_plugin(data)],
)
cli = client.bind(service)
response = cli[method](**data)
response = helpers.serialize_object(response, dict)
# Add the history to the response so we are able to use it
self.carrier.log_xml(history.last_sent, "seur_last_request")
self.carrier.log_xml(history.last_received, "seur_last_response")
return response

def test_connection(self):
res = self.soap_send(
"ImprimirECBWebService",
"impresionIntegracionPDFConECBWS",
{
"in0": self.cit_username,
"in1": self.cit_password,
"in2": "",
"in3": "fichero.xml",
"in4": self.vat,
"in5": self.franchise_code,
"in6": self.accounting_code,
"in7": "odoo",
},
)
return res and res["mensaje"] == "ERROR"

def _prepare_create_shipping(self):
partner = self.record.partner_id
partner_name = partner.display_name
# When we get a specific delivery address we want to prioritize its
# name over the commercial one
if partner.parent_id and partner.type == "delivery" and partner.name:
partner_name = "{} ({})".format(
partner.name, partner.commercial_partner_id.name
)
partner_att = (
partner.name if partner.parent_id and partner.type == "contact" else ""
)
company = self.record.company_id
phone = partner.phone and partner.phone.replace(" ", "") or ""
mobile = partner.mobile and partner.mobile.replace(" ", "") or ""
# Para envíos domésticos el código de mercancía mejor no ponerlo
if partner.country_id.code in ["ES", "PT", "AD"]:
goods = ""
else:
# Para el resto es obligado
goods = "400"
return {
"ci": self.integration_code,
"nif": self.vat,
"ccc": self.accounting_code,
"servicio": self.service_code,
"producto": self.product_code,
"cod_centro": "",
"total_bultos": self.record.number_of_packages or 1,
# The item pricelists in SEUR begin in a range o >1kg. So any item
# below that weight will be invoiced with a minimum of 1kg.
# http://ayuda.seur.com
# /faq/tamano-peso-de-los-paquetes-a-enviar-a-traves-de-seur-com
"total_kilos": self.record.shipping_weight or 1,
"pesoBulto": (
(self.record.shipping_weight / self.record.number_of_packages or 1) or 1
),
"observaciones": self.record.note,
"referencia_expedicion": self.record.name,
"ref_bulto": "",
"clavePortes": "F",
"clavePod": "",
"claveReembolso": "F",
"valorReembolso": "",
"libroControl": "",
"nombre_consignatario": partner_name,
"direccion_consignatario": " ".join(
[s for s in [partner.street, partner.street2] if s]
),
"tipoVia_consignatario": "",
"tNumVia_consignatario": "",
"numVia_consignatario": "",
"escalera_consignatario": "",
"piso_consignatario": "",
"puerta_consignatario": "",
"poblacion_consignatario": partner.city,
"codPostal_consignatario": partner.zip,
"pais_consignatario": (
partner.country_id and partner.country_id.code or ""
),
"email_consignatario": partner.email,
"telefono_consignatario": phone or mobile,
"sms_consignatario": self.send_sms and mobile or "",
"atencion_de": partner_att,
"test_preaviso": "S",
"test_reparto": "S",
"test_email": partner.email and "S" or "N",
"test_sms": mobile and "S" or "N",
"id_mercancia": goods,
"nombre_remitente": company.name,
"direccion_remitente": " ".join(
[s for s in [company.street, company.street2] if s]
),
"codPostal_remitente": company.zip,
"poblacion_remitente": company.city,
"tipoVia_remitente": "",
"eci": "N",
"et": "N",
}

def create_shipping(self):
package_info = self._prepare_create_shipping()
if self.label_format == "txt":
return self.soap_send(
"ImprimirECBWebService",
"impresionIntegracionConECBWS",
{
"in0": self.cit_username,
"in1": self.cit_password,
"in2": self.printer.split(":")[0],
"in3": self.printer.split(":")[1],
"in4": self.label_size,
"in5": package_info,
"in6": "fichero.xml",
"in7": self.vat,
"in8": self.franchise_code,
"in9": self.accounting_code,
"in10": "odoo",
},
)
else:
return self.soap_send(
"ImprimirECBWebService",
"impresionIntegracionPDFConECBWS",
{
"in0": self.cit_username,
"in1": self.cit_password,
"in2": package_info,
"in3": "fichero.xml",
"in4": self.vat,
"in5": self.franchise_code,
"in6": self.accounting_code,
"in7": "odoo",
},
)

def tracking_state_update(self):
res = self.soap_send(
"WSConsultaExpediciones",
"consultaExpedicionesStr",
{
"in0": "S",
"in1": "",
"in2": "",
"in3": self.record.carrier_tracking_ref,
"in4": "",
"in5": "",
"in6": "",
"in7": "",
"in8": "",
"in9": "",
"in10": "",
"in11": "0",
"in12": self.ws_username,
"in13": self.ws_password,
"in14": "S",
},
)
xml = etree.fromstring(res)
errors = [n.text for n in xml.xpath("//ERROR/DESCRIPCION")]
if errors:
return {"tracking_state_history": "\n".join(errors)}
state = xml.xpath("(//DESCRIPCION_CLIENTE)[last()]")[0].text.strip()
static_states = {
"EN TRÁNSITO": "in_transit",
"MERCANCÍA EN REPARTO": "in_transit",
"ENTREGA EFECTUADA": "customer_delivered",
"ENTREGADO EN PUNTO": "customer_delivered",
"ENTREGADO CAMBIO SIN RETORNO": "customer_delivered",
}
return {
"tracking_state_history": "\n".join(
[
"%s | %s"
% (
sit.find("FECHA_SITUACION").text,
sit.find("DESCRIPCION_CLIENTE").text,
)
for sit in xml.xpath("//SIT")
]
),
"delivery_state": static_states.get(state, "incidence"),
}

def cancel_shipment(self):
return self.soap_send(
"IntAppletWebService",
"modificarEnvioCIT",
{
"in0": {
"usuario": self.cit_username,
"password": self.cit_password,
"franquicia": self.franchise_code,
"nif": self.vat,
"ccc": self.accounting_code,
"referencia": self.record.name,
"accion": "A",
"valorReembolso": "",
"valorSeguro": "",
"pesoTotal": "",
},
},
)
11 changes: 11 additions & 0 deletions delivery_seur/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
* `Trey <https://www.trey.es>`_:
* Roberto Lizana <roberto@trey.es>

* `FactorLibre <https://www.factorlibre.com>`_:
* Zahra Velasco <zahra.velasco@factorlibre.com>

* `Tecnativa <https://www.tecnativa.com>`_:

* Pedro M. Baeza
* David Vidal
* Víctor Martínez
3 changes: 3 additions & 0 deletions delivery_seur/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This module allows the integration of SEUR web services.

Register shipping, generate label, read shipping state and cancel shippment by webservices
5 changes: 5 additions & 0 deletions delivery_seur/readme/USAGE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
You have to set Seur carrier in the stock picking you want to ship:

* In the stock picking form go to *Additional Info* tab and choose Seur as carrier and the service and product code. You only be able to choose this if the state of the picking is 'Ready to Transfer.

* When the picking is 'Transferred', it appears a *Create Shipping Label* button. Just push it, and if all went well the label will be 'attached'
Binary file added delivery_seur/static/description/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
456 changes: 456 additions & 0 deletions delivery_seur/static/description/index.html

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions delivery_seur/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright 2020 Trey, Kilobytes de Soluciones
# Copyright 2020 FactorLibre
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import test_delivery_seur
74 changes: 74 additions & 0 deletions delivery_seur/tests/test_delivery_seur.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Copyright 2020 Trey, Kilobytes de Soluciones
# Copyright 2020 FactorLibre
# Copyright 2021 Tecnativa - Víctor Martínez
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from odoo.tests import Form, common


class TestDeliverySeur(common.SavepointCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.carrier = cls.env["delivery.carrier"].search(
[("delivery_type", "=", "seur")]
)
cls.company = cls.env.company
cls.company.country_id = cls.env.ref("base.es").id
cls.company.partner_id.city = "Madrid"
cls.company.partner_id.zip = "28001"
cls.partner = cls.env["res.partner"].create(
{
"name": "Partner test [ñáéíóú]",
"country_id": cls.env.ref("base.es").id,
"street": cls.company.partner_id.street,
"city": cls.company.partner_id.city,
"zip": cls.company.partner_id.zip,
"state_id": cls.company.partner_id.state_id.id,
}
)
cls.product = cls.env.ref("product.product_delivery_01")
cls.sale = cls._create_sale_order(cls)
cls.picking = cls.sale.picking_ids[0]
cls.picking.move_lines.quantity_done = 1

def _create_sale_order(self):
order_form = Form(self.env["sale.order"])
order_form.partner_id = self.partner
with order_form.order_line.new() as line_form:
line_form.product_id = self.product
line_form.product_uom_qty = 1
sale = order_form.save()
if self.carrier:
delivery_wizard = Form(
self.env["choose.delivery.carrier"].with_context(
{"default_order_id": sale.id, "default_carrier_id": self.carrier.id}
)
).save()
delivery_wizard.button_confirm()
sale.action_confirm()
return sale

def test_soap_connection(self):
if not self.carrier or self.carrier.prod_environment:
self.skipTest("Without SEUR credentials")
self.assertTrue(self.carrier.seur_test_connection())

def test_order_seur_rate_shipment_error(self):
with self.assertRaises(NotImplementedError):
self.carrier.seur_rate_shipment(self.sale)

def test_delivery_carrier_seur_integration(self):
if not self.carrier or self.carrier.prod_environment:
self.skipTest("Without SEUR credentials")
self.picking.action_confirm()
self.picking.action_assign()
self.picking.send_to_shipper()
self.assertEquals(self.picking.message_attachment_count, 1)
self.assertTrue(self.picking.carrier_tracking_ref)
self.assertFalse(self.picking.tracking_state_history)
self.picking.tracking_state_update()
self.assertEquals(
self.picking.tracking_state_history,
"No existen expediciones para la búsqueda realizada",
)
self.picking.cancel_shipment()
49 changes: 49 additions & 0 deletions delivery_seur/views/delivery_carrier_views.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2020 Trey, Kilobytes de Soluciones
Copyright 2020 FactorLibre
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="view_delivery_carrier_form" model="ir.ui.view">
<field name="model">delivery.carrier</field>
<field name="inherit_id" ref="delivery.view_delivery_carrier_form" />
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page
string="Integration"
attrs="{'invisible': ['|', ('delivery_type', '!=', 'seur'), ('integration_level', '!=', 'rate_and_ship')]}"
>
<group
attrs="{'required': [('delivery_type', '=', 'seur'), ('integration_level', '=', 'rate_and_ship')]}"
>
<group string="Identification">
<field name="seur_vat" />
<field name="seur_franchise_code" />
<field name="seur_accounting_code" />
<field name="seur_integration_code" />
</group>
<group string="CIT Credentials">
<field name="seur_cit_username" />
<field name="seur_cit_password" />
</group>
<group string="Service">
<field name="seur_service_code" />
<field name="seur_product_code" />
<field name="seur_send_sms" />
</group>
<group string="WS Credentials">
<field name="seur_ws_username" />
<field name="seur_ws_password" />
</group>
<group string="Label">
<field name="seur_printer" />
<field name="seur_label_format" />
<field name="seur_label_size" />
</group>
</group>
</page>
</xpath>
</field>
</record>
</odoo>
1 change: 1 addition & 0 deletions setup/delivery_seur/odoo/addons/delivery_seur
6 changes: 6 additions & 0 deletions setup/delivery_seur/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import setuptools

setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)