From 9b581bf1d59161bc6da655af31096cb84a209124 Mon Sep 17 00:00:00 2001
From: david <david.vidal@tecnativa.com>
Date: Fri, 20 Aug 2021 15:07:36 +0200
Subject: [PATCH 01/23] [ADD] delivery_schenker: New module

TT31005
---
 delivery_schenker/README.rst                  | 170 ++++++
 delivery_schenker/__init__.py                 |   1 +
 delivery_schenker/__manifest__.py             |  20 +
 .../api/fat_bookingWebServiceV1_1.wsdl        | 186 ++++++
 .../api/prod_bookingWebServiceV1_1.wsdl       | 186 ++++++
 .../data/delivery_schenker_data.xml           | 120 ++++
 delivery_schenker/models/__init__.py          |   3 +
 delivery_schenker/models/delivery_carrier.py  | 530 ++++++++++++++++++
 delivery_schenker/models/product_packaging.py |  14 +
 delivery_schenker/models/schenker_request.py  | 190 +++++++
 delivery_schenker/readme/CONFIGURE.rst        |  10 +
 delivery_schenker/readme/CONTRIBUTORS.rst     |   3 +
 delivery_schenker/readme/DESCRIPTION.rst      |   2 +
 delivery_schenker/readme/INSTALL.rst          |   5 +
 delivery_schenker/readme/ROADMAP.rst          |  22 +
 delivery_schenker/readme/USAGE.rst            |  41 ++
 delivery_schenker/static/description/icon.png | Bin 0 -> 3740 bytes
 delivery_schenker/static/description/icon.svg | 528 +++++++++++++++++
 .../static/description/index.html             | 529 +++++++++++++++++
 delivery_schenker/tests/__init__.py           |   0
 .../views/delivery_schenker_view.xml          |  78 +++
 .../views/stock_picking_views.xml             |  20 +
 22 files changed, 2658 insertions(+)
 create mode 100644 delivery_schenker/README.rst
 create mode 100644 delivery_schenker/__init__.py
 create mode 100644 delivery_schenker/__manifest__.py
 create mode 100644 delivery_schenker/api/fat_bookingWebServiceV1_1.wsdl
 create mode 100644 delivery_schenker/api/prod_bookingWebServiceV1_1.wsdl
 create mode 100644 delivery_schenker/data/delivery_schenker_data.xml
 create mode 100644 delivery_schenker/models/__init__.py
 create mode 100644 delivery_schenker/models/delivery_carrier.py
 create mode 100644 delivery_schenker/models/product_packaging.py
 create mode 100644 delivery_schenker/models/schenker_request.py
 create mode 100644 delivery_schenker/readme/CONFIGURE.rst
 create mode 100644 delivery_schenker/readme/CONTRIBUTORS.rst
 create mode 100644 delivery_schenker/readme/DESCRIPTION.rst
 create mode 100644 delivery_schenker/readme/INSTALL.rst
 create mode 100644 delivery_schenker/readme/ROADMAP.rst
 create mode 100644 delivery_schenker/readme/USAGE.rst
 create mode 100644 delivery_schenker/static/description/icon.png
 create mode 100644 delivery_schenker/static/description/icon.svg
 create mode 100644 delivery_schenker/static/description/index.html
 create mode 100644 delivery_schenker/tests/__init__.py
 create mode 100644 delivery_schenker/views/delivery_schenker_view.xml
 create mode 100644 delivery_schenker/views/stock_picking_views.xml

diff --git a/delivery_schenker/README.rst b/delivery_schenker/README.rst
new file mode 100644
index 0000000000..a4155ec4ec
--- /dev/null
+++ b/delivery_schenker/README.rst
@@ -0,0 +1,170 @@
+=================
+Delivery Schenker
+=================
+
+.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   !! 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%2Fdelivery--carrier-lightgray.png?logo=github
+    :target: https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker
+    :alt: OCA/delivery-carrier
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+    :target: https://translation.odoo-community.org/projects/delivery-carrier-13-0/delivery-carrier-13-0-delivery_schenker
+    :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
+    :target: https://runbot.odoo-community.org/runbot/99/13.0
+    :alt: Try me on Runbot
+
+|badge1| |badge2| |badge3| |badge4| |badge5| 
+
+This module links the `DB Schenker <https://www.dbschenker.com>`_ booking and tracking
+APIs with Odoo delivery system.
+
+**Table of contents**
+
+.. contents::
+   :local:
+
+Installation
+============
+
+This module depends on the `zeep` python library and the OCA/delivery-carrier
+`delivery_package_number` and `delivery_state` modules.
+
+The Schenker API doesn't provide delivery rating methods, so OCA's
+`delivery_price_method` is advised in order to use this carrier in a sales workflow.
+
+Configuration
+=============
+
+To configure a Schenker delivery method:
+
+#. Go to *Inventory > Configuration > Delivery > Shipping methods* and create a new one.
+#. Choose *DB Schenker* as provider.
+#. Configure the service parameters according to your contract considerations.
+#. Choose a delivery product and a default packaging. This is mandatory for the booking
+   request as it needs the packaging code.
+
+To make tests, set the carrier environment to test from the smart button. Don't forget
+to set it to production once you're ready to use the delivery method!
+
+Usage
+=====
+
+These are the operations possible with this module:
+
+Place shipping bookings
+~~~~~~~~~~~~~~~~~~~~~~~
+
+#. When the picking is validated, the shipping will be booked at Schenker.
+#. With the response, we'll receive the delivery tracking number and the pdf label in a
+   chatter message and it will be kept as attachment to the document.
+#. You can manage packages number either with the proper Odoo workflows or with the
+   package number field available in the *Additional Info* tab. You'll get as many
+   labels as declared packages.
+
+Cancel bookings
+~~~~~~~~~~~~~~~
+
+#. As in other carriers, we can cancel the shipping after the picking is done. To do
+   so, go to *Additional Info* tab and click on the *Cancel* action on the side of the
+   tracking number.
+#. We can generate a new shipping if necessary.
+
+Get labels
+~~~~~~~~~~
+
+#. If by chance we delete the generated labels, we can obtain them again hitting the
+   *Schenker Label* buttons in the header of the picking form.
+
+Tracking
+~~~~~~~~
+
+#. The module is integrated with `delivery_state` to be able to get the tracking info
+   directly from the DB Schenker API.
+#. To do so, go to a picking shipped with Schenker. In the *Additional Info* tab you'll
+   find an action button to *Update tracking state* so the state will be updated from
+   the Schenker API.
+
+Debugging
+~~~~~~~~~
+
+The API calls and responses are tracked in two special fields in the picking that can
+be viewed by technical users. You can also log them in as `ir.logging` records setting
+the carrier debug on from the smart button.
+
+Known issues / Roadmap
+======================
+
+* There's no dummy access key to test API calls so no tests can be performed.
+* The test booking and shipping APIs databases aren't connected so it isn't possible to
+  perform trackings on test mode.
+* Only land shipping is implemented, although the module is prepared for extend to
+  air and ocean just considering the mandatory request fields for those methods.
+  Some additional adaptations could be needed (e.g.: origin and destination airport,
+  port) anyway.
+* Only volume is supported as a measure unit and with the limitations of Odoo itself. To
+  enjoy a full fledged volume support, install and configure the OCA’s
+  `stock_quant_package_dimension` module and its dependencies. The connector is ready to
+  make use of their volume computations.
+* It’d be needed to extend the method to support Schenker measure units such as  loading
+  pieces or pallet space.
+* Some more booking features aren’t yet supported although can be extended in the
+  future. Some of those, although the complete list would be really extensive:
+
+  * Dangerous goods.
+  * Driver pre-advise.
+  * Transport temperature.
+  * Customs clearance.
+  * Cargo insurance.
+  * Cash on delivery.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/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/delivery-carrier/issues/new?body=module:%20delivery_schenker%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
+~~~~~~~
+
+* Tecnativa
+
+Contributors
+~~~~~~~~~~~~
+
+* `Tecnativa <https://www.tecnativa.com>`_:
+
+  * David Vidal
+
+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/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker>`_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/delivery_schenker/__init__.py b/delivery_schenker/__init__.py
new file mode 100644
index 0000000000..0650744f6b
--- /dev/null
+++ b/delivery_schenker/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/delivery_schenker/__manifest__.py b/delivery_schenker/__manifest__.py
new file mode 100644
index 0000000000..fa9df94f58
--- /dev/null
+++ b/delivery_schenker/__manifest__.py
@@ -0,0 +1,20 @@
+# Copyright 2021 Tecnativa - David Vidal
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+{
+    "name": "Delivery Schenker",
+    "summary": "Delivery Carrier implementation for DB Schenker API",
+    "version": "13.0.1.0.0",
+    "category": "Stock",
+    "website": "https://github.com/OCA/delivery-carrier",
+    "author": "Tecnativa, Odoo Community Association (OCA)",
+    "license": "AGPL-3",
+    "application": False,
+    "installable": True,
+    "depends": ["delivery_package_number", "delivery_state"],
+    "external_dependencies": {"python": ["zeep"]},
+    "data": [
+        "views/delivery_schenker_view.xml",
+        "views/stock_picking_views.xml",
+        "data/delivery_schenker_data.xml",
+    ],
+}
diff --git a/delivery_schenker/api/fat_bookingWebServiceV1_1.wsdl b/delivery_schenker/api/fat_bookingWebServiceV1_1.wsdl
new file mode 100644
index 0000000000..79053f4181
--- /dev/null
+++ b/delivery_schenker/api/fat_bookingWebServiceV1_1.wsdl
@@ -0,0 +1,186 @@
+<?xml version='1.0' encoding='UTF-8'?><definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://www.schenker.com/Booking/v1_1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/" name="BookingWebService" targetNamespace="http://www.schenker.com/Booking/v1_1">
+  <types>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://www.schenker.com/Booking/v1_1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/">
+
+  <xsd:import namespace="http://www.schenker.com/Booking/v1_1" schemaLocation="https://eschenker-fat.dbschenker.com/webservice/bookingWebServiceV1_1?xsd=BookingWebService_v1.1.xsd"/>
+
+</xsd:schema>
+  </types>
+  <message name="getBookingRequestLand">
+    <part element="tns:getBookingRequestLand" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingRequestOceanFCL">
+    <part element="tns:getBookingRequestOceanFCL" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingCancelRequest">
+    <part element="tns:getBookingCancelRequest" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingResponse">
+    <part element="tns:getBookingResponse" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingBarcodeResponse">
+    <part element="tns:getBookingBarcodeResponse" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingRequestAir">
+    <part element="tns:getBookingRequestAir" name="parameters">
+    </part>
+  </message>
+  <message name="schenkerServiceException">
+    <part element="tns:schenkerServiceException" name="fault">
+    </part>
+  </message>
+  <message name="getBookingBarcodeRequest">
+    <part element="tns:getBookingBarcodeRequest" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingCancelResponse">
+    <part element="tns:getBookingCancelResponse" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingRequestOceanLCL">
+    <part element="tns:getBookingRequestOceanLCL" name="parameters">
+    </part>
+  </message>
+  <portType name="BookingWebService">
+<documentation>Booking Web Service to create Land, Ocean and Air bookings</documentation>
+    <operation name="getBookingRequestLand">
+<documentation>Booking Web Service operation to create Land bookings</documentation>
+      <input message="tns:getBookingRequestLand" name="in" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestLand">
+    </input>
+      <output message="tns:getBookingResponse" name="out" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/getBookingResponseLand">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingRequestAir">
+<documentation>Booking Web Service operation to create Air bookings</documentation>
+      <input message="tns:getBookingRequestAir" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestAir">
+    </input>
+      <output message="tns:getBookingResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/getBookingResponseAir">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingRequestOceanLCL">
+<documentation>Booking Web Service operation to create Ocean LCL bookings</documentation>
+      <input message="tns:getBookingRequestOceanLCL" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanLCL">
+    </input>
+      <output message="tns:getBookingResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/getBookingResponseOcean">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingRequestOceanFCL">
+<documentation>Booking Web Service operation to create Ocean FCL bookings</documentation>
+      <input message="tns:getBookingRequestOceanFCL" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanFCL">
+    </input>
+      <output message="tns:getBookingResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/OceanResponse">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingBarcodeRequest">
+<documentation>Booking Web Service operation to get a barcode based on a booking id</documentation>
+      <input message="tns:getBookingBarcodeRequest" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingBarcodeRequest">
+    </input>
+      <output message="tns:getBookingBarcodeResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/BarcodeResponse">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingCancelRequest">
+<documentation>Booking Web Service operation to cancel a booking by booking id</documentation>
+      <input message="tns:getBookingCancelRequest" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingCancelRequest">
+    </input>
+      <output message="tns:getBookingCancelResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/CancelResponse">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+  </portType>
+  <binding name="BookingWebServiceServiceSOAPBinding" type="tns:BookingWebService">
+    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+    <operation name="getBookingRequestLand">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestLand"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingRequestAir">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestAir"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingRequestOceanLCL">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanLCL"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingRequestOceanFCL">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanFCL"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingBarcodeRequest">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingBarcodeRequest"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingCancelRequest">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingCancelRequest"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+  </binding>
+  <service name="BookingWebService">
+    <port binding="tns:BookingWebServiceServiceSOAPBinding" name="BookingWebServiceServiceSOAPBinding">
+      <soap:address location="https://eschenker-fat.dbschenker.com/webservice/bookingWebServiceV1_1"/>
+    </port>
+  </service>
+</definitions>
diff --git a/delivery_schenker/api/prod_bookingWebServiceV1_1.wsdl b/delivery_schenker/api/prod_bookingWebServiceV1_1.wsdl
new file mode 100644
index 0000000000..3f7ccc7a02
--- /dev/null
+++ b/delivery_schenker/api/prod_bookingWebServiceV1_1.wsdl
@@ -0,0 +1,186 @@
+<?xml version='1.0' encoding='UTF-8'?><definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://www.schenker.com/Booking/v1_1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/" name="BookingWebService" targetNamespace="http://www.schenker.com/Booking/v1_1">
+  <types>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:tns="http://www.schenker.com/Booking/v1_1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/">
+
+  <xsd:import namespace="http://www.schenker.com/Booking/v1_1" schemaLocation="https://eschenker.dbschenker.com/webservice/bookingWebServiceV1_1?xsd=BookingWebService_v1.1.xsd"/>
+
+</xsd:schema>
+  </types>
+  <message name="getBookingRequestLand">
+    <part element="tns:getBookingRequestLand" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingRequestOceanFCL">
+    <part element="tns:getBookingRequestOceanFCL" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingCancelRequest">
+    <part element="tns:getBookingCancelRequest" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingResponse">
+    <part element="tns:getBookingResponse" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingBarcodeResponse">
+    <part element="tns:getBookingBarcodeResponse" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingRequestAir">
+    <part element="tns:getBookingRequestAir" name="parameters">
+    </part>
+  </message>
+  <message name="schenkerServiceException">
+    <part element="tns:schenkerServiceException" name="fault">
+    </part>
+  </message>
+  <message name="getBookingBarcodeRequest">
+    <part element="tns:getBookingBarcodeRequest" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingCancelResponse">
+    <part element="tns:getBookingCancelResponse" name="parameters">
+    </part>
+  </message>
+  <message name="getBookingRequestOceanLCL">
+    <part element="tns:getBookingRequestOceanLCL" name="parameters">
+    </part>
+  </message>
+  <portType name="BookingWebService">
+<documentation>Booking Web Service to create Land, Ocean and Air bookings</documentation>
+    <operation name="getBookingRequestLand">
+<documentation>Booking Web Service operation to create Land bookings</documentation>
+      <input message="tns:getBookingRequestLand" name="in" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestLand">
+    </input>
+      <output message="tns:getBookingResponse" name="out" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/getBookingResponseLand">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingRequestAir">
+<documentation>Booking Web Service operation to create Air bookings</documentation>
+      <input message="tns:getBookingRequestAir" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestAir">
+    </input>
+      <output message="tns:getBookingResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/getBookingResponseAir">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingRequestOceanLCL">
+<documentation>Booking Web Service operation to create Ocean LCL bookings</documentation>
+      <input message="tns:getBookingRequestOceanLCL" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanLCL">
+    </input>
+      <output message="tns:getBookingResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/getBookingResponseOcean">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingRequestOceanFCL">
+<documentation>Booking Web Service operation to create Ocean FCL bookings</documentation>
+      <input message="tns:getBookingRequestOceanFCL" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanFCL">
+    </input>
+      <output message="tns:getBookingResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/OceanResponse">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingBarcodeRequest">
+<documentation>Booking Web Service operation to get a barcode based on a booking id</documentation>
+      <input message="tns:getBookingBarcodeRequest" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingBarcodeRequest">
+    </input>
+      <output message="tns:getBookingBarcodeResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/BarcodeResponse">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+    <operation name="getBookingCancelRequest">
+<documentation>Booking Web Service operation to cancel a booking by booking id</documentation>
+      <input message="tns:getBookingCancelRequest" wsam:Action="http://www.schenker.com/Booking/v1_1/getBookingCancelRequest">
+    </input>
+      <output message="tns:getBookingCancelResponse" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/CancelResponse">
+    </output>
+      <fault message="tns:schenkerServiceException" name="SchenkerServiceException" wsam:Action="http://www.schenker.com/Booking/v1_1/BookingWebService/Fault/SchenkerServiceException">
+    </fault>
+    </operation>
+  </portType>
+  <binding name="BookingWebServiceServiceSOAPBinding" type="tns:BookingWebService">
+    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+    <operation name="getBookingRequestLand">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestLand"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingRequestAir">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestAir"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingRequestOceanLCL">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanLCL"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingRequestOceanFCL">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingRequestOceanFCL"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingBarcodeRequest">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingBarcodeRequest"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+    <operation name="getBookingCancelRequest">
+      <soap:operation soapAction="http://www.schenker.com/Booking/v1_1/getBookingCancelRequest"/>
+      <input>
+        <soap:body use="literal"/>
+      </input>
+      <output>
+        <soap:body use="literal"/>
+      </output>
+      <fault name="SchenkerServiceException">
+        <soap:fault name="SchenkerServiceException" use="literal"/>
+      </fault>
+    </operation>
+  </binding>
+  <service name="BookingWebService">
+    <port binding="tns:BookingWebServiceServiceSOAPBinding" name="BookingWebServiceServiceSOAPBinding">
+      <soap:address location="https://eschenker.dbschenker.com/webservice/bookingWebServiceV1_1"/>
+    </port>
+  </service>
+</definitions>
diff --git a/delivery_schenker/data/delivery_schenker_data.xml b/delivery_schenker/data/delivery_schenker_data.xml
new file mode 100644
index 0000000000..cd9379a5da
--- /dev/null
+++ b/delivery_schenker/data/delivery_schenker_data.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo noupdate="1">
+    <!-- Schenker Product Packagings. It'd be nice to have proper measures -->
+    <record id="schenker_packaging_01" model="product.packaging">
+        <field name="shipper_package_code">CI</field>
+        <field name="name">(Schenker) Canister</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_02" model="product.packaging">
+        <field name="shipper_package_code">CT</field>
+        <field name="name">(Schenker) Carton</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_03" model="product.packaging">
+        <field name="shipper_package_code">CS</field>
+        <field name="name">(Schenker) Case</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_04" model="product.packaging">
+        <field name="shipper_package_code">CO</field>
+        <field name="name">(Schenker) Colli</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_05" model="product.packaging">
+        <field name="shipper_package_code">CH</field>
+        <field name="name">(Schenker) Crate</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_06" model="product.packaging">
+        <field name="shipper_package_code">GP</field>
+        <field name="name">(Schenker) Skeleton box pallet</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_07" model="product.packaging">
+        <field name="shipper_package_code">NE</field>
+        <field name="name">(Schenker) Unpacked Skid</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_08" model="product.packaging">
+        <field name="shipper_package_code">BG</field>
+        <field name="name">(Schenker) Bag</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_09" model="product.packaging">
+        <field name="shipper_package_code">BL</field>
+        <field name="name">(Schenker) Bale</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_10" model="product.packaging">
+        <field name="shipper_package_code">DR</field>
+        <field name="name">(Schenker) Barrel</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_11" model="product.packaging">
+        <field name="shipper_package_code">BX</field>
+        <field name="name">(Schenker) Box</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_12" model="product.packaging">
+        <field name="shipper_package_code">BY</field>
+        <field name="name">(Schenker) Bundle</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_13" model="product.packaging">
+        <field name="shipper_package_code">TR</field>
+        <field name="name">(Schenker) Drum</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_14" model="product.packaging">
+        <field name="shipper_package_code">EP</field>
+        <field name="name">(Schenker) Europallet</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_15" model="product.packaging">
+        <field name="shipper_package_code">FR</field>
+        <field name="name">(Schenker) Frame</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_16" model="product.packaging">
+        <field name="shipper_package_code">HO</field>
+        <field name="name">(Schenker) Hobbock</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_17" model="product.packaging">
+        <field name="shipper_package_code">OP</field>
+        <field name="name">(Schenker) One-way pallet</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_18" model="product.packaging">
+        <field name="shipper_package_code">PK</field>
+        <field name="name">(Schenker) Package</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_19" model="product.packaging">
+        <field name="shipper_package_code">XP</field>
+        <field name="name">(Schenker) Pallet</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_20" model="product.packaging">
+        <field name="shipper_package_code">PZ</field>
+        <field name="name">(Schenker) Pipe</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_21" model="product.packaging">
+        <field name="shipper_package_code">RO</field>
+        <field name="name">(Schenker) Roll</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_22" model="product.packaging">
+        <field name="shipper_package_code">SK</field>
+        <field name="name">(Schenker) Sack</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+    <record id="schenker_packaging_23" model="product.packaging">
+        <field name="shipper_package_code">ZZ</field>
+        <field name="name">(Schenker) Other</field>
+        <field name="package_carrier_type">schenker</field>
+    </record>
+
+</odoo>
diff --git a/delivery_schenker/models/__init__.py b/delivery_schenker/models/__init__.py
new file mode 100644
index 0000000000..5915e82b1c
--- /dev/null
+++ b/delivery_schenker/models/__init__.py
@@ -0,0 +1,3 @@
+from . import delivery_carrier
+from . import product_packaging
+from . import schenker_request
diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
new file mode 100644
index 0000000000..ecac6bc950
--- /dev/null
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -0,0 +1,530 @@
+# Copyright 2021 Tecnativa - David Vidal
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from lxml import etree
+
+from odoo import _, api, fields, models
+from odoo.exceptions import UserError
+
+from .schenker_request import SchenkerRequest
+
+
+class DeliveryCarrier(models.Model):
+    _inherit = "delivery.carrier"
+
+    delivery_type = fields.Selection(selection_add=[("schenker", "DB Schenker")])
+    schenker_access_key = fields.Char(string="Access Key", help="Schenker Access Key")
+    schenker_group_id = fields.Char(string="Group")
+    schenker_user = fields.Char(string="User")
+    schenker_booking_type = fields.Selection(
+        selection=[
+            ("land", "Land"),
+            ("air", "Air"),
+            ("ocean_fcl", "Ocean FCL"),
+            ("ocean_lcl", "Ocean LCL"),
+        ],
+        default="land",
+        string="Booking Type",
+        help="Choose Scnecker booking type. Only land is currently suported",
+    )
+    schenker_barcode_format = fields.Selection(
+        selection=[("A4", "A4"), ("A6", "A6")], default="A6", string="Barcode Format",
+    )
+    schenker_barcode_mail = fields.Char(
+        string="Barcode Copy Email",
+        help="Optional: send a barcode copy to this email address",
+    )
+    schenker_barcode_a4_start_pos = fields.Integer(
+        string="Barcode Start Position",
+        default=1,
+        help="For A4 format you can define the starting position",
+    )
+    schenker_barcode_a4_separated = fields.Boolean(
+        string="Barcode Separated",
+        default=False,
+        help="For A4 define if the labels shall be printed on separate pages",
+    )
+    schenker_incoterm_id = fields.Many2one(
+        comodel_name="account.incoterms",
+        string="Default Incoterm",
+        help="It will be overriden by the sale order one if it's specified.",
+    )
+    schenker_service_type = fields.Selection(
+        string="Service Type",
+        help="Defines service type: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depending on "
+        "the Transport mode the service will be validated. For instance if the "
+        "transport mode is AIR, the service type P2P (PortToPort)",
+        selection=[
+            ("D2D", "Door-to-door"),
+            ("D2P", "Door-to-port"),
+            ("P2D", "Port-to-door"),
+            ("D2A", "Door-to-airport"),
+            ("A2D", "Airport-to-door"),
+            ("A2A", "Aiport-to-airport"),
+        ],
+    )
+    schenker_service_land = fields.Selection(
+        string="Land service",
+        help="Land shipping product options. Depending on your customer account, some "
+        "services could not be available",
+        selection=[
+            ("CON", "DBSchenkerconcepts"),
+            ("DIR", "DBSchenkerdirects"),
+            ("LPA", "DBSchenkerparcel Logistics Parcel"),
+            ("PAL", "DBSchenkerpallets"),
+            ("PRI", "DBSchenkerprivpark"),
+            ("auc0", "austroexpress PUNKT 10"),
+            ("auc2", "austroexpress PUNKT 12"),
+            ("auc8", "austroexpress PUNKT 8"),
+            ("aucc", "austroexpress PUNKT 17"),
+            ("auco", "austrocargo"),
+            ("ecsp", "SCHENKERsystem-plus"),
+            ("ect1", "DB SCHENKERspeed 10"),
+            ("ect2", "DB SCHENKERspeed 12"),
+            ("sch2", "DB SCHENKERtop 12"),
+            ("schs", "DB SCHENKERsystem international"),
+            ("sysd", "DB SCHENKERsystem domestic"),
+            ("scht", "DB SCHENKERtop"),
+            ("schx", "DB SCHENKERsystem fix"),
+            ("ecpa", "DB SCHENKERparcel"),
+            ("ect8", "DB SCHENKERspeed 8"),
+            ("ectn", "DB SCHENKERspeed"),
+            ("40", "DB SCHENKERsystem classic"),
+            ("41", "DB SCHENKERsystem speed"),
+            ("42", "DB SCHENKERsystem fixday"),
+            ("43", "DBSchenker System"),
+            ("44", "DBSchenker System Premium"),
+            ("71", "DB SCHENKERdirect"),
+        ],
+    )
+    schenker_service_air = fields.Selection(
+        string="Air service",
+        help="Air shipping product options. Depending on your customer account, some "
+        "services could not be available",
+        selection=[
+            ("f", "DB SCHENKERjetcargo first"),
+            ("s", "DB SCHENKERjetcargo special"),
+            ("b", "DB SCHENKERjetcargo business"),
+            ("e", "DB SCHENKERjetcargo economy"),
+            ("eagd", "DB SCHENKERjetexpress gold"),
+            ("easv", "DB SCHENKERjetexpress silver"),
+        ],
+    )
+    schenker_indoor_delivery = fields.Boolean(
+        string="Indoor Delivery", help="Defines if indoor delivery is required",
+    )
+    schenker_express = fields.Boolean(
+        string="Express", help="Defines if shipment is express",
+    )
+    schenker_food_related = fields.Boolean(
+        string="Food Related", help="Defines if shipment is food related",
+    )
+    schenker_heated_transport = fields.Boolean(
+        string="Heated Transport",
+        help="Defines if shipment is required heated transport",
+    )
+    schenker_home_delivery = fields.Boolean(
+        string="Home Delivery", help="Defines if shipment is required home delivery",
+    )
+    schenker_own_pickup = fields.Boolean(
+        string="Own Pickup", help="Defines if shipment is required own pickup",
+    )
+    schenker_pharmaceuticals = fields.Boolean(
+        string="Pharmaceuticals", help="Defines if shipment is pharmaceutical",
+    )
+    schenker_measure_unit = fields.Selection(
+        string="Measure Unit",
+        help="The proper request will be formed accordingly from the picking",
+        selection=[
+            ("VOLUME", "Volume"),
+            ("LOADING_METERS", "Loading meters"),
+            ("PIECES", "Pieces"),
+            ("PALLET_SPACE", "Pallet space"),
+        ],
+        default="VOLUME",
+    )
+    schenker_default_packaging_id = fields.Many2one(
+        comodel_name="product.packaging",
+        string="Default Package Type",
+        domain=[("package_carrier_type", "=", "schenker")],
+        help="If not delivery package or the package doesn't have defined the packaging"
+        "it will default to this type",
+    )
+
+    def _get_schenker_credentials(self):
+        """Access key is mandatory for every request while group and user are
+        optional"""
+        credentials = {
+            "prod": self.prod_environment,
+            "access_key": self.schenker_access_key,
+        }
+        if self.schenker_group_id:
+            credentials["group_id"] = self.schenker_group_id
+        if self.schenker_user:
+            credentials["user"] = self.schenker_user
+        return credentials
+
+    @api.model
+    def _schenker_log_request(self, schenker_request, picking):
+        """Helper to write raw request/response to the current picking. If debug
+        is active in the carrier, those will be logged in the ir.logging as well"""
+        schenker_last_request = schenker_last_response = False
+        try:
+            schenker_last_request = etree.tostring(
+                schenker_request.history.last_sent["envelope"],
+                encoding="UTF-8",
+                pretty_print=True,
+            )
+            schenker_last_response = etree.tostring(
+                schenker_request.history.last_received["envelope"],
+                encoding="UTF-8",
+                pretty_print=True,
+            )
+        # Don't fail hard on this. Sometimes zeep could not be able to keep history
+        except Exception:
+            return
+        # Debug must be active in the carrier
+        self.log_xml(schenker_last_request, "schenker_request")
+        self.log_xml(schenker_last_response, "schenker_response")
+
+    def _prepare_schenker_barcode(self):
+        """Always request the barcode label when generating the booking. We can choose
+        between two formats: A6 and A4, where an starting position can be set"""
+        vals = {
+            "barcodeRequest": self.schenker_barcode_format,
+        }
+        if self.schenker_barcode_mail:
+            vals["barcodeRequestEmail"] = self.schenker_barcode_mail
+        if self.schenker_barcode_format == "A6":
+            return vals
+        # This options only can be informed when the label format is A4
+        vals.update(
+            {
+                "start_pos": self.schenker_barcode_a4_start_pos,
+                "separated": self.schenker_barcode_a4_separated,
+            }
+        )
+        return vals
+
+    def _prepare_schenker_address(
+        self,
+        partner,
+        address_type="CONSIGNEE",
+        location_type="PHYSICAL",
+        person_type="COMPANY",
+    ):
+        """Generic for any address type. The address from the one receiving the goods.
+        Keep in mind that every country could have their own mandatory fields rules,
+        so the request could fail if those fields aren't filled on the contact. An
+        informative error should raise though.
+        :param res.partner record
+        :returns dicts with shipping address formated for Scheneket API
+        """
+        vals = {
+            "type": address_type,
+            "name1": partner.name,
+            "locationType": location_type,  # POSTAL or PHYSICAL
+            "personType": person_type,  # PERSON OR COMPANY
+            "street": partner.street,
+            "postalCode": partner.zip,
+            "city": partner.city,
+            "stateCode": partner.state_id.code,
+            "stateName": partner.state_id.name,
+            "countryCode": partner.country_id.code,
+            "preferredLanguage": self.env["res.lang"]._lang_get(partner.lang).iso_code,
+        }
+        # Optional stuff. The API doesn't like falsy or empty request fields
+        if partner.email:
+            vals["email"] = partner.email
+        if partner.mobile:
+            vals["mobilePhone"] = partner.mobile
+        if partner.phone:
+            vals["phone"] = partner.phone
+        if partner.street2:
+            vals["street2"] = partner.street2
+        return vals
+
+    def _schenker_shipping_address(self, picking):
+        """Each booking should have at least 2 addresses of types: SHIPPER and CONSIGNEE
+        Other options are: PICKUP, DELIVERY, NOTIFY, INVOICE and could be hooked to this
+        method to include them in the booking request.
+        :param picking record
+        :returns list of dicts with shipping addresses formated for Scheneket API
+        """
+        shipper_address = (
+            picking.picking_type_id.warehouse_id.partner_id
+            or picking.company_id.partner_id
+        )
+        consignee_address = picking.partner_id
+        return [
+            self._prepare_schenker_address(shipper_address, "SHIPPER"),
+            self._prepare_schenker_address(consignee_address),
+        ]
+
+    def _schenker_shipping_product(self):
+        """Gets the proper shipping product according to the shipping type
+        :returns string with shipping product code
+        """
+        type_mapping = {
+            "air": self.schenker_service_air,
+            "land": self.schenker_service_land,
+            "ocean_fcl": "fcl",
+            "ocean_lcl": "lcl",
+        }
+        return type_mapping[self.schenker_booking_type]
+
+    def _schenker_metric_system(self):
+        """
+        :returns string with schenker metric system (METRIC or IMPERIAL)
+        """
+        get_param = self.env["ir.config_parameter"].sudo().get_param
+        product_weight_in_lbs_param = get_param("product.weight_in_lbs", "0")
+        return "IMPERIAL" if product_weight_in_lbs_param == "1" else "METRIC"
+
+    def _schenker_pickup_dates(self, picking):
+        """Convert picking dates for schenker api. We're taking the whole delivery
+        day as picking windows, although a more complex solution could be provided.
+        :param picking record with picking to send
+        :returns dict values with the picking dates in iso format
+        """
+        date_from = fields.Datetime.context_timestamp(
+            self, picking.date_done.replace(hour=0, minute=0, second=0)
+        ).isoformat()
+        date_to = fields.Datetime.context_timestamp(
+            self, picking.date_done.replace(hour=23, minute=59, second=59)
+        ).isoformat()
+        return {
+            "pickUpDateFrom": date_from,
+            "pickUpDateTo": date_to,
+        }
+
+    def _schenker_shipping_information_package(self, picking, package):
+        weight = package.shipping_weight or package.weight
+        # Volume calculations can be unfolded with stock_quant_package_dimension
+        if hasattr(package, "volume"):
+            volume = round(package.volume, 2)
+        else:
+            volume = sum([q.quantity * q.product_id.volume for q in package.quant_ids])
+        return {
+            # Dangerous goods is not supported
+            "dgr": False,
+            "cargoDesc": picking.name + " / " + package.name,
+            "grossWeight": round(weight, 2),
+            # Default to 1 if no volume informed
+            "volume": volume,
+            "packageType": (
+                package.packaging_id.shipper_package_code
+                or self.schenker_default_packaging_id.shipper_package_code
+            ),
+            "stackable": (
+                package.packaging_id.schenker_stackable
+                or self.schenker_default_packaging_id.schenker_stackable
+            ),
+            "pieces": 1,
+        }
+
+    def _schenker_shipping_information(self, picking):
+        """When we don't use delivery packages, we'll deliver everything in one single
+        shipping info. Otherwise, we'll get the info for each package.
+        :param picking record with picking to deliver
+        :returns list of dicts with delivery packages shipping info
+        """
+        if picking.package_level_ids and picking.package_ids:
+            return [
+                self._schenker_shipping_information_package(picking, package)
+                for package in picking.package_ids
+            ]
+        weight = picking.shipping_weight or picking.weight
+        # Obviously products should be well configured. This parameter is mandatory.
+        volume = sum(
+            [
+                ml.product_uom_id._compute_quantity(ml.qty_done, ml.product_id.uom_id)
+                * ml.product_id.volume
+                for ml in picking.move_line_ids
+            ]
+        )
+        return [
+            {
+                # Dangerous goods is not supported
+                "dgr": False,
+                "cargoDesc": picking.name,
+                # For a more complex solution use packaging properly
+                "grossWeight": round(weight / picking.number_of_packages, 2),
+                "volume": round(volume, 2) or 0.01,
+                "packageType": self.schenker_default_packaging_id.shipper_package_code,
+                "stackable": self.schenker_default_packaging_id.schenker_stackable,
+                "pieces": picking.number_of_packages,
+            }
+        ]
+
+    def _schenker_measures(self, picking):
+        """Only volume is supported as a pallet calculations structure should be
+        provided to use the other API options. This hook can be used to communicate
+        with the API in the future
+        :param picking record with picking to deliver
+        :returns dict values for the proper unit key and value
+        """
+        if self.schenker_measure_unit == "VOLUME":
+            return {
+                "measureUnitVolume": round(picking.volume, 2) or 0.01,
+            }
+        return {}
+
+    def _prepare_schenker_shipping(self, picking):
+        """Convert picking values for schenker api
+        :param picking record with picking to send
+        :returns dict values for the connector
+        """
+        self.ensure_one()
+        # We'll compose the request via some diferenced parts, like label settings,
+        # address options, incoterms and so. There are lots of thing to take into
+        # account to acomplish a properly formed request.
+        vals = {}
+        vals.update(self._prepare_schenker_barcode())
+        vals.update(
+            {
+                "address": self._schenker_shipping_address(picking),
+                "incoterm": (
+                    picking.sale_id.incoterm.code or self.schenker_incoterm_id.code
+                ),
+                # A maximum of 35 characters is supported
+                "incotermLocation": picking.partner_id.display_name[:35],
+                "productCode": self._schenker_shipping_product(),
+                "measurementType": self._schenker_metric_system(),
+                "grossWeight": round(picking.shipping_weight, 2),
+                "shippingInformation": {
+                    "shipmentPosition": self._schenker_shipping_information(picking),
+                    "grossWeight": round(picking.shipping_weight, 2),
+                    "volume": round(picking.volume, 2) or 0.01,
+                },
+                "measureUnit": self.schenker_measure_unit,
+                # Customs Clearance not supported for now as it needs a full customs
+                # implementation
+                "customsClearance": False,
+                # Defines a business scenario where the Schenker customer sends a
+                # booking request in the name of his ordering party
+                "neutralShipping": False,
+                "pickupDates": self._schenker_pickup_dates(picking),
+                # Not supported for the moment
+                "specialCargo": False,
+                "specialCargoDescription": False,
+                "serviceType": self.schenker_service_type,
+                "indoorDelivery": self.schenker_indoor_delivery,
+                "express": self.schenker_express,
+                "foodRelated": self.schenker_food_related,
+                "heatedTransport": self.schenker_heated_transport,
+                "homeDelivery": self.schenker_home_delivery,
+                "ownPickup": self.schenker_own_pickup,
+                "pharmaceuticals": self.schenker_pharmaceuticals,
+            }
+        )
+        vals.update(self._schenker_measures(picking))
+        return vals
+
+    def schenker_send_shipping(self, pickings):
+        """Send booking request to Schenker
+        :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.
+        """
+        schenker_request = SchenkerRequest(**self._get_schenker_credentials())
+        result = []
+        for picking in pickings:
+            vals = self._prepare_schenker_shipping(picking)
+            vals.update({"tracking_number": False, "exact_price": 0})
+            try:
+                response = schenker_request._send_shipping(
+                    vals, self.schenker_booking_type
+                )
+            except Exception as e:
+                raise (e)
+            finally:
+                self._schenker_log_request(schenker_request, picking)
+            if not response:
+                result.append(vals)
+                continue
+            vals["tracking_number"] = response.get("booking_id")
+            # 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 = _("Schenker Shipping barcode document")
+            attachment = []
+            if response.get("barcode"):
+                attachment = [
+                    (
+                        "schenker_label_{}.pdf".format(response.get("booking_id")),
+                        response.get("barcode"),
+                    )
+                ]
+            picking.message_post(body=body, attachments=attachment)
+            result.append(vals)
+        return result
+
+    def schenker_cancel_shipment(self, pickings):
+        """Cancel the expedition
+        :param pickings - stock.picking recordset
+        :returns pdf file
+        """
+        schenker_request = SchenkerRequest(**self._get_schenker_credentials())
+        for picking in pickings.filtered("carrier_tracking_ref"):
+            try:
+                schenker_request._cancel_shipment(picking.carrier_tracking_ref)
+            except Exception as e:
+                raise (e)
+            finally:
+                self._schenker_log_request(schenker_request, picking)
+        return True
+
+    def schenker_get_label(self, reference, reference_type):
+        """Generate label for picking
+        :param picking - stock.picking record
+        :returns pdf file
+        """
+        self.ensure_one()
+        if not reference:
+            return False
+        schenker_request = SchenkerRequest(**self._get_schenker_credentials())
+        label = schenker_request._shipping_label(reference, reference_type)
+        if not label:
+            return False
+        return label
+
+    def schenker_get_tracking_link(self, picking):
+        """Provide tracking link for the customer"""
+        return (
+            "https://eschenker.dbschenker.com/app/tracking-public/?refNumber=%s"
+            % picking.carrier_tracking_ref
+        )
+
+    def schenker_tracking_state_update(self, picking):
+        """Tracking state update"""
+        # TODO: To be implemented
+        return
+
+    def schenker_rate_shipment(self, order):
+        """There's no public API so another price method should be used."""
+        raise NotImplementedError(
+            _(
+                "Schenker 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."
+            )
+        )
+
+    # UX Control over not implemented features.
+
+    @api.onchange("schenker_booking_type")
+    def onchange_schenker_booking_type(self):
+        """Avoid by UX that the user could choose another shipping method. In
+        the future, this can be removed as long as those method have the proper
+        support"""
+        if self.schenker_booking_type != "land":
+            raise UserError(_("Only land shipping is currently supported"))
+
+    @api.onchange("schenker_measure_unit")
+    def onchange_schenker_measure_unit(self):
+        """Avoid by UX that the user could choose another measure unit. Proper pallet
+        calculation structure should be provided to use the other API options. A hook
+        method is provided though."""
+        if self.schenker_measure_unit != "VOLUME":
+            raise UserError(_("Only volume is currently supported"))
diff --git a/delivery_schenker/models/product_packaging.py b/delivery_schenker/models/product_packaging.py
new file mode 100644
index 0000000000..c41b202a11
--- /dev/null
+++ b/delivery_schenker/models/product_packaging.py
@@ -0,0 +1,14 @@
+# Copyright 2021 Tecnativa - David Vidal
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+from odoo import fields, models
+
+
+class ProductPackaging(models.Model):
+    _inherit = "product.packaging"
+
+    package_carrier_type = fields.Selection(
+        selection_add=[("schenker", "DB Schenker")],
+    )
+    schenker_stackable = fields.Boolean(
+        string="Stackable", help="Define if the package is stackable by default",
+    )
diff --git a/delivery_schenker/models/schenker_request.py b/delivery_schenker/models/schenker_request.py
new file mode 100644
index 0000000000..3aca07c780
--- /dev/null
+++ b/delivery_schenker/models/schenker_request.py
@@ -0,0 +1,190 @@
+# Copyright 2021 Tecnativa - David Vidal
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+import binascii
+import logging
+from xml.etree import ElementTree as ET
+
+from zeep import Client, Settings
+from zeep.exceptions import Fault
+from zeep.plugins import HistoryPlugin
+
+from odoo import _
+from odoo.exceptions import ValidationError
+
+_logger = logging.getLogger(__name__)
+
+SCHENKER_API_URL = {
+    "test": "https://eschenker-fat.dbschenker.com",
+    "prod": "https://eschenker.dbschenker.com",
+}
+SCHENKER_API_SERVICE = {
+    "booking": "/webservice/bookingWebServiceV1_1?wsdl",
+    "tracking": "/webservice/bookingWebServiceV1_1?wsdl",
+}
+
+
+class SchenkerRequest:
+    """Interface between Schenker SOAP API and Odoo recordset
+       Abstract Schenker 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, access_key=None, group_id=None, user=None, prod=False, service="booking"
+    ):
+        self.access_key = access_key or ""
+        self.group_id = group_id or ""
+        self.user = user or ""
+        self.service = service
+        api_env = "prod" if prod else "test"
+        self.history = HistoryPlugin(maxlen=10)
+        settings = Settings(strict=False, xml_huge_tree=True)
+        self.client = Client(
+            wsdl=SCHENKER_API_URL[api_env] + SCHENKER_API_SERVICE[service],
+            settings=settings,
+            plugins=[self.history],
+        )
+
+    def _process_reply(self, service, vals=None):
+        """Schenker API returns error petitions as server exceptions wich makes zeep to
+        raise a Fault exception as well. To catch the error info we need to make a
+        raw_response request and the extract the error codes from the response."""
+        try:
+            response = service(vals)
+        except Fault as e:
+            with self.client.settings(raw_response=True):
+                response = service(vals)
+                try:
+                    root = ET.fromstring(response.text)
+                    error_text = next(root.iter("faultstring")).text
+                    error_message = next(root.iter("message")).text
+                    error_code = next(root.iter("code")).text
+                    raise ValidationError(
+                        _(
+                            "Error in the request to the Schenker API. This is the "
+                            "thrown message:\n\n"
+                            "[%s]\n"
+                            "%s - %s" % (error_text, error_code, error_message)
+                        )
+                    )
+                except ValidationError:
+                    raise
+                # If we can't get the proper exception, fallback to the first
+                # exception error traceback
+                except Exception:
+                    raise Fault(e)
+        return response
+
+    # Booking API methods
+
+    def _shipping_type_method(self, method):
+        """Map shipping method with API method. Note that currently only land
+        is supported. Default to land to ensure a method is provided.
+        :params string with shipping method
+        :returns string with the mapped key value for the proper method
+        """
+        method_map = {
+            "land": "getBookingRequestLand",
+            "air": "getBookingRequestAir",
+            "ocean_fcl": "getBookingRequestOceanFCL",
+            "ocean_lcl": "getBookingRequestOceanLCL",
+        }
+        return method_map.get("method", "getBookingRequestLand")
+
+    def _shipping_api_credentials(self):
+        """Each API has a different credentials SOAP declaration"""
+        credentials = {"applicationArea": {"accessKey": self.access_key}}
+        if self.user:
+            credentials["applicationArea"]["userId"] = self.user
+        if self.group_id:
+            credentials["applicationArea"]["groupId"] = self.group_id
+        return credentials
+
+    def _scheneker_shipping_api_wrapper(self, method=False):
+        """Aside from a different API method, each one has its own wrapper"""
+        booking_wrapper_map = {
+            "land": "bookingLand",
+            "air": "bookingAir",
+            "ocean_fcl": "bookingOceanFCL",
+            "ocean_lcl": "bookingOceanLCL",
+        }
+        return booking_wrapper_map.get(method, "land")
+
+    def _send_shipping(self, picking_vals, method=False):
+        """Create new shipment
+        :params vals dict of needed values
+        :returns dict with Schenker response containing the shipping code and label
+        """
+        vals = self._shipping_api_credentials()
+        method_wrapper = self._scheneker_shipping_api_wrapper(method)
+        vals[method_wrapper] = picking_vals
+        # From the Schenker docs:
+        # Defines if booking shall be submitted. If false, the booking can be edited
+        # in the frontend and MUST be submitted manually.
+        vals[method_wrapper].update({"submitBooking": True})
+        response = self._process_reply(
+            self.client.service[self._shipping_type_method(method)], vals
+        )
+        return {
+            "booking_id": response.bookingId,
+            "barcode": response.barcodeDocument,
+        }
+
+    def _shipping_label(self, reference_list=None):
+        """Get shipping label for the given ref
+        :param list reference -- shipping reference list
+        :returns: base64 with pdf labels
+        """
+        reference_list = reference_list or []
+        vals = self._shipping_api_credentials()
+        vals.update({"barcodeRequest": [{"booking_id": ref} for ref in reference_list]})
+        label = self._process_reply(
+            self.client.service.getBookingRequestLand, vals
+        ).document
+        return label and binascii.a2b_base64(label)
+
+    def _cancel_shipment(self, reference=False):
+        """Cancel de expedition for the given ref
+        :param str reference -- booking reference string
+        :returns: bool True if success
+        """
+        vals = self._shipping_api_credentials()
+        vals.update({"cancelRequest": {"bookingId": reference}})
+        response = self._process_reply(
+            self.client.service.getBookingCancelRequest, vals
+        )
+        # TODO: Inspect typical response as we don't want to return a zeep  object.
+        # Anyway, it's going to fail if the booking can't be cancelled. So either we
+        # receive an exception error or the booking is cancelled.
+        return bool(response)
+
+    # Tracking API methods
+
+    def _tracking_api_credentials(self):
+        """Each API has a different credentials SOAP declaration"""
+        credentials = {"accessKey": self.access_key, "in": {}}
+        if self.user:
+            credentials["in"].setdefault("applicationArea", {})
+            credentials["in"]["applicationArea"]["userId"] = self.user
+        if self.group_id:
+            credentials["in"].setdefault("applicationArea", {})
+            credentials["in"]["applicationArea"]["groupId"] = self.group_id
+        return credentials
+
+    def _get_shipment_details(self, reference=False, reference_type="BID"):
+        vals = self._shipping_api_credentials()
+        vals["in"]["referenceNumber"] = reference
+        response = self._process_reply(
+            self.client.service.getPublicServiceShipmentDetails, vals
+        )
+        return response
+
+    def _get_tracking_states(self, reference=False):
+        # TODO: Test Shipping API isn't connected to Test Booking API
+        if not reference:
+            return {}
+        # response = self._get_shipment_details(reference)
+        # It should come from ShipmentInfo.ShipmentBasicInfo.StatusEventList
+        return {}
diff --git a/delivery_schenker/readme/CONFIGURE.rst b/delivery_schenker/readme/CONFIGURE.rst
new file mode 100644
index 0000000000..7778ddc6d6
--- /dev/null
+++ b/delivery_schenker/readme/CONFIGURE.rst
@@ -0,0 +1,10 @@
+To configure a Schenker delivery method:
+
+#. Go to *Inventory > Configuration > Delivery > Shipping methods* and create a new one.
+#. Choose *DB Schenker* as provider.
+#. Configure the service parameters according to your contract considerations.
+#. Choose a delivery product and a default packaging. This is mandatory for the booking
+   request as it needs the packaging code.
+
+To make tests, set the carrier environment to test from the smart button. Don't forget
+to set it to production once you're ready to use the delivery method!
diff --git a/delivery_schenker/readme/CONTRIBUTORS.rst b/delivery_schenker/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000000..94b6ba9536
--- /dev/null
+++ b/delivery_schenker/readme/CONTRIBUTORS.rst
@@ -0,0 +1,3 @@
+* `Tecnativa <https://www.tecnativa.com>`_:
+
+  * David Vidal
diff --git a/delivery_schenker/readme/DESCRIPTION.rst b/delivery_schenker/readme/DESCRIPTION.rst
new file mode 100644
index 0000000000..03b9b125f3
--- /dev/null
+++ b/delivery_schenker/readme/DESCRIPTION.rst
@@ -0,0 +1,2 @@
+This module links the `DB Schenker <https://www.dbschenker.com>`_ booking and tracking
+APIs with Odoo delivery system.
diff --git a/delivery_schenker/readme/INSTALL.rst b/delivery_schenker/readme/INSTALL.rst
new file mode 100644
index 0000000000..5652116f35
--- /dev/null
+++ b/delivery_schenker/readme/INSTALL.rst
@@ -0,0 +1,5 @@
+This module depends on the `zeep` python library and the OCA/delivery-carrier
+`delivery_package_number` and `delivery_state` modules.
+
+The Schenker API doesn't provide delivery rating methods, so OCA's
+`delivery_price_method` is advised in order to use this carrier in a sales workflow.
diff --git a/delivery_schenker/readme/ROADMAP.rst b/delivery_schenker/readme/ROADMAP.rst
new file mode 100644
index 0000000000..cfd14730ec
--- /dev/null
+++ b/delivery_schenker/readme/ROADMAP.rst
@@ -0,0 +1,22 @@
+* There's no dummy access key to test API calls so no tests can be performed.
+* The test booking and shipping APIs databases aren't connected so it isn't possible to
+  perform trackings on test mode.
+* Only land shipping is implemented, although the module is prepared for extend to
+  air and ocean just considering the mandatory request fields for those methods.
+  Some additional adaptations could be needed (e.g.: origin and destination airport,
+  port) anyway.
+* Only volume is supported as a measure unit and with the limitations of Odoo itself. To
+  enjoy a full fledged volume support, install and configure the OCA’s
+  `stock_quant_package_dimension` module and its dependencies. The connector is ready to
+  make use of their volume computations.
+* It’d be needed to extend the method to support Schenker measure units such as  loading
+  pieces or pallet space.
+* Some more booking features aren’t yet supported although can be extended in the
+  future. Some of those, although the complete list would be really extensive:
+
+  * Dangerous goods.
+  * Driver pre-advise.
+  * Transport temperature.
+  * Customs clearance.
+  * Cargo insurance.
+  * Cash on delivery.
diff --git a/delivery_schenker/readme/USAGE.rst b/delivery_schenker/readme/USAGE.rst
new file mode 100644
index 0000000000..cffac6611a
--- /dev/null
+++ b/delivery_schenker/readme/USAGE.rst
@@ -0,0 +1,41 @@
+These are the operations possible with this module:
+
+Place shipping bookings
+~~~~~~~~~~~~~~~~~~~~~~~
+
+#. When the picking is validated, the shipping will be booked at Schenker.
+#. With the response, we'll receive the delivery tracking number and the pdf label in a
+   chatter message and it will be kept as attachment to the document.
+#. You can manage packages number either with the proper Odoo workflows or with the
+   package number field available in the *Additional Info* tab. You'll get as many
+   labels as declared packages.
+
+Cancel bookings
+~~~~~~~~~~~~~~~
+
+#. As in other carriers, we can cancel the shipping after the picking is done. To do
+   so, go to *Additional Info* tab and click on the *Cancel* action on the side of the
+   tracking number.
+#. We can generate a new shipping if necessary.
+
+Get labels
+~~~~~~~~~~
+
+#. If by chance we delete the generated labels, we can obtain them again hitting the
+   *Schenker Label* buttons in the header of the picking form.
+
+Tracking
+~~~~~~~~
+
+#. The module is integrated with `delivery_state` to be able to get the tracking info
+   directly from the DB Schenker API.
+#. To do so, go to a picking shipped with Schenker. In the *Additional Info* tab you'll
+   find an action button to *Update tracking state* so the state will be updated from
+   the Schenker API.
+
+Debugging
+~~~~~~~~~
+
+The API calls and responses are tracked in two special fields in the picking that can
+be viewed by technical users. You can also log them in as `ir.logging` records setting
+the carrier debug on from the smart button.
diff --git a/delivery_schenker/static/description/icon.png b/delivery_schenker/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3b8b0ff9771f63ddea1e37bd173ff823d86a7a9
GIT binary patch
literal 3740
zcmdT{_cvTy8$No8nk#w;(aC5x!eB%jHClvGLqto=U<gr0FIN~P1&Nx77A?wz$q*$B
zksx~X5{x>C-r_sCKYstgJ!|c=*D1TK{k~6m6U<EXm>GE)0RUh&(ATj5`}9AJo))~T
zQTWb-9fOa)jUNE8-}=)iT2!1|z?VG!x(NT<-fsSZ&S+O4Ffb6}iF)Yg;_TxJ@kYC6
zk=1wsfJM?kN7M3g_Qphr*==h9x~<I~(VG&f-|yWNmY;V?2;g#fbc>6lcqqBABC(_Y
zjn#$%#zS=wQgMmPNW6~xp(B|*bU9}Psi(>K5h{biSYDIilpMBNr@U0bXi=9>%`En`
zb4(*uTAuA``t9<alW+Hpd(U!0Sbp_1k*295<%vE<c6NNfc6Q7yETVQueV^}DN2E?m
za4;_WLq){I?zKkIm`S}DP<kzm&`aiT9mhR%R?4FDdb5xrt*p!qFJQl2Y(nGn??=tx
zU?>M8&Bcos<$`xTN-U)$IG#l2T*H^y$Z%#Fi&<J*7nGMXaVFBJsHkK@A4yR^`_jJD
zlNCQSWGQ3cz!n)9Nu_@G*M<8y+iI6imW8FId!v;OY#)#lL}H2{Ym=kKcfYF#5v!{Y
zvXy-)!(2L(3(eBP6v3sGb4=(jU%qS%$za_L?NV=dtDX8JCGu9|3vDpv!n97Su)W!P
zdM*x`HX52lAI<;vV{D#mNBJ<dQ7`R}<U0{BCxUtmgjo`z&fkc$$px|;RO_Grf+3RT
zjtBn!VH(=w3$4t?&V07o7NsW6o_A`Tdi{KwXX2D3@6Bja#!%7xk{+P9&7zRsx3(9j
zEv6c|W#@Eq%6&>q(O%A_{PZ&|Y;li05f_+y9FxjMU385q+eBGb=_3~-Wy}`c6$uXV
zNy9j!n-bxGUAJo}8o*B$jvZ+$dgTd5?`TEW4~hgb2#z4MNE$W0d$3xB^ONufl7)H9
zOw5e%@*>yV4bL}2UO@+&@534@NH7H+aM{n8F&j3$&gts@vS=xM;uc=YU)iauq#Z|-
z*uR~3HofNyb*@rNUMn>UfxQb_Io?|<dH1fZzd+BIJgJg`yLRnbNlD2~8ylY0)zw*l
zX!veJ`<-SQ>E%7+l4Jq+RuOZmXMrl;21{L)E!D`#l9g;Sck+AhPcbzMz$w9DPsOgX
zCE!pouhScaf}_z2mQt7I=jT&XQzJ4nxjk^U*=j)ph5NOAFl{X@%Ap6>nP{oROmmaW
z3*bTu3KwxW900s9q`}*>;O&#WKOGSZ!vg|7)FH=eTmhhLm{F5W4F)@$r2<;OjTe5f
zb`0v+a8F1{iN8Y64fQV>a+BkJ3sVhPPaV&C^-AvXmJ@vx5FQ@>{P}YLh-2nk@`aRH
zRZs%!Q-o2ZotYUM9LpQ4;<q$A+Zqi!heU)irRUSf81pfot0=P9V5DcoDS^yV=F7Sv
zQ>y<6Qx{&m_f3x4wK8CAq46}j@29x9xXS@~3Z<757e{N4N9zVRAt#hXL`CP8`wJR&
zJ{IEfJWF<ZMp-?ygeexn6xoX8qx=>bK$s%o0}gssH=V%I8t<xl+&-Tk?f9+?hypF(
zE>klz51%bj0U*vFJ$fVofe?3B2CLos1o95%1~D?;37`E_&r!l)l28FZx~19PA0{}i
z<zQzB`zcL+*hL#8@>+LyHvn9PC$)@J*s%);Bwyfy<d>Atx3;zdQ0?^ebg@|P?fDKw
z&3y)1X5JVg5zY_wrxy|uf?=n!l9HHW;^IEm-O5((uSk}UTl|`F6#`+AmzRfO({ghm
zXOl+hGOb_;CtMtCZF%EZ1<3<So&zHFP%Jz;a0bKWR?8z8ek#AeIm22!m{30*e8G>@
zyXT3rkD>u;<~~Q*wW70+dXcIG^d%53vtB58XYRdH^(&%0zrHjdc$N!>HDF>ApFGhD
z4OP3Zz_S~yUSygFK~6LVDWawu831k-v<U2Y`6|5@N!P&Mp5LuEdu6a8w;WMTX>M-r
zIQ+_3OhjC~ps|tvi9lshh=rM11eWgx<+9o>)L2d7=s3*<&e^&65d8O5F%c1JNl8fn
z8hyj<8#mB$v_ooobvtk}N^}xx2mpkzDI}q`kmkln)5ZYjVR0dd^tl~`!x{sT+tA2J
z-notX{{8z`R8)8r#x`m(o}Q(<q2x)tMai*+qhoSWk=V-KSgrfX`t3V+76;rHy3$a3
zasZnyJ4-y3xM{8qNcPhqn@z9-%<-;g`Q2s#fQ_9!vaL;vnwt7?xizR6Ys<?XCBqL=
zTtW|~Hlicp1uK3gf%BX)kB^MjdXIm{`#7SA81H6=xldQBPIUG3T#kM%4$L2xRejPj
zG-L!14vj|3xe%EEpCes8I6S!Nyf`mxd~F=!;1V#_9IhdN*)^|+7WDt~?VGVOKa1CR
z9RqFj>pqOTySvdt!sMhq6OTf>%UMow7c-yIY%G_fPuW8ckCr;mL7$EB>!D|lNa8YY
zB<}644x@0GxqYF(AEMH7FLVn`m&$+6hX!+ZV{~)$O6?NQlEXJUus41$?L5x9;SC2N
z{Z+NLsED@Ky$|l}EELh(f#TB82-}pr3xY@J>d$@iV>~HWTRWP>*ES`~4QlHN60)(e
zakx8Zy4}HbH@~2ODlIKdLRwlIjjriC0gps)!*d1Ct@y3!CL|sNuy2w;r03TwdD&Nx
zHJJIurYe+<dHbvD4}CzEyYK2MBqPHFfb{14H!lTnFcaQvIfHQ+$$0ZdcxY%yKjnqA
z_5N5fm_Y7*xi18siJOvfO48C728(V{0hv8ZuxOk|zwipj`R|iWm$i`!fwg+?8L~o#
zcwT5t=f|!teXq#|cJKlsj4~k1ryFtP_2S=jC#4eyVGFE#n8)$MQtGapUsD8B!EIDE
z?ej`WOBa4nbngWKB9>1acUjq|Wev0H4{awB4O6zZwqPe9b+)&+>$93BqF)-vZA{dM
zH2ug^@e^~z?A=+}dvZzI=k##fagB~uU|k`DthYx7i8nX=cM#|S4A)G-2!o<uwKVL|
zoWuHK*h;xKl&-VB*!Sv5l?5T+vhBRuhJ4veNqLQL)(aVnJTHEK`DA|otyt25=Q`$O
z-+AT}M*r3=T`w=01+)r_AWQ}+__qgJL~mg5D1lH@bJ51e2Jz8fQdn5nXM0}v50@k)
zBz#}ngJEZ$&ClOkDH#(L5ouqP!l~kHv5k#tYQMU!I!^H^@?uNM%iCL{>6~%4^4`;G
z{2F2WtZG{kc1Qz*gs)AF5C`jsKtn^rwzk*{X&D)GSv_&?xk0p|qN0v>*8w0igP$3@
z-kr+6zM8q6Bu~s<3J7rRqVHqfkO-(f{L52tBRr_74`%JssSxsr*(FK-VJqa%4<pck
zr=9pk5=qfNEdR&PtBQ)Z-(glui`7O1lzk%Pi3l^Z)FCSnv<i+^R_S%f{x`bd>@u8*
zooAFzw9%mDLztK(4_TR;&(&-`S{pH#sI#pYf`J@ZsxB*=B2WAQa^_2TLE5-`&#Ml8
z7CLb0921f+MC!#8aICLy^$;f?pEP!KXsBIFTYHMQ%b9mQT|!IXoJ}imsV&^9Z}Yn<
zgC^r)-(!x~x~f8}7=q@zevjbB?q^>Y5qPxdNTq``4irTiP$I=FrC!)IS(N&#cJCHf
z;u6I{h5L2v_SUxI540BQKV7N`+;nW*Ci0yrWPrI@Zc_^nJ{vHS#oM3mcC2l>sK_d{
z?S8ie>7Tv~)_*eUro&#NITz8~JW=G>tW-cBvp%x&j*vw|`2L$@Ep&l3ezgppvg4=B
z55`UhgHbQHlCHD8CJ?&S>Nu(mnn>k<b?()*H46Xf8aZyJfwTPaaoZJ^v#q($4&=XZ
zb#?lQ;V%qhOG+f<h{vbjRY4E@0LP0&A_qzh3i=zSqH7Q`9uFQw<>d*2(*pU`)#e}Z
zWmaW{rhkzq#h!i1A6zlJdv|mDIWHR<04fgO4V1nh!<R+0j-H;;^#Fpy@i|4rYwdU~
z4&4+D7p~3bWp{<wd!spm1`>{8)g<Yr-|gJx=aaM{iy2#4$`r59$NK{X(W6^XgcH-~
zl5AAdgzyRJ;%N$YD^I;(Qw#h8LjVXnK2&)K-G`^=Q4Z(ZGcSLom+(DlsdL>5_fq=T
zF-jt09w+{;O#QE$<Nx#bvESTknRofS)QN7jn)@5|Gc3DmUFt=Zl`J)2)$+Qi$St3w
zMP|Q#{W|C(qns38A|5=DTI$P7dH$T^PwkS+cSHlmQ$j{YM^lpm?dK;XM?`pfN?KJp
zVq02nax>8`?*+%i#+rBiqX*iZii(Po(o)T!AQe#P6F_7+cR!cRX{C%97_i{R!a?ed
z%#}T&VPs)}ySa%K8NZ|i>Z54@FnNC9{lr1j<1^PrgOEw5$dbUHNd8-awRd*@-0l>N
fw<vx7;Y^U~<y5R;s;&-LSpo*SCOVZ`PEr2@0u|wd

literal 0
HcmV?d00001

diff --git a/delivery_schenker/static/description/icon.svg b/delivery_schenker/static/description/icon.svg
new file mode 100644
index 0000000000..bbca8a0869
--- /dev/null
+++ b/delivery_schenker/static/description/icon.svg
@@ -0,0 +1,528 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="112.5"
+   inkscape:export-xdpi="112.5"
+   inkscape:export-filename="/home/david/odoo/oca13/odoo/custom/src/delivery-carrier/delivery_schenker/static/description/icon.png"
+   inkscape:version="1.1-dev (1:1.0+devel+202007152027+7044d6c)"
+   sodipodi:docname="icon.svg"
+   id="svg178"
+   version="1.1"
+   viewBox="0 0 96 96"
+   height="96pt"
+   width="96pt">
+  <sodipodi:namedview
+     inkscape:current-layer="svg178"
+     inkscape:window-maximized="1"
+     inkscape:window-y="27"
+     inkscape:window-x="1973"
+     inkscape:cy="69.540525"
+     inkscape:cx="72.536117"
+     inkscape:zoom="2.3367669"
+     showgrid="false"
+     id="namedview180"
+     inkscape:window-height="1016"
+     inkscape:window-width="1867"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0"
+     guidetolerance="10"
+     gridtolerance="10"
+     objecttolerance="10"
+     borderopacity="1"
+     bordercolor="#666666"
+     pagecolor="#ffffff" />
+  <defs
+     id="defs155">
+    <clipPath
+       id="clip1">
+      <path
+         id="path2"
+         d="M 0 1.5 L 96 1.5 L 96 94.5 L 0 94.5 Z M 0 1.5 " />
+    </clipPath>
+    <clipPath
+       id="clip2">
+      <path
+         id="path5"
+         d="M 0 91.5 L 0 4.5 C 0 4.003906 0.113281 3.523438 0.34375 3.066406 C 0.570312 2.605469 0.894531 2.199219 1.316406 1.847656 C 1.738281 1.496094 2.226562 1.226562 2.777344 1.035156 C 3.328125 0.84375 3.902344 0.75 4.5 0.75 L 91.5 0.75 C 92.097656 0.75 92.671875 0.84375 93.222656 1.035156 C 93.773438 1.226562 94.261719 1.496094 94.683594 1.847656 C 95.105469 2.199219 95.429688 2.605469 95.65625 3.066406 C 95.886719 3.523438 96 4.003906 96 4.5 L 96 91.5 C 96 91.996094 95.886719 92.476562 95.65625 92.933594 C 95.429688 93.394531 95.105469 93.800781 94.683594 94.152344 C 94.261719 94.503906 93.773438 94.773438 93.222656 94.964844 C 92.671875 95.15625 92.097656 95.25 91.5 95.25 L 4.5 95.25 C 3.902344 95.25 3.328125 95.15625 2.777344 94.964844 C 2.226562 94.773438 1.738281 94.503906 1.316406 94.152344 C 0.894531 93.800781 0.570312 93.394531 0.34375 92.933594 C 0.113281 92.476562 0 91.996094 0 91.5 Z M 0 91.5 " />
+    </clipPath>
+    <linearGradient
+       gradientTransform="matrix(0.75,0,0,0.75,0,1.5)"
+       y2="-0.999997"
+       x2="126.999997"
+       y1="124.999997"
+       x1="1.000003"
+       gradientUnits="userSpaceOnUse"
+       id="linear0">
+      <stop
+         id="stop8"
+         style="stop-color:rgb(32.899475%,33.299255%,32.899475%);stop-opacity:1;"
+         offset="0" />
+      <stop
+         id="stop10"
+         style="stop-color:rgb(33.01239%,33.418274%,33.01239%);stop-opacity:1;"
+         offset="0.015625" />
+      <stop
+         id="stop12"
+         style="stop-color:rgb(33.241272%,33.657837%,33.241272%);stop-opacity:1;"
+         offset="0.03125" />
+      <stop
+         id="stop14"
+         style="stop-color:rgb(33.468628%,33.895874%,33.468628%);stop-opacity:1;"
+         offset="0.046875" />
+      <stop
+         id="stop16"
+         style="stop-color:rgb(33.69751%,34.135437%,33.69751%);stop-opacity:1;"
+         offset="0.0625" />
+      <stop
+         id="stop18"
+         style="stop-color:rgb(33.924866%,34.375%,33.924866%);stop-opacity:1;"
+         offset="0.078125" />
+      <stop
+         id="stop20"
+         style="stop-color:rgb(34.153748%,34.613037%,34.153748%);stop-opacity:1;"
+         offset="0.09375" />
+      <stop
+         id="stop22"
+         style="stop-color:rgb(34.381104%,34.8526%,34.381104%);stop-opacity:1;"
+         offset="0.109375" />
+      <stop
+         id="stop24"
+         style="stop-color:rgb(34.609985%,35.092163%,34.609985%);stop-opacity:1;"
+         offset="0.125" />
+      <stop
+         id="stop26"
+         style="stop-color:rgb(34.837341%,35.3302%,34.837341%);stop-opacity:1;"
+         offset="0.140625" />
+      <stop
+         id="stop28"
+         style="stop-color:rgb(35.066223%,35.569763%,35.066223%);stop-opacity:1;"
+         offset="0.15625" />
+      <stop
+         id="stop30"
+         style="stop-color:rgb(35.293579%,35.809326%,35.293579%);stop-opacity:1;"
+         offset="0.171875" />
+      <stop
+         id="stop32"
+         style="stop-color:rgb(35.522461%,36.047363%,35.522461%);stop-opacity:1;"
+         offset="0.1875" />
+      <stop
+         id="stop34"
+         style="stop-color:rgb(35.749817%,36.286926%,35.749817%);stop-opacity:1;"
+         offset="0.203125" />
+      <stop
+         id="stop36"
+         style="stop-color:rgb(35.978699%,36.526489%,35.978699%);stop-opacity:1;"
+         offset="0.21875" />
+      <stop
+         id="stop38"
+         style="stop-color:rgb(36.206055%,36.764526%,36.206055%);stop-opacity:1;"
+         offset="0.234375" />
+      <stop
+         id="stop40"
+         style="stop-color:rgb(36.434937%,37.004089%,36.434937%);stop-opacity:1;"
+         offset="0.25" />
+      <stop
+         id="stop42"
+         style="stop-color:rgb(36.662292%,37.243652%,36.662292%);stop-opacity:1;"
+         offset="0.265625" />
+      <stop
+         id="stop44"
+         style="stop-color:rgb(36.891174%,37.481689%,36.891174%);stop-opacity:1;"
+         offset="0.28125" />
+      <stop
+         id="stop46"
+         style="stop-color:rgb(37.11853%,37.721252%,37.11853%);stop-opacity:1;"
+         offset="0.296875" />
+      <stop
+         id="stop48"
+         style="stop-color:rgb(37.347412%,37.960815%,37.347412%);stop-opacity:1;"
+         offset="0.3125" />
+      <stop
+         id="stop50"
+         style="stop-color:rgb(37.574768%,38.198853%,37.574768%);stop-opacity:1;"
+         offset="0.328125" />
+      <stop
+         id="stop52"
+         style="stop-color:rgb(37.80365%,38.438416%,37.80365%);stop-opacity:1;"
+         offset="0.34375" />
+      <stop
+         id="stop54"
+         style="stop-color:rgb(38.031006%,38.677979%,38.031006%);stop-opacity:1;"
+         offset="0.359375" />
+      <stop
+         id="stop56"
+         style="stop-color:rgb(38.259888%,38.916016%,38.259888%);stop-opacity:1;"
+         offset="0.375" />
+      <stop
+         id="stop58"
+         style="stop-color:rgb(38.487244%,39.155579%,38.487244%);stop-opacity:1;"
+         offset="0.390625" />
+      <stop
+         id="stop60"
+         style="stop-color:rgb(38.716125%,39.395142%,38.716125%);stop-opacity:1;"
+         offset="0.40625" />
+      <stop
+         id="stop62"
+         style="stop-color:rgb(38.943481%,39.633179%,38.943481%);stop-opacity:1;"
+         offset="0.421875" />
+      <stop
+         id="stop64"
+         style="stop-color:rgb(39.172363%,39.872742%,39.172363%);stop-opacity:1;"
+         offset="0.4375" />
+      <stop
+         id="stop66"
+         style="stop-color:rgb(39.399719%,40.112305%,39.399719%);stop-opacity:1;"
+         offset="0.453125" />
+      <stop
+         id="stop68"
+         style="stop-color:rgb(39.628601%,40.350342%,39.628601%);stop-opacity:1;"
+         offset="0.46875" />
+      <stop
+         id="stop70"
+         style="stop-color:rgb(39.855957%,40.589905%,39.855957%);stop-opacity:1;"
+         offset="0.484375" />
+      <stop
+         id="stop72"
+         style="stop-color:rgb(40.084839%,40.829468%,40.084839%);stop-opacity:1;"
+         offset="0.492063" />
+      <stop
+         id="stop74"
+         style="stop-color:rgb(40.19928%,40.948486%,40.19928%);stop-opacity:1;"
+         offset="0.5" />
+      <stop
+         id="stop76"
+         style="stop-color:rgb(40.312195%,41.067505%,40.312195%);stop-opacity:1;"
+         offset="0.507937" />
+      <stop
+         id="stop78"
+         style="stop-color:rgb(40.426636%,41.188049%,40.426636%);stop-opacity:1;"
+         offset="0.515625" />
+      <stop
+         id="stop80"
+         style="stop-color:rgb(40.541077%,41.307068%,40.541077%);stop-opacity:1;"
+         offset="0.53125" />
+      <stop
+         id="stop82"
+         style="stop-color:rgb(40.768433%,41.546631%,40.768433%);stop-opacity:1;"
+         offset="0.546875" />
+      <stop
+         id="stop84"
+         style="stop-color:rgb(40.997314%,41.786194%,40.997314%);stop-opacity:1;"
+         offset="0.5625" />
+      <stop
+         id="stop86"
+         style="stop-color:rgb(41.22467%,42.024231%,41.22467%);stop-opacity:1;"
+         offset="0.578125" />
+      <stop
+         id="stop88"
+         style="stop-color:rgb(41.453552%,42.263794%,41.453552%);stop-opacity:1;"
+         offset="0.59375" />
+      <stop
+         id="stop90"
+         style="stop-color:rgb(41.680908%,42.503357%,41.680908%);stop-opacity:1;"
+         offset="0.609375" />
+      <stop
+         id="stop92"
+         style="stop-color:rgb(41.90979%,42.741394%,41.90979%);stop-opacity:1;"
+         offset="0.625" />
+      <stop
+         id="stop94"
+         style="stop-color:rgb(42.138672%,42.980957%,42.138672%);stop-opacity:1;"
+         offset="0.640625" />
+      <stop
+         id="stop96"
+         style="stop-color:rgb(42.366028%,43.22052%,42.366028%);stop-opacity:1;"
+         offset="0.65625" />
+      <stop
+         id="stop98"
+         style="stop-color:rgb(42.59491%,43.458557%,42.59491%);stop-opacity:1;"
+         offset="0.671875" />
+      <stop
+         id="stop100"
+         style="stop-color:rgb(42.822266%,43.69812%,42.822266%);stop-opacity:1;"
+         offset="0.6875" />
+      <stop
+         id="stop102"
+         style="stop-color:rgb(43.051147%,43.937683%,43.051147%);stop-opacity:1;"
+         offset="0.703125" />
+      <stop
+         id="stop104"
+         style="stop-color:rgb(43.278503%,44.17572%,43.278503%);stop-opacity:1;"
+         offset="0.71875" />
+      <stop
+         id="stop106"
+         style="stop-color:rgb(43.507385%,44.415283%,43.507385%);stop-opacity:1;"
+         offset="0.734375" />
+      <stop
+         id="stop108"
+         style="stop-color:rgb(43.734741%,44.654846%,43.734741%);stop-opacity:1;"
+         offset="0.75" />
+      <stop
+         id="stop110"
+         style="stop-color:rgb(43.963623%,44.892883%,43.963623%);stop-opacity:1;"
+         offset="0.765625" />
+      <stop
+         id="stop112"
+         style="stop-color:rgb(44.190979%,45.132446%,44.190979%);stop-opacity:1;"
+         offset="0.78125" />
+      <stop
+         id="stop114"
+         style="stop-color:rgb(44.419861%,45.372009%,44.419861%);stop-opacity:1;"
+         offset="0.796875" />
+      <stop
+         id="stop116"
+         style="stop-color:rgb(44.647217%,45.610046%,44.647217%);stop-opacity:1;"
+         offset="0.8125" />
+      <stop
+         id="stop118"
+         style="stop-color:rgb(44.876099%,45.849609%,44.876099%);stop-opacity:1;"
+         offset="0.828125" />
+      <stop
+         id="stop120"
+         style="stop-color:rgb(45.103455%,46.089172%,45.103455%);stop-opacity:1;"
+         offset="0.84375" />
+      <stop
+         id="stop122"
+         style="stop-color:rgb(45.332336%,46.327209%,45.332336%);stop-opacity:1;"
+         offset="0.859375" />
+      <stop
+         id="stop124"
+         style="stop-color:rgb(45.559692%,46.566772%,45.559692%);stop-opacity:1;"
+         offset="0.875" />
+      <stop
+         id="stop126"
+         style="stop-color:rgb(45.788574%,46.806335%,45.788574%);stop-opacity:1;"
+         offset="0.890625" />
+      <stop
+         id="stop128"
+         style="stop-color:rgb(46.01593%,47.044373%,46.01593%);stop-opacity:1;"
+         offset="0.90625" />
+      <stop
+         id="stop130"
+         style="stop-color:rgb(46.244812%,47.283936%,46.244812%);stop-opacity:1;"
+         offset="0.921875" />
+      <stop
+         id="stop132"
+         style="stop-color:rgb(46.472168%,47.523499%,46.472168%);stop-opacity:1;"
+         offset="0.9375" />
+      <stop
+         id="stop134"
+         style="stop-color:rgb(46.70105%,47.761536%,46.70105%);stop-opacity:1;"
+         offset="0.953125" />
+      <stop
+         id="stop136"
+         style="stop-color:rgb(46.928406%,48.001099%,46.928406%);stop-opacity:1;"
+         offset="0.96875" />
+      <stop
+         id="stop138"
+         style="stop-color:rgb(47.157288%,48.240662%,47.157288%);stop-opacity:1;"
+         offset="0.984375" />
+      <stop
+         id="stop140"
+         style="stop-color:rgb(47.384644%,48.478699%,47.384644%);stop-opacity:1;"
+         offset="1" />
+    </linearGradient>
+    <clipPath
+       id="clip3">
+      <path
+         id="path143"
+         d="M 0 0 L 96 0 L 96 5 L 0 5 Z M 0 0 " />
+    </clipPath>
+    <clipPath
+       id="clip4">
+      <path
+         id="path146"
+         d="M 0 4.5 C 0 3.671875 0.4375 2.964844 1.316406 2.378906 C 2.195312 1.792969 3.257812 1.5 4.5 1.5 L 91.5 1.5 C 92.742188 1.5 93.804688 1.792969 94.683594 2.378906 C 95.558594 2.964844 96 3.671875 96 4.5 C 96 3.902344 95.886719 3.328125 95.65625 2.777344 C 95.429688 2.226562 95.105469 1.738281 94.683594 1.316406 C 94.261719 0.894531 93.773438 0.570312 93.222656 0.34375 C 92.671875 0.113281 92.097656 0 91.5 0 L 4.5 0 C 3.902344 0 3.328125 0.113281 2.777344 0.34375 C 2.226562 0.570312 1.738281 0.894531 1.316406 1.316406 C 0.894531 1.738281 0.570312 2.226562 0.34375 2.777344 C 0.113281 3.328125 0 3.902344 0 4.5 Z M 0 4.5 " />
+    </clipPath>
+    <clipPath
+       id="clip5">
+      <path
+         id="path149"
+         d="M 0 91 L 96 91 L 96 96 L 0 96 Z M 0 91 " />
+    </clipPath>
+    <clipPath
+       id="clip6">
+      <path
+         id="path152"
+         d="M 96 91.5 C 96 92.328125 95.5625 93.035156 94.683594 93.621094 C 93.804688 94.207031 92.742188 94.5 91.5 94.5 L 4.5 94.5 C 3.257812 94.5 2.195312 94.207031 1.316406 93.621094 C 0.441406 93.035156 0 92.328125 0 91.5 C 0 92.097656 0.113281 92.671875 0.34375 93.222656 C 0.570312 93.773438 0.894531 94.261719 1.316406 94.683594 C 1.738281 95.105469 2.226562 95.429688 2.777344 95.65625 C 3.328125 95.886719 3.902344 96 4.5 96 L 91.5 96 C 92.097656 96 92.671875 95.886719 93.222656 95.65625 C 93.773438 95.429688 94.261719 95.105469 94.683594 94.683594 C 95.105469 94.261719 95.429688 93.773438 95.65625 93.222656 C 95.886719 92.671875 96 92.097656 96 91.5 Z M 96 91.5 " />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2432">
+      <path
+         d="M 404.504,732.472 L 575.433,732.472 L 575.433,822.48 L 404.504,822.48 L 404.504,732.472 z"
+         id="path2434" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2480">
+      <path
+         d="M 404.504,793.418 L 575.428,793.418 L 575.428,822.48 L 404.504,822.48 L 404.504,793.418 z"
+         id="path2482" />
+    </clipPath>
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2668" />
+  </defs>
+  <rect
+     x="0"
+     y="0"
+     width="96"
+     height="96"
+     style="fill:#ffffff;fill-opacity:1;stroke:none"
+     id="rect157" />
+  <g
+     clip-path="url(#clip3)"
+     clip-rule="nonzero"
+     id="g169">
+    <g
+       clip-path="url(#clip4)"
+       clip-rule="evenodd"
+       id="g167">
+      <rect
+         x="0"
+         y="0"
+         width="96"
+         height="96"
+         style="fill:#303030;fill-opacity:1;stroke:none"
+         id="rect165" />
+    </g>
+  </g>
+  <g
+     clip-path="url(#clip5)"
+     clip-rule="nonzero"
+     id="g175">
+    <g
+       clip-path="url(#clip6)"
+       clip-rule="evenodd"
+       id="g173">
+      <rect
+         x="0"
+         y="0"
+         width="96"
+         height="96"
+         style="fill:#383838;fill-opacity:1;stroke:none"
+         id="rect171" />
+    </g>
+  </g>
+  <g
+     transform="matrix(0.38550219,0,0,0.38550219,-0.46313282,-80.126356)"
+     id="g2723">
+    <g
+       clip-path="url(#clipPath2432)"
+       id="g2430"
+       transform="matrix(1.25,0,0,-1.25,-486.74334,1342.2987)">
+      <g
+         transform="translate(441.8902,822.4804)"
+         id="g2436">
+        <path
+           id="path2438"
+           style="fill:#ed1c24;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="m 0,0 h -33.214 c -2.283,0 -4.172,-1.805 -4.172,-4.138 V -24.88 c 0,-2.332 1.889,-4.182 4.172,-4.182 H 0 c 2.241,0 4.131,1.85 4.131,4.182 V -4.138 C 4.131,-1.805 2.241,0 0,0" />
+      </g>
+      <g
+         transform="translate(442.9886,797.6008)"
+         id="g2440">
+        <path
+           id="path2442"
+           style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="m 0,0 c 0,-0.661 -0.439,-1.19 -1.098,-1.19 h -33.215 c -0.658,0 -1.141,0.529 -1.141,1.19 v 20.742 c 0,0.66 0.483,1.188 1.141,1.188 H -1.098 C -0.439,21.93 0,21.402 0,20.742 Z" />
+      </g>
+      <g
+         transform="translate(436.0031,804.0316)"
+         id="g2444">
+        <path
+           id="path2446"
+           style="fill:#ed1c24;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="m 0,0 c 0,1.937 -1.23,2.377 -3.031,2.377 h -1.67 V -2.51 h 1.626 C -1.449,-2.51 0,-1.982 0,0 m -4.701,5.899 h 1.583 c 1.493,0 2.59,0.661 2.59,2.29 0,1.806 -1.406,2.291 -2.899,2.291 h -1.274 z m 2.856,-11.493 h -7.38 V 13.43 h 7.732 c 3.647,0 5.622,-1.498 5.622,-5.065 0,-1.85 -1.537,-3.17 -3.207,-4.007 2.33,-0.659 3.911,-2.071 3.911,-4.447 0,-3.876 -3.251,-5.505 -6.678,-5.505" />
+      </g>
+      <g
+         transform="translate(420.2326,807.642)"
+         id="g2448">
+        <path
+           id="path2450"
+           style="fill:#ed1c24;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 C 0,3.832 -0.397,6.824 -4.525,6.824 H -5.449 V -6.121 h 1.625 C -1.407,-6.121 0,-4.184 0,0 m -3.032,-9.204 h -6.986 V 9.819 h 6.986 c 4.92,0 7.555,-3.082 7.555,-9.423 0,-5.505 -1.757,-9.556 -7.555,-9.6" />
+      </g>
+      <g
+         transform="translate(463.3661,808.1006)"
+         id="g2452">
+        <path
+           id="path2454"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="m 0,0 c 0.003,-0.001 -0.26,0.11 -0.26,0.11 -1.676,0.718 -1.743,0.744 -2.139,1.025 -0.55,0.386 -0.733,0.684 -0.733,1.185 0,0.884 0.738,1.335 2.199,1.335 1.291,0 2.235,-0.22 3.736,-0.879 L 3.038,2.675 V 6.048 L 2.927,6.09 c -1.442,0.521 -2.649,0.746 -4.034,0.746 -3.724,0 -5.858,-1.788 -5.858,-4.904 0,-2.348 1.064,-3.695 3.795,-4.805 2.904,-1.205 3.179,-1.507 3.179,-2.387 0,-1.026 -0.867,-1.55 -2.572,-1.55 -1.473,0 -2.586,0.292 -4.248,1.112 l -0.243,0.12 v -3.374 l 0.097,-0.047 c 1.545,-0.705 2.892,-0.991 4.655,-0.991 4.073,0 6.318,1.788 6.318,5.034 C 4.016,-2.496 3.001,-1.245 0,0" />
+      </g>
+      <g
+         transform="translate(480.8019,802.0853)"
+         id="g2456">
+        <path
+           id="path2458"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="m 0,0 c -1.537,-0.571 -2.538,-0.771 -3.833,-0.771 -2.693,0 -3.742,1.437 -3.742,5.132 0,3.856 1.019,5.287 3.765,5.287 1.272,0 2.385,-0.225 3.718,-0.747 L 0.137,8.81 v 3.338 L 0.028,12.19 c -1.25,0.453 -2.503,0.661 -3.947,0.661 -2.243,0 -4.151,-0.629 -5.521,-1.824 -1.714,-1.49 -2.512,-3.613 -2.512,-6.688 0,-2.608 0.544,-4.474 1.711,-5.865 1.358,-1.603 3.498,-2.449 6.19,-2.449 1.507,0 2.952,0.305 4.179,0.884 l 0.097,0.044 v 3.131 z" />
+      </g>
+      <g
+         transform="translate(493.2924,814.5656)"
+         id="g2460">
+        <path
+           id="path2462"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 V -6.255 H -5.747 V 0 h -4.161 v -16.13 h 4.161 v 6.649 H 0 V -16.13 H 4.161 V 0 Z" />
+      </g>
+      <g
+         transform="translate(504.7097,801.7065)"
+         id="g2464">
+        <path
+           id="path2466"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 V 3.378 H 5.542 V 6.495 H 0 v 3.096 h 7.018 v 3.268 H -4.16 V -3.271 H 7.352 L 7.641,0 Z" />
+      </g>
+      <g
+         transform="translate(524.7971,814.5656)"
+         id="g2468">
+        <path
+           id="path2470"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 V -8.815 C -0.549,-8.092 -6.7,0 -6.7,0 h -3.49 v -16.13 h 3.529 v 9.751 C -6.106,-7.107 0.76,-16.13 0.76,-16.13 H 3.53 V 0 Z" />
+      </g>
+      <g
+         transform="translate(539.1285,806.9666)"
+         id="g2472">
+        <path
+           id="path2474"
+           style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+           d="M 0,0 C 0.159,0.2 6.091,7.599 6.091,7.599 H 1.768 c 0,0 -4.775,-6.191 -5.313,-6.886 v 6.886 h -4.158 v -16.13 h 4.158 v 6.822 c 0.538,-0.702 5.227,-6.822 5.227,-6.822 h 4.943 c 0,0 -6.467,8.329 -6.625,8.531" />
+      </g>
+    </g>
+    <g
+       transform="matrix(1.25,0,0,-1.25,-486.74334,1342.2987)"
+       id="g2476">
+      <g
+         id="g2478"
+         clip-path="url(#clipPath2480)">
+        <g
+           id="g2484"
+           transform="translate(551.4013,801.7065)">
+          <path
+             d="M 0,0 V 3.378 H 5.542 V 6.495 H 0 v 3.096 h 7.018 v 3.268 H -4.157 V -3.271 H 7.354 L 7.646,0 Z"
+             style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path2486" />
+        </g>
+        <g
+           id="g2488"
+           transform="translate(565.4608,811.4522)">
+          <path
+             d="m 0,0 h 1.897 c 1.619,0 2.137,-0.458 2.137,-1.878 0,-1.412 -0.579,-1.938 -2.137,-1.938 H 0 Z m 6.473,-7.202 c -0.458,0.744 -0.933,1.21 -1.454,1.526 2.117,0.692 3.066,1.897 3.066,4.016 0,3.213 -1.983,4.773 -6.059,4.773 h -6.188 v -16.13 H 0 v 6.364 h 0.53 c 0.936,0 1.275,-0.248 2.007,-1.482 l 2.895,-4.882 h 4.541 z"
+             style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
+             id="path2490" />
+        </g>
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/delivery_schenker/static/description/index.html b/delivery_schenker/static/description/index.html
new file mode 100644
index 0000000000..085f3ed7ff
--- /dev/null
+++ b/delivery_schenker/static/description/index.html
@@ -0,0 +1,529 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
+<title>Delivery Schenker</title>
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+  border: 0 }
+
+table.borderless td, table.borderless th {
+  /* Override padding for "table.docutils td" with "! important".
+     The right padding separates the table cells. */
+  padding: 0 0.5em 0 0 ! important }
+
+.first {
+  /* Override more specific margin styles with "! important". */
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.subscript {
+  vertical-align: sub;
+  font-size: smaller }
+
+.superscript {
+  vertical-align: super;
+  font-size: smaller }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
+  overflow: hidden;
+}
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title, .code .error {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin: 0 0 0.5em 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left, .figure.align-left, object.align-left, table.align-left {
+  clear: left ;
+  float: left ;
+  margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right, table.align-right {
+  clear: right ;
+  float: right ;
+  margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+
+table.align-center {
+  margin-left: auto;
+  margin-right: auto;
+}
+
+.align-left {
+  text-align: left }
+
+.align-center {
+  clear: both ;
+  text-align: center }
+
+.align-right {
+  text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+  text-align: inherit }
+
+/* div.align-center * { */
+/*   text-align: left } */
+
+.align-top    {
+  vertical-align: top }
+
+.align-middle {
+  vertical-align: middle }
+
+.align-bottom {
+  vertical-align: bottom }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font: inherit }
+
+pre.literal-block, pre.doctest-block, pre.math, pre.code {
+  margin-left: 2em ;
+  margin-right: 2em }
+
+pre.code .ln { color: grey; } /* line numbers */
+pre.code, code { background-color: #eeeeee }
+pre.code .comment, code .comment { color: #5C6576 }
+pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
+pre.code .literal.string, code .literal.string { color: #0C5404 }
+pre.code .name.builtin, code .name.builtin { color: #352B84 }
+pre.code .deleted, code .deleted { background-color: #DEB0A1}
+pre.code .inserted, code .inserted { background-color: #A3D289}
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid 1px gray;
+  margin-left: 1px }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid 1px black;
+  margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+/* "booktabs" style (no vertical lines) */
+table.docutils.booktabs {
+  border: 0px;
+  border-top: 2px solid;
+  border-bottom: 2px solid;
+  border-collapse: collapse;
+}
+table.docutils.booktabs * {
+  border: 0px;
+}
+table.docutils.booktabs th {
+  border-bottom: thin solid;
+  text-align: left;
+}
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+ul.auto-toc {
+  list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="delivery-schenker">
+<h1 class="title">Delivery Schenker</h1>
+
+<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!! This file is generated by oca-gen-addon-readme !!
+!! changes will be overwritten.                   !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-13-0/delivery-carrier-13-0-delivery_schenker"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p>This module links the <a class="reference external" href="https://www.dbschenker.com">DB Schenker</a> booking and tracking
+APIs with Odoo delivery system.</p>
+<p><strong>Table of contents</strong></p>
+<div class="contents local topic" id="contents">
+<ul class="simple">
+<li><a class="reference internal" href="#installation" id="id1">Installation</a></li>
+<li><a class="reference internal" href="#configuration" id="id2">Configuration</a></li>
+<li><a class="reference internal" href="#usage" id="id3">Usage</a><ul>
+<li><a class="reference internal" href="#place-shipping-bookings" id="id4">Place shipping bookings</a></li>
+<li><a class="reference internal" href="#cancel-bookings" id="id5">Cancel bookings</a></li>
+<li><a class="reference internal" href="#get-labels" id="id6">Get labels</a></li>
+<li><a class="reference internal" href="#tracking" id="id7">Tracking</a></li>
+<li><a class="reference internal" href="#debugging" id="id8">Debugging</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#known-issues-roadmap" id="id9">Known issues / Roadmap</a></li>
+<li><a class="reference internal" href="#bug-tracker" id="id10">Bug Tracker</a></li>
+<li><a class="reference internal" href="#credits" id="id11">Credits</a><ul>
+<li><a class="reference internal" href="#authors" id="id12">Authors</a></li>
+<li><a class="reference internal" href="#contributors" id="id13">Contributors</a></li>
+<li><a class="reference internal" href="#maintainers" id="id14">Maintainers</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="installation">
+<h1><a class="toc-backref" href="#id1">Installation</a></h1>
+<p>This module depends on the <cite>zeep</cite> python library and the OCA/delivery-carrier
+<cite>delivery_package_number</cite> and <cite>delivery_state</cite> modules.</p>
+<p>The Schenker API doesn’t provide delivery rating methods, so OCA’s
+<cite>delivery_price_method</cite> is advised in order to use this carrier in a sales workflow.</p>
+</div>
+<div class="section" id="configuration">
+<h1><a class="toc-backref" href="#id2">Configuration</a></h1>
+<p>To configure a Schenker delivery method:</p>
+<ol class="arabic simple">
+<li>Go to <em>Inventory &gt; Configuration &gt; Delivery &gt; Shipping methods</em> and create a new one.</li>
+<li>Choose <em>DB Schenker</em> as provider.</li>
+<li>Configure the service parameters according to your contract considerations.</li>
+<li>Choose a delivery product and a default packaging. This is mandatory for the booking
+request as it needs the packaging code.</li>
+</ol>
+<p>To make tests, set the carrier environment to test from the smart button. Don’t forget
+to set it to production once you’re ready to use the delivery method!</p>
+</div>
+<div class="section" id="usage">
+<h1><a class="toc-backref" href="#id3">Usage</a></h1>
+<p>These are the operations possible with this module:</p>
+<div class="section" id="place-shipping-bookings">
+<h2><a class="toc-backref" href="#id4">Place shipping bookings</a></h2>
+<ol class="arabic simple">
+<li>When the picking is validated, the shipping will be booked at Schenker.</li>
+<li>With the response, we’ll receive the delivery tracking number and the pdf label in a
+chatter message and it will be kept as attachment to the document.</li>
+<li>You can manage packages number either with the proper Odoo workflows or with the
+package number field available in the <em>Additional Info</em> tab. You’ll get as many
+labels as declared packages.</li>
+</ol>
+</div>
+<div class="section" id="cancel-bookings">
+<h2><a class="toc-backref" href="#id5">Cancel bookings</a></h2>
+<ol class="arabic simple">
+<li>As in other carriers, we can cancel the shipping after the picking is done. To do
+so, go to <em>Additional Info</em> tab and click on the <em>Cancel</em> action on the side of the
+tracking number.</li>
+<li>We can generate a new shipping if necessary.</li>
+</ol>
+</div>
+<div class="section" id="get-labels">
+<h2><a class="toc-backref" href="#id6">Get labels</a></h2>
+<ol class="arabic simple">
+<li>If by chance we delete the generated labels, we can obtain them again hitting the
+<em>Schenker Label</em> buttons in the header of the picking form.</li>
+</ol>
+</div>
+<div class="section" id="tracking">
+<h2><a class="toc-backref" href="#id7">Tracking</a></h2>
+<ol class="arabic simple">
+<li>The module is integrated with <cite>delivery_state</cite> to be able to get the tracking info
+directly from the DB Schenker API.</li>
+<li>To do so, go to a picking shipped with Schenker. In the <em>Additional Info</em> tab you’ll
+find an action button to <em>Update tracking state</em> so the state will be updated from
+the Schenker API.</li>
+</ol>
+</div>
+<div class="section" id="debugging">
+<h2><a class="toc-backref" href="#id8">Debugging</a></h2>
+<p>The API calls and responses are tracked in two special fields in the picking that can
+be viewed by technical users. You can also log them in as <cite>ir.logging</cite> records setting
+the carrier debug on from the smart button.</p>
+</div>
+</div>
+<div class="section" id="known-issues-roadmap">
+<h1><a class="toc-backref" href="#id9">Known issues / Roadmap</a></h1>
+<ul class="simple">
+<li>There’s no dummy access key to test API calls so no tests can be performed.</li>
+<li>The test booking and shipping APIs databases aren’t connected so it isn’t possible to
+perform trackings on test mode.</li>
+<li>Only land shipping is implemented, although the module is prepared for extend to
+air and ocean just considering the mandatory request fields for those methods.
+Some additional adaptations could be needed (e.g.: origin and destination airport,
+port) anyway.</li>
+<li>Only volume is supported as a measure unit and with the limitations of Odoo itself. To
+enjoy a full fledged volume support, install and configure the OCA’s
+<cite>stock_quant_package_dimension</cite> module and its dependencies. The connector is ready to
+make use of their volume computations.</li>
+<li>It’d be needed to extend the method to support Schenker measure units such as  loading
+pieces or pallet space.</li>
+<li>Some more booking features aren’t yet supported although can be extended in the
+future. Some of those, although the complete list would be really extensive:<ul>
+<li>Dangerous goods.</li>
+<li>Driver pre-advise.</li>
+<li>Transport temperature.</li>
+<li>Customs clearance.</li>
+<li>Cargo insurance.</li>
+<li>Cash on delivery.</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="bug-tracker">
+<h1><a class="toc-backref" href="#id10">Bug Tracker</a></h1>
+<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>.
+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
+<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_schenker%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<p>Do not contact contributors directly about support or help with technical issues.</p>
+</div>
+<div class="section" id="credits">
+<h1><a class="toc-backref" href="#id11">Credits</a></h1>
+<div class="section" id="authors">
+<h2><a class="toc-backref" href="#id12">Authors</a></h2>
+<ul class="simple">
+<li>Tecnativa</li>
+</ul>
+</div>
+<div class="section" id="contributors">
+<h2><a class="toc-backref" href="#id13">Contributors</a></h2>
+<ul class="simple">
+<li><a class="reference external" href="https://www.tecnativa.com">Tecnativa</a>:<ul>
+<li>David Vidal</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="maintainers">
+<h2><a class="toc-backref" href="#id14">Maintainers</a></h2>
+<p>This module is maintained by the OCA.</p>
+<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
+<p>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.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker">OCA/delivery-carrier</a> project on GitHub.</p>
+<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
+</div>
+</div>
+</div>
+</body>
+</html>
diff --git a/delivery_schenker/tests/__init__.py b/delivery_schenker/tests/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/delivery_schenker/views/delivery_schenker_view.xml b/delivery_schenker/views/delivery_schenker_view.xml
new file mode 100644
index 0000000000..5c8113a10f
--- /dev/null
+++ b/delivery_schenker/views/delivery_schenker_view.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright 2020 Tecnativa - David Vidal
+     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/page[1]" position='before'>
+                <page
+                    string="Schenker Configuration"
+                    attrs="{'invisible': [('delivery_type', '!=', 'schenker')]}"
+                >
+                    <group>
+                        <group string="Connection">
+                            <field
+                                name="schenker_access_key"
+                                attrs="{'required': [('delivery_type', '=', 'schenker')]}"
+                            />
+                            <field name="schenker_group_id" />
+                            <field name="schenker_user" />
+                        </group>
+                        <group string="Label">
+                            <field
+                                name="schenker_barcode_format"
+                                attrs="{'required': [('delivery_type', '=', 'schenker')]}"
+                            />
+                            <field name="schenker_barcode_mail" />
+                            <field
+                                name="schenker_barcode_a4_start_pos"
+                                attrs="{'required': [('schenker_barcode_format', '=', 'A4')], 'invisible': [('schenker_barcode_format', '!=', 'A4')]}"
+                            />
+                            <field
+                                name="schenker_barcode_a4_separated"
+                                attrs="{'required': [('schenker_barcode_format', '=', 'A4')], 'invisible': [('schenker_barcode_format', '!=', 'A4')]}"
+                            />
+                        </group>
+                        <group string="Service">
+                            <field
+                                name="schenker_booking_type"
+                                attrs="{'required': [('delivery_type', '=', 'schenker')]}"
+                            />
+                            <field
+                                name="schenker_incoterm_id"
+                                attrs="{'required': [('delivery_type', '=', 'schenker')]}"
+                            />
+                            <field
+                                name="schenker_service_type"
+                                attrs="{'required': [('delivery_type', '=', 'schenker')]}"
+                            />
+                            <field
+                                name="schenker_service_land"
+                                attrs="{'required': [('delivery_type', '=', 'schenker'), ('schenker_booking_type', '=', 'land')], 'invisible': [('schenker_booking_type', '!=', 'land')]}"
+                            />
+                            <field name="schenker_indoor_delivery" />
+                            <field name="schenker_express" />
+                            <field name="schenker_food_related" />
+                            <field name="schenker_heated_transport" />
+                            <field name="schenker_home_delivery" />
+                            <field name="schenker_own_pickup" />
+                            <field name="schenker_pharmaceuticals" />
+                        </group>
+                        <group string="Logistics">
+                            <field
+                                name="schenker_default_packaging_id"
+                                attrs="{'required': [('delivery_type', '=', 'schenker')]}"
+                            />
+                            <field
+                                name="schenker_measure_unit"
+                                attrs="{'required': [('delivery_type', '=', 'schenker')]}"
+                            />
+                        </group>
+                    </group>
+                </page>
+            </xpath>
+        </field>
+    </record>
+</odoo>
diff --git a/delivery_schenker/views/stock_picking_views.xml b/delivery_schenker/views/stock_picking_views.xml
new file mode 100644
index 0000000000..28ac6bb6ff
--- /dev/null
+++ b/delivery_schenker/views/stock_picking_views.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <!-- Copyright 2021 Tecnativa - David Vidal
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).-->
+    <record id="view_picking_withcarrier_out_form" model="ir.ui.view">
+        <field name="model">stock.picking</field>
+        <field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form" />
+        <field name="groups_id" eval="[(4, ref('base.group_no_one'))]" />
+        <field name="arch" type="xml">
+            <xpath expr="//header" position='inside'>
+                <button
+                    name="schenker_get_label"
+                    string="Schenker Label"
+                    type="object"
+                    attrs="{'invisible':['|', '|', ('delivery_type', '!=', 'schenker'), ('carrier_tracking_ref', '=', False), ('state', '!=', 'done')]}"
+                />
+            </xpath>
+        </field>
+    </record>
+</odoo>

From fa4fd28227fadb5b1ee38cdaa69e4c0f63749639 Mon Sep 17 00:00:00 2001
From: oca-travis <oca+oca-travis@odoo-community.org>
Date: Sat, 11 Dec 2021 11:26:23 +0000
Subject: [PATCH 02/23] [UPD] Update delivery_schenker.pot

---
 delivery_schenker/i18n/delivery_schenker.pot | 566 +++++++++++++++++++
 1 file changed, 566 insertions(+)
 create mode 100644 delivery_schenker/i18n/delivery_schenker.pot

diff --git a/delivery_schenker/i18n/delivery_schenker.pot b/delivery_schenker/i18n/delivery_schenker.pot
new file mode 100644
index 0000000000..fdca837b63
--- /dev/null
+++ b/delivery_schenker/i18n/delivery_schenker.pot
@@ -0,0 +1,566 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* delivery_schenker
+#
+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_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_barcode_format__a4
+msgid "A4"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_barcode_format__a6
+msgid "A6"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_access_key
+msgid "Access Key"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__a2a
+msgid "Aiport-to-airport"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__air
+msgid "Air"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_service_air
+msgid "Air service"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_service_air
+msgid ""
+"Air shipping product options. Depending on your customer account, some "
+"services could not be available"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__a2d
+msgid "Airport-to-door"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_mail
+msgid "Barcode Copy Email"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_format
+msgid "Barcode Format"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_separated
+msgid "Barcode Separated"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_start_pos
+msgid "Barcode Start Position"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_booking_type
+msgid "Booking Type"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__package_carrier_type
+msgid "Carrier"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_booking_type
+msgid "Choose Scnecker booking type. Only land is currently suported"
+msgstr ""
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Connection"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__71
+msgid "DB SCHENKERdirect"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__b
+msgid "DB SCHENKERjetcargo business"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__e
+msgid "DB SCHENKERjetcargo economy"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__f
+msgid "DB SCHENKERjetcargo first"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__s
+msgid "DB SCHENKERjetcargo special"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__eagd
+msgid "DB SCHENKERjetexpress gold"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__easv
+msgid "DB SCHENKERjetexpress silver"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ecpa
+msgid "DB SCHENKERparcel"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ectn
+msgid "DB SCHENKERspeed"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ect1
+msgid "DB SCHENKERspeed 10"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ect2
+msgid "DB SCHENKERspeed 12"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ect8
+msgid "DB SCHENKERspeed 8"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__40
+msgid "DB SCHENKERsystem classic"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__sysd
+msgid "DB SCHENKERsystem domestic"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__schx
+msgid "DB SCHENKERsystem fix"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__42
+msgid "DB SCHENKERsystem fixday"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__schs
+msgid "DB SCHENKERsystem international"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__41
+msgid "DB SCHENKERsystem speed"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__scht
+msgid "DB SCHENKERtop"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__sch2
+msgid "DB SCHENKERtop 12"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__delivery_type__schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__product_packaging__package_carrier_type__schenker
+msgid "DB Schenker"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__43
+msgid "DBSchenker System"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__44
+msgid "DBSchenker System Premium"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__con
+msgid "DBSchenkerconcepts"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__dir
+msgid "DBSchenkerdirects"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__pal
+msgid "DBSchenkerpallets"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__lpa
+msgid "DBSchenkerparcel Logistics Parcel"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__pri
+msgid "DBSchenkerprivpark"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_incoterm_id
+msgid "Default Incoterm"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_default_packaging_id
+msgid "Default Package Type"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_product_packaging__schenker_stackable
+msgid "Define if the package is stackable by default"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_indoor_delivery
+msgid "Defines if indoor delivery is required"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_express
+msgid "Defines if shipment is express"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_food_related
+msgid "Defines if shipment is food related"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_pharmaceuticals
+msgid "Defines if shipment is pharmaceutical"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_heated_transport
+msgid "Defines if shipment is required heated transport"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_home_delivery
+msgid "Defines if shipment is required home delivery"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_own_pickup
+msgid "Defines if shipment is required own pickup"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_service_type
+msgid ""
+"Defines service type: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depending on the "
+"Transport mode the service will be validated. For instance if the transport "
+"mode is AIR, the service type P2P (PortToPort)"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__d2a
+msgid "Door-to-airport"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__d2d
+msgid "Door-to-door"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__d2p
+msgid "Door-to-port"
+msgstr ""
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/schenker_request.py:0
+#, python-format
+msgid ""
+"Error in the request to the Schenker API. This is the thrown message:\n"
+"\n"
+"[%s]\n"
+"%s - %s"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_express
+msgid "Express"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_food_related
+msgid "Food Related"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_separated
+msgid "For A4 define if the labels shall be printed on separate pages"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_start_pos
+msgid "For A4 format you can define the starting position"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_group_id
+msgid "Group"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_heated_transport
+msgid "Heated Transport"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_home_delivery
+msgid "Home Delivery"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_default_packaging_id
+msgid ""
+"If not delivery package or the package doesn't have defined the packagingit "
+"will default to this type"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_indoor_delivery
+msgid "Indoor Delivery"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_incoterm_id
+msgid "It will be overriden by the sale order one if it's specified."
+msgstr ""
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Label"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__land
+msgid "Land"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_service_land
+msgid "Land service"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_service_land
+msgid ""
+"Land shipping product options. Depending on your customer account, some "
+"services could not be available"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__loading_meters
+msgid "Loading meters"
+msgstr ""
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Logistics"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_measure_unit
+msgid "Measure Unit"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__ocean_fcl
+msgid "Ocean FCL"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__ocean_lcl
+msgid "Ocean LCL"
+msgstr ""
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid "Only land shipping is currently supported"
+msgstr ""
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid "Only volume is currently supported"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_mail
+msgid "Optional: send a barcode copy to this email address"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_own_pickup
+msgid "Own Pickup"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__pallet_space
+msgid "Pallet space"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_pharmaceuticals
+msgid "Pharmaceuticals"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__pieces
+msgid "Pieces"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__p2d
+msgid "Port-to-door"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model,name:delivery_schenker.model_product_packaging
+msgid "Product Packaging"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__delivery_type
+msgid "Provider"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ecsp
+msgid "SCHENKERsystem-plus"
+msgstr ""
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid ""
+"Schenker 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."
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_access_key
+msgid "Schenker Access Key"
+msgstr ""
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Schenker Configuration"
+msgstr ""
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_picking_withcarrier_out_form
+msgid "Schenker Label"
+msgstr ""
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid "Schenker Shipping barcode document"
+msgstr ""
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Service"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_service_type
+msgid "Service Type"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model,name:delivery_schenker.model_delivery_carrier
+msgid "Shipping Methods"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__schenker_stackable
+msgid "Stackable"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_measure_unit
+msgid "The proper request will be formed accordingly from the picking"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_user
+msgid "User"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__volume
+msgid "Volume"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auco
+msgid "austrocargo"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc0
+msgid "austroexpress PUNKT 10"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc2
+msgid "austroexpress PUNKT 12"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__aucc
+msgid "austroexpress PUNKT 17"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc8
+msgid "austroexpress PUNKT 8"
+msgstr ""

From 57b6fc0f92d790c09a426e0aa68c0d5f940e005d Mon Sep 17 00:00:00 2001
From: OCA-git-bot <oca-git-bot@odoo-community.org>
Date: Sat, 11 Dec 2021 11:35:13 +0000
Subject: [PATCH 03/23] [UPD] README.rst

---
 delivery_schenker/static/description/index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/delivery_schenker/static/description/index.html b/delivery_schenker/static/description/index.html
index 085f3ed7ff..d75d6f1bb1 100644
--- a/delivery_schenker/static/description/index.html
+++ b/delivery_schenker/static/description/index.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
 <title>Delivery Schenker</title>
 <style type="text/css">
 

From cc46f5cdbcbf190bc8a410b649acd446832bb1c8 Mon Sep 17 00:00:00 2001
From: david <david.vidal@tecnativa.com>
Date: Tue, 14 Dec 2021 09:58:16 +0100
Subject: [PATCH 04/23] [FIX] delivery_schenker: undeclared method

---
 delivery_schenker/__manifest__.py             |  6 +-----
 .../views/stock_picking_views.xml             | 20 -------------------
 2 files changed, 1 insertion(+), 25 deletions(-)
 delete mode 100644 delivery_schenker/views/stock_picking_views.xml

diff --git a/delivery_schenker/__manifest__.py b/delivery_schenker/__manifest__.py
index fa9df94f58..d470d1546d 100644
--- a/delivery_schenker/__manifest__.py
+++ b/delivery_schenker/__manifest__.py
@@ -12,9 +12,5 @@
     "installable": True,
     "depends": ["delivery_package_number", "delivery_state"],
     "external_dependencies": {"python": ["zeep"]},
-    "data": [
-        "views/delivery_schenker_view.xml",
-        "views/stock_picking_views.xml",
-        "data/delivery_schenker_data.xml",
-    ],
+    "data": ["views/delivery_schenker_view.xml", "data/delivery_schenker_data.xml"],
 }
diff --git a/delivery_schenker/views/stock_picking_views.xml b/delivery_schenker/views/stock_picking_views.xml
deleted file mode 100644
index 28ac6bb6ff..0000000000
--- a/delivery_schenker/views/stock_picking_views.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<odoo>
-    <!-- Copyright 2021 Tecnativa - David Vidal
-     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).-->
-    <record id="view_picking_withcarrier_out_form" model="ir.ui.view">
-        <field name="model">stock.picking</field>
-        <field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form" />
-        <field name="groups_id" eval="[(4, ref('base.group_no_one'))]" />
-        <field name="arch" type="xml">
-            <xpath expr="//header" position='inside'>
-                <button
-                    name="schenker_get_label"
-                    string="Schenker Label"
-                    type="object"
-                    attrs="{'invisible':['|', '|', ('delivery_type', '!=', 'schenker'), ('carrier_tracking_ref', '=', False), ('state', '!=', 'done')]}"
-                />
-            </xpath>
-        </field>
-    </record>
-</odoo>

From e83ac021b9e888f6bc1ea1b701fd4c4422f28bf6 Mon Sep 17 00:00:00 2001
From: oca-travis <oca+oca-travis@odoo-community.org>
Date: Tue, 14 Dec 2021 12:14:49 +0000
Subject: [PATCH 05/23] [UPD] Update delivery_schenker.pot

---
 delivery_schenker/i18n/delivery_schenker.pot | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/delivery_schenker/i18n/delivery_schenker.pot b/delivery_schenker/i18n/delivery_schenker.pot
index fdca837b63..98c25dfd97 100644
--- a/delivery_schenker/i18n/delivery_schenker.pot
+++ b/delivery_schenker/i18n/delivery_schenker.pot
@@ -494,11 +494,6 @@ msgstr ""
 msgid "Schenker Configuration"
 msgstr ""
 
-#. module: delivery_schenker
-#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_picking_withcarrier_out_form
-msgid "Schenker Label"
-msgstr ""
-
 #. module: delivery_schenker
 #: code:addons/delivery_schenker/models/delivery_carrier.py:0
 #, python-format

From a7367666620edd023c812d05677ee1c6bbc7740d Mon Sep 17 00:00:00 2001
From: OCA-git-bot <oca-git-bot@odoo-community.org>
Date: Tue, 14 Dec 2021 12:41:35 +0000
Subject: [PATCH 06/23] delivery_schenker 13.0.1.0.1

---
 delivery_schenker/__manifest__.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/delivery_schenker/__manifest__.py b/delivery_schenker/__manifest__.py
index d470d1546d..63edac871f 100644
--- a/delivery_schenker/__manifest__.py
+++ b/delivery_schenker/__manifest__.py
@@ -3,7 +3,7 @@
 {
     "name": "Delivery Schenker",
     "summary": "Delivery Carrier implementation for DB Schenker API",
-    "version": "13.0.1.0.0",
+    "version": "13.0.1.0.1",
     "category": "Stock",
     "website": "https://github.com/OCA/delivery-carrier",
     "author": "Tecnativa, Odoo Community Association (OCA)",

From f6e0f599f99f2d25b34a4a8bd514078b1d846104 Mon Sep 17 00:00:00 2001
From: Ethan Hildick <ethan@studio73.es>
Date: Mon, 13 Dec 2021 10:51:06 +0100
Subject: [PATCH 07/23] [IMP] delivery_schenker: black, isort, prettier

---
 delivery_schenker/models/delivery_carrier.py  | 27 +++++++------------
 delivery_schenker/models/product_packaging.py |  6 ++---
 delivery_schenker/models/schenker_request.py  | 11 +++-----
 3 files changed, 16 insertions(+), 28 deletions(-)

diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index ecac6bc950..1a47ee6c70 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -27,7 +27,7 @@ class DeliveryCarrier(models.Model):
         help="Choose Scnecker booking type. Only land is currently suported",
     )
     schenker_barcode_format = fields.Selection(
-        selection=[("A4", "A4"), ("A6", "A6")], default="A6", string="Barcode Format",
+        selection=[("A4", "A4"), ("A6", "A6")], default="A6", string="Barcode Format"
     )
     schenker_barcode_mail = fields.Char(
         string="Barcode Copy Email",
@@ -110,26 +110,26 @@ class DeliveryCarrier(models.Model):
         ],
     )
     schenker_indoor_delivery = fields.Boolean(
-        string="Indoor Delivery", help="Defines if indoor delivery is required",
+        string="Indoor Delivery", help="Defines if indoor delivery is required"
     )
     schenker_express = fields.Boolean(
-        string="Express", help="Defines if shipment is express",
+        string="Express", help="Defines if shipment is express"
     )
     schenker_food_related = fields.Boolean(
-        string="Food Related", help="Defines if shipment is food related",
+        string="Food Related", help="Defines if shipment is food related"
     )
     schenker_heated_transport = fields.Boolean(
         string="Heated Transport",
         help="Defines if shipment is required heated transport",
     )
     schenker_home_delivery = fields.Boolean(
-        string="Home Delivery", help="Defines if shipment is required home delivery",
+        string="Home Delivery", help="Defines if shipment is required home delivery"
     )
     schenker_own_pickup = fields.Boolean(
-        string="Own Pickup", help="Defines if shipment is required own pickup",
+        string="Own Pickup", help="Defines if shipment is required own pickup"
     )
     schenker_pharmaceuticals = fields.Boolean(
-        string="Pharmaceuticals", help="Defines if shipment is pharmaceutical",
+        string="Pharmaceuticals", help="Defines if shipment is pharmaceutical"
     )
     schenker_measure_unit = fields.Selection(
         string="Measure Unit",
@@ -189,9 +189,7 @@ def _schenker_log_request(self, schenker_request, picking):
     def _prepare_schenker_barcode(self):
         """Always request the barcode label when generating the booking. We can choose
         between two formats: A6 and A4, where an starting position can be set"""
-        vals = {
-            "barcodeRequest": self.schenker_barcode_format,
-        }
+        vals = {"barcodeRequest": self.schenker_barcode_format}
         if self.schenker_barcode_mail:
             vals["barcodeRequestEmail"] = self.schenker_barcode_mail
         if self.schenker_barcode_format == "A6":
@@ -292,10 +290,7 @@ def _schenker_pickup_dates(self, picking):
         date_to = fields.Datetime.context_timestamp(
             self, picking.date_done.replace(hour=23, minute=59, second=59)
         ).isoformat()
-        return {
-            "pickUpDateFrom": date_from,
-            "pickUpDateTo": date_to,
-        }
+        return {"pickUpDateFrom": date_from, "pickUpDateTo": date_to}
 
     def _schenker_shipping_information_package(self, picking, package):
         weight = package.shipping_weight or package.weight
@@ -364,9 +359,7 @@ def _schenker_measures(self, picking):
         :returns dict values for the proper unit key and value
         """
         if self.schenker_measure_unit == "VOLUME":
-            return {
-                "measureUnitVolume": round(picking.volume, 2) or 0.01,
-            }
+            return {"measureUnitVolume": round(picking.volume, 2) or 0.01}
         return {}
 
     def _prepare_schenker_shipping(self, picking):
diff --git a/delivery_schenker/models/product_packaging.py b/delivery_schenker/models/product_packaging.py
index c41b202a11..a3dc8bfc90 100644
--- a/delivery_schenker/models/product_packaging.py
+++ b/delivery_schenker/models/product_packaging.py
@@ -6,9 +6,7 @@
 class ProductPackaging(models.Model):
     _inherit = "product.packaging"
 
-    package_carrier_type = fields.Selection(
-        selection_add=[("schenker", "DB Schenker")],
-    )
+    package_carrier_type = fields.Selection(selection_add=[("schenker", "DB Schenker")])
     schenker_stackable = fields.Boolean(
-        string="Stackable", help="Define if the package is stackable by default",
+        string="Stackable", help="Define if the package is stackable by default"
     )
diff --git a/delivery_schenker/models/schenker_request.py b/delivery_schenker/models/schenker_request.py
index 3aca07c780..b0e4b96e41 100644
--- a/delivery_schenker/models/schenker_request.py
+++ b/delivery_schenker/models/schenker_request.py
@@ -25,10 +25,10 @@
 
 class SchenkerRequest:
     """Interface between Schenker SOAP API and Odoo recordset
-       Abstract Schenker API Operations to connect them with Odoo
+    Abstract Schenker 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.
+    Not all the features are implemented, but could be easily extended with
+    the provided API. We leave the operations empty for future.
     """
 
     def __init__(
@@ -127,10 +127,7 @@ def _send_shipping(self, picking_vals, method=False):
         response = self._process_reply(
             self.client.service[self._shipping_type_method(method)], vals
         )
-        return {
-            "booking_id": response.bookingId,
-            "barcode": response.barcodeDocument,
-        }
+        return {"booking_id": response.bookingId, "barcode": response.barcodeDocument}
 
     def _shipping_label(self, reference_list=None):
         """Get shipping label for the given ref

From 5d26505f22dcd129b988b144ec73722c70e2a118 Mon Sep 17 00:00:00 2001
From: Ethan Hildick <ethan@studio73.es>
Date: Mon, 13 Dec 2021 11:56:50 +0100
Subject: [PATCH 08/23] [MIG] delivery_schenker: Migration to 14.0

---
 delivery_schenker/__manifest__.py            | 5 +++--
 delivery_schenker/models/delivery_carrier.py | 5 ++++-
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/delivery_schenker/__manifest__.py b/delivery_schenker/__manifest__.py
index 63edac871f..c3f7c1be25 100644
--- a/delivery_schenker/__manifest__.py
+++ b/delivery_schenker/__manifest__.py
@@ -1,12 +1,13 @@
 # Copyright 2021 Tecnativa - David Vidal
+# Copyright 2021 Studio73 - Ethan Hildick <ethan@studio73.es>
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 {
     "name": "Delivery Schenker",
     "summary": "Delivery Carrier implementation for DB Schenker API",
-    "version": "13.0.1.0.1",
+    "version": "14.0.1.0.0",
     "category": "Stock",
     "website": "https://github.com/OCA/delivery-carrier",
-    "author": "Tecnativa, Odoo Community Association (OCA)",
+    "author": "Tecnativa, Studio73, Odoo Community Association (OCA)",
     "license": "AGPL-3",
     "application": False,
     "installable": True,
diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index 1a47ee6c70..a747def0b6 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -11,7 +11,10 @@
 class DeliveryCarrier(models.Model):
     _inherit = "delivery.carrier"
 
-    delivery_type = fields.Selection(selection_add=[("schenker", "DB Schenker")])
+    delivery_type = fields.Selection(
+        selection_add=[("schenker", "DB Schenker")],
+        ondelete={"schenker": "set default"},
+    )
     schenker_access_key = fields.Char(string="Access Key", help="Schenker Access Key")
     schenker_group_id = fields.Char(string="Group")
     schenker_user = fields.Char(string="User")

From dbec8132b561436dc632882877debd222bf11a76 Mon Sep 17 00:00:00 2001
From: Ethan Hildick <ethan@studio73.es>
Date: Tue, 14 Dec 2021 09:56:19 +0100
Subject: [PATCH 09/23] [IMP] delivery_schenker: Minimum for volume

If we had a non-zero value that ended up being < 0.01, it would send 0.0 and fail
---
 delivery_schenker/models/delivery_carrier.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index a747def0b6..b43d7d23bc 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -308,7 +308,7 @@ def _schenker_shipping_information_package(self, picking, package):
             "cargoDesc": picking.name + " / " + package.name,
             "grossWeight": round(weight, 2),
             # Default to 1 if no volume informed
-            "volume": volume,
+            "volume": volume or 0.01,
             "packageType": (
                 package.packaging_id.shipper_package_code
                 or self.schenker_default_packaging_id.shipper_package_code

From 7189f7729c585560d302c8be4dc5b733141e3ac2 Mon Sep 17 00:00:00 2001
From: Ethan Hildick <ethan@studio73.es>
Date: Tue, 14 Dec 2021 13:43:57 +0100
Subject: [PATCH 10/23] [IMP] delivery_schenker: Add tracking

---
 .../api/fat_trackingWebServiceV2.wsdl         | 110 ++++++++++++++++++
 .../api/prod_trackingWebServiceV2.wsdl        | 110 ++++++++++++++++++
 delivery_schenker/models/delivery_carrier.py  |  58 ++++++++-
 delivery_schenker/models/schenker_request.py  |  51 ++++----
 4 files changed, 303 insertions(+), 26 deletions(-)
 create mode 100644 delivery_schenker/api/fat_trackingWebServiceV2.wsdl
 create mode 100644 delivery_schenker/api/prod_trackingWebServiceV2.wsdl

diff --git a/delivery_schenker/api/fat_trackingWebServiceV2.wsdl b/delivery_schenker/api/fat_trackingWebServiceV2.wsdl
new file mode 100644
index 0000000000..50d927f267
--- /dev/null
+++ b/delivery_schenker/api/fat_trackingWebServiceV2.wsdl
@@ -0,0 +1,110 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<wsdl:definitions
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+  xmlns:tns="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+  name="PublicShipmentService"
+  targetNamespace="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+>
+  <wsdl:types>
+    <xsd:schema
+      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+      xmlns:tns="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+      xmlns:Q1="http://www.schenker.com/SGI/v4_0"
+      targetNamespace="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+    >
+      <xsd:import
+        namespace="http://www.schenker.com/SGI/v4_0"
+        schemaLocation="https://eschenker-fat.dbschenker.com/webservice/trackingWebServiceV2?xsd=XSDs/ShipmentDetailsPublicView_v1.0.xsd"
+      />
+      <xsd:import
+        namespace="http://www.schenker.com/SGI/v4_0"
+        schemaLocation="https://eschenker-fat.dbschenker.com/webservice/trackingWebServiceV2?xsd=XSDs/ShipmentDetailsPublicRequest_v1.1.xsd"
+      />
+      <xsd:complexType name="ShipmentExceptionType">
+        <xsd:sequence>
+          <xsd:element minOccurs="0" name="BDID" type="xsd:string" />
+          <xsd:element name="faultCode" type="xsd:QName" />
+          <xsd:element name="faultString" type="xsd:string" />
+          <xsd:element minOccurs="0" name="details" type="xsd:string" />
+        </xsd:sequence>
+      </xsd:complexType>
+      <xsd:element name="getPublicServiceShipmentDetails">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="AccessKey" type="xsd:string" />
+            <xsd:element name="in" type="Q1:ShipmentDetailsRequestType" />
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="getPublicShipmentDetailsResponse">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="out" type="Q1:ShipmentDetailsPublicViewType" />
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element
+        name="getPublicShipmentDetailsFault"
+        type="tns:ShipmentExceptionType"
+      >
+
+      </xsd:element>
+    </xsd:schema>
+  </wsdl:types>
+  <wsdl:message name="getPublicShipmentDetailsResponse">
+    <wsdl:part element="tns:getPublicShipmentDetailsResponse" name="parameters">
+
+    </wsdl:part>
+  </wsdl:message>
+  <wsdl:message name="getPublicShipmentDetailsRequest">
+    <wsdl:part element="tns:getPublicServiceShipmentDetails" name="parameters">
+
+    </wsdl:part>
+  </wsdl:message>
+  <wsdl:message name="getPublicShipmentDetailsFault">
+    <wsdl:part element="tns:getPublicShipmentDetailsFault" name="parameters">
+
+    </wsdl:part>
+  </wsdl:message>
+  <wsdl:portType name="PublicShipmentService">
+    <wsdl:operation name="getPublicShipmentDetails">
+      <wsdl:input message="tns:getPublicShipmentDetailsRequest">
+
+      </wsdl:input>
+      <wsdl:output message="tns:getPublicShipmentDetailsResponse">
+
+      </wsdl:output>
+      <wsdl:fault message="tns:getPublicShipmentDetailsFault" name="fault">
+
+      </wsdl:fault>
+    </wsdl:operation>
+  </wsdl:portType>
+  <wsdl:binding name="PublicShipmentServiceSOAP" type="tns:PublicShipmentService">
+    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
+    <wsdl:operation name="getPublicShipmentDetails">
+      <soap:operation
+        soapAction="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2/getPublicShipmentDetails"
+      />
+      <wsdl:input>
+        <soap:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap:body use="literal" />
+      </wsdl:output>
+      <wsdl:fault name="fault">
+        <soap:fault name="fault" use="literal" />
+      </wsdl:fault>
+    </wsdl:operation>
+  </wsdl:binding>
+  <wsdl:service name="PublicShipmentService">
+    <wsdl:port binding="tns:PublicShipmentServiceSOAP" name="PublicShipmentServiceSOAP">
+      <soap:address
+        location="https://eschenker-fat.dbschenker.com/webservice/trackingWebServiceV2"
+      />
+    </wsdl:port>
+  </wsdl:service>
+</wsdl:definitions>
diff --git a/delivery_schenker/api/prod_trackingWebServiceV2.wsdl b/delivery_schenker/api/prod_trackingWebServiceV2.wsdl
new file mode 100644
index 0000000000..0e398d0088
--- /dev/null
+++ b/delivery_schenker/api/prod_trackingWebServiceV2.wsdl
@@ -0,0 +1,110 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+<wsdl:definitions
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+  xmlns:tns="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+  name="PublicShipmentService"
+  targetNamespace="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+>
+  <wsdl:types>
+    <xsd:schema
+      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+      xmlns:tns="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+      xmlns:Q1="http://www.schenker.com/SGI/v4_0"
+      targetNamespace="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2"
+    >
+      <xsd:import
+        namespace="http://www.schenker.com/SGI/v4_0"
+        schemaLocation="https://eschenker.dbschenker.com/webservice/trackingWebServiceV2?xsd=XSDs/ShipmentDetailsPublicView_v1.0.xsd"
+      />
+      <xsd:import
+        namespace="http://www.schenker.com/SGI/v4_0"
+        schemaLocation="https://eschenker.dbschenker.com/webservice/trackingWebServiceV2?xsd=XSDs/ShipmentDetailsPublicRequest_v1.1.xsd"
+      />
+      <xsd:complexType name="ShipmentExceptionType">
+        <xsd:sequence>
+          <xsd:element minOccurs="0" name="BDID" type="xsd:string" />
+          <xsd:element name="faultCode" type="xsd:QName" />
+          <xsd:element name="faultString" type="xsd:string" />
+          <xsd:element minOccurs="0" name="details" type="xsd:string" />
+        </xsd:sequence>
+      </xsd:complexType>
+      <xsd:element name="getPublicServiceShipmentDetails">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="AccessKey" type="xsd:string" />
+            <xsd:element name="in" type="Q1:ShipmentDetailsRequestType" />
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element name="getPublicShipmentDetailsResponse">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="out" type="Q1:ShipmentDetailsPublicViewType" />
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+      <xsd:element
+        name="getPublicShipmentDetailsFault"
+        type="tns:ShipmentExceptionType"
+      >
+
+      </xsd:element>
+    </xsd:schema>
+  </wsdl:types>
+  <wsdl:message name="getPublicShipmentDetailsResponse">
+    <wsdl:part element="tns:getPublicShipmentDetailsResponse" name="parameters">
+
+    </wsdl:part>
+  </wsdl:message>
+  <wsdl:message name="getPublicShipmentDetailsRequest">
+    <wsdl:part element="tns:getPublicServiceShipmentDetails" name="parameters">
+
+    </wsdl:part>
+  </wsdl:message>
+  <wsdl:message name="getPublicShipmentDetailsFault">
+    <wsdl:part element="tns:getPublicShipmentDetailsFault" name="parameters">
+
+    </wsdl:part>
+  </wsdl:message>
+  <wsdl:portType name="PublicShipmentService">
+    <wsdl:operation name="getPublicShipmentDetails">
+      <wsdl:input message="tns:getPublicShipmentDetailsRequest">
+
+      </wsdl:input>
+      <wsdl:output message="tns:getPublicShipmentDetailsResponse">
+
+      </wsdl:output>
+      <wsdl:fault message="tns:getPublicShipmentDetailsFault" name="fault">
+
+      </wsdl:fault>
+    </wsdl:operation>
+  </wsdl:portType>
+  <wsdl:binding name="PublicShipmentServiceSOAP" type="tns:PublicShipmentService">
+    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
+    <wsdl:operation name="getPublicShipmentDetails">
+      <soap:operation
+        soapAction="http://www.schenker.com/CustomerServices/eBusiness/ShipmentService/v2/getPublicShipmentDetails"
+      />
+      <wsdl:input>
+        <soap:body use="literal" />
+      </wsdl:input>
+      <wsdl:output>
+        <soap:body use="literal" />
+      </wsdl:output>
+      <wsdl:fault name="fault">
+        <soap:fault name="fault" use="literal" />
+      </wsdl:fault>
+    </wsdl:operation>
+  </wsdl:binding>
+  <wsdl:service name="PublicShipmentService">
+    <wsdl:port binding="tns:PublicShipmentServiceSOAP" name="PublicShipmentServiceSOAP">
+      <soap:address
+        location="https://eschenker.dbschenker.com/webservice/trackingWebServiceV2"
+      />
+    </wsdl:port>
+  </wsdl:service>
+</wsdl:definitions>
diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index b43d7d23bc..73500193bc 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -7,6 +7,19 @@
 
 from .schenker_request import SchenkerRequest
 
+SCHENKER_STATUS_CODES = {
+    "ENT": ("Booked", "shipping_recorded_in_carrier"),
+    "COL": ("Collected", "shipping_recorded_in_carrier"),
+    "DET": ("Delivered to terminal by shipper", "in_transit"),
+    "ENM": ("Arrived", "in_transit"),
+    "MAN": ("Departed", "in_transit"),
+    "DIS": ("To Consignee's Disposal", "warehouse_delivered"),
+    "DOT": ("Out for Delivery", "in_transit"),
+    "PUP": ("Picked up by consignee", "customer_delivered"),
+    "DLV": ("Delivered", "customer_delivered"),
+    "NDL": ("Not delivered", "canceled_shipment"),
+}
+
 
 class DeliveryCarrier(models.Model):
     _inherit = "delivery.carrier"
@@ -492,9 +505,52 @@ def schenker_get_tracking_link(self, picking):
             % picking.carrier_tracking_ref
         )
 
+    def _prepare_schenker_tracking(self, picking):
+        self.ensure_one()
+        return {
+            "reference": picking.carrier_tracking_ref,
+            "reference_type": "cu",
+            "booking_type": self.schenker_booking_type,
+        }
+
     def schenker_tracking_state_update(self, picking):
         """Tracking state update"""
-        # TODO: To be implemented
+        self.ensure_one()
+        if not picking.carrier_tracking_ref:
+            return
+        schenker_request = SchenkerRequest(
+            **self._get_schenker_credentials(), service="tracking"
+        )
+        response = schenker_request._get_tracking_states(
+            **self._prepare_schenker_tracking(picking)
+        )
+        if response.get("shipment"):
+            shipment = response.get("shipment")[0]
+            info = shipment.ShipmentInfo.ShipmentBasicInfo
+            status_event_list = info.StatusEventList.StatusEvent
+            last_event = SCHENKER_STATUS_CODES.get(info.LastEvent, ("",))
+            picking.write(
+                {
+                    "tracking_state_history": (
+                        "\n".join(
+                            [
+                                "{} {} {} - [{}] {}".format(
+                                    fields.Datetime.from_string(t.Date).strftime(
+                                        "%d/%m/%Y"
+                                    ),
+                                    t.Time.strftime("%H:%M:%S"),
+                                    t.OccurredAt.LocationName,
+                                    t.Status,
+                                    t.StatusDescription._value_1,
+                                )
+                                for t in status_event_list
+                            ]
+                        )
+                    ),
+                    "tracking_state": "[{}] {}".format(info.LastEvent, last_event[0]),
+                    "delivery_state": last_event[1],
+                }
+            )
         return
 
     def schenker_rate_shipment(self, order):
diff --git a/delivery_schenker/models/schenker_request.py b/delivery_schenker/models/schenker_request.py
index b0e4b96e41..228f09b59b 100644
--- a/delivery_schenker/models/schenker_request.py
+++ b/delivery_schenker/models/schenker_request.py
@@ -19,7 +19,7 @@
 }
 SCHENKER_API_SERVICE = {
     "booking": "/webservice/bookingWebServiceV1_1?wsdl",
-    "tracking": "/webservice/bookingWebServiceV1_1?wsdl",
+    "tracking": "/webservice/trackingWebServiceV2?wsdl",
 }
 
 
@@ -47,15 +47,21 @@ def __init__(
             plugins=[self.history],
         )
 
-    def _process_reply(self, service, vals=None):
+    def _process_reply(self, service, vals=None, send_as_kw=False):
         """Schenker API returns error petitions as server exceptions wich makes zeep to
         raise a Fault exception as well. To catch the error info we need to make a
         raw_response request and the extract the error codes from the response."""
         try:
-            response = service(vals)
+            if not send_as_kw:
+                response = service(vals)
+            else:
+                response = service(**vals)
         except Fault as e:
             with self.client.settings(raw_response=True):
-                response = service(vals)
+                if not send_as_kw:
+                    response = service(vals)
+                else:
+                    response = service(**vals)
                 try:
                     root = ET.fromstring(response.text)
                     error_text = next(root.iter("faultstring")).text
@@ -161,27 +167,22 @@ def _cancel_shipment(self, reference=False):
 
     def _tracking_api_credentials(self):
         """Each API has a different credentials SOAP declaration"""
-        credentials = {"accessKey": self.access_key, "in": {}}
-        if self.user:
-            credentials["in"].setdefault("applicationArea", {})
-            credentials["in"]["applicationArea"]["userId"] = self.user
-        if self.group_id:
-            credentials["in"].setdefault("applicationArea", {})
-            credentials["in"]["applicationArea"]["groupId"] = self.group_id
-        return credentials
-
-    def _get_shipment_details(self, reference=False, reference_type="BID"):
-        vals = self._shipping_api_credentials()
-        vals["in"]["referenceNumber"] = reference
-        response = self._process_reply(
-            self.client.service.getPublicServiceShipmentDetails, vals
-        )
-        return response
+        return {"AccessKey": self.access_key, "in": {}}
 
-    def _get_tracking_states(self, reference=False):
-        # TODO: Test Shipping API isn't connected to Test Booking API
+    def _get_tracking_states(
+        self, reference=False, reference_type="cu", booking_type="land"
+    ):
         if not reference:
             return {}
-        # response = self._get_shipment_details(reference)
-        # It should come from ShipmentInfo.ShipmentBasicInfo.StatusEventList
-        return {}
+        vals = self._tracking_api_credentials()
+        vals["in"].update(
+            {
+                "referenceNumber": reference,
+                "referenceType": reference_type,
+                "transportNature": "exp" if booking_type == "land" else "int",
+            }
+        )
+        response = self._process_reply(
+            self.client.service.getPublicShipmentDetails, vals, send_as_kw=True
+        )
+        return {"shipment": response.Shipment}

From 36d4215cb8b7311d543462062773af34b80bf25b Mon Sep 17 00:00:00 2001
From: Ethan Hildick <ethan@studio73.es>
Date: Tue, 14 Dec 2021 16:42:33 +0100
Subject: [PATCH 11/23] [IMP] delivery_schenker: Print extra label button

---
 delivery_schenker/__manifest__.py             |  6 ++++-
 delivery_schenker/models/__init__.py          |  1 +
 delivery_schenker/models/delivery_carrier.py  | 10 +++++--
 delivery_schenker/models/schenker_request.py  | 15 ++++++-----
 delivery_schenker/models/stock_picking.py     | 21 +++++++++++++++
 delivery_schenker/readme/CONTRIBUTORS.rst     |  4 +++
 .../views/stock_picking_views.xml             | 26 +++++++++++++++++++
 7 files changed, 74 insertions(+), 9 deletions(-)
 create mode 100644 delivery_schenker/models/stock_picking.py
 create mode 100644 delivery_schenker/views/stock_picking_views.xml

diff --git a/delivery_schenker/__manifest__.py b/delivery_schenker/__manifest__.py
index c3f7c1be25..dff56d785a 100644
--- a/delivery_schenker/__manifest__.py
+++ b/delivery_schenker/__manifest__.py
@@ -13,5 +13,9 @@
     "installable": True,
     "depends": ["delivery_package_number", "delivery_state"],
     "external_dependencies": {"python": ["zeep"]},
-    "data": ["views/delivery_schenker_view.xml", "data/delivery_schenker_data.xml"],
+    "data": [
+        "views/delivery_schenker_view.xml",
+        "views/stock_picking_views.xml",
+        "data/delivery_schenker_data.xml",
+    ],
 }
diff --git a/delivery_schenker/models/__init__.py b/delivery_schenker/models/__init__.py
index 5915e82b1c..494ed4481e 100644
--- a/delivery_schenker/models/__init__.py
+++ b/delivery_schenker/models/__init__.py
@@ -1,3 +1,4 @@
 from . import delivery_carrier
 from . import product_packaging
 from . import schenker_request
+from . import stock_picking
diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index 73500193bc..8be68fb3cf 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -484,7 +484,7 @@ def schenker_cancel_shipment(self, pickings):
                 self._schenker_log_request(schenker_request, picking)
         return True
 
-    def schenker_get_label(self, reference, reference_type):
+    def schenker_get_label(self, reference):
         """Generate label for picking
         :param picking - stock.picking record
         :returns pdf file
@@ -493,7 +493,13 @@ def schenker_get_label(self, reference, reference_type):
         if not reference:
             return False
         schenker_request = SchenkerRequest(**self._get_schenker_credentials())
-        label = schenker_request._shipping_label(reference, reference_type)
+        format_vals = self.schenker_barcode_format
+        if format_vals == "A4":
+            format_vals = {
+                "start_pos": self.schenker_barcode_a4_start_pos,
+                "_value_1": self.schenker_barcode_format,
+            }
+        label = schenker_request._shipping_label([reference], format_vals)
         if not label:
             return False
         return label
diff --git a/delivery_schenker/models/schenker_request.py b/delivery_schenker/models/schenker_request.py
index 228f09b59b..1cd0af0ea1 100644
--- a/delivery_schenker/models/schenker_request.py
+++ b/delivery_schenker/models/schenker_request.py
@@ -1,6 +1,6 @@
 # Copyright 2021 Tecnativa - David Vidal
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-import binascii
+
 import logging
 from xml.etree import ElementTree as ET
 
@@ -135,18 +135,21 @@ def _send_shipping(self, picking_vals, method=False):
         )
         return {"booking_id": response.bookingId, "barcode": response.barcodeDocument}
 
-    def _shipping_label(self, reference_list=None):
+    def _shipping_label(self, reference_list=None, label_format="A6"):
         """Get shipping label for the given ref
         :param list reference -- shipping reference list
         :returns: base64 with pdf labels
         """
         reference_list = reference_list or []
-        vals = self._shipping_api_credentials()
-        vals.update({"barcodeRequest": [{"booking_id": ref} for ref in reference_list]})
+        vals = dict(
+            **self._shipping_api_credentials(),
+            **{"barcodeRequest": {"format": label_format}}
+        )
+        vals["barcodeRequest"].update({"bookingId": ref for ref in reference_list})
         label = self._process_reply(
-            self.client.service.getBookingRequestLand, vals
+            self.client.service.getBookingBarcodeRequest, vals
         ).document
-        return label and binascii.a2b_base64(label)
+        return label
 
     def _cancel_shipment(self, reference=False):
         """Cancel de expedition for the given ref
diff --git a/delivery_schenker/models/stock_picking.py b/delivery_schenker/models/stock_picking.py
new file mode 100644
index 0000000000..8c68faee64
--- /dev/null
+++ b/delivery_schenker/models/stock_picking.py
@@ -0,0 +1,21 @@
+# Copyright 2021 Studio73 - Ethan Hildick <ethan@studio73.es>
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+from odoo import _, models
+
+
+class StockPicking(models.Model):
+    _inherit = "stock.picking"
+
+    def schenker_get_label(self):
+        self.ensure_one()
+        tracking_ref = self.carrier_tracking_ref
+        if self.delivery_type != "schenker" or not tracking_ref:
+            return
+        label = self.carrier_id.schenker_get_label(tracking_ref)
+        label_name = "schenker_label_{}.pdf".format(tracking_ref)
+        self.message_post(
+            body=(_("Schenker label for %s") % tracking_ref),
+            attachments=[(label_name, label)],
+        )
+        return label
diff --git a/delivery_schenker/readme/CONTRIBUTORS.rst b/delivery_schenker/readme/CONTRIBUTORS.rst
index 94b6ba9536..67b7b7e1dc 100644
--- a/delivery_schenker/readme/CONTRIBUTORS.rst
+++ b/delivery_schenker/readme/CONTRIBUTORS.rst
@@ -1,3 +1,7 @@
 * `Tecnativa <https://www.tecnativa.com>`_:
 
   * David Vidal
+
+* `Studio73 <https://www.studio73.es>`_:
+
+  * Ethan Hildick
diff --git a/delivery_schenker/views/stock_picking_views.xml b/delivery_schenker/views/stock_picking_views.xml
new file mode 100644
index 0000000000..324e1b19fd
--- /dev/null
+++ b/delivery_schenker/views/stock_picking_views.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <record id="view_picking_withcarrier_out_form" model="ir.ui.view">
+        <field name="model">stock.picking</field>
+        <field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form" />
+        <field name="groups_id" eval="[(4, ref('base.group_no_one'))]" />
+        <field name="arch" type="xml">
+            <xpath expr="//header" position='inside'>
+                <button
+                    name="schenker_get_label"
+                    string="Schenker Label"
+                    type="object"
+                    attrs="{
+                        'invisible':[
+                            '|',
+                            '|',
+                            ('delivery_type', '!=', 'schenker'),
+                            ('carrier_tracking_ref', '=', False),
+                            ('state', '!=', 'done')
+                        ]
+                    }"
+                />
+            </xpath>
+        </field>
+    </record>
+</odoo>

From 995d8f0afe302b26d7a7beb575210b50749729f7 Mon Sep 17 00:00:00 2001
From: Ethan Hildick <ethan@studio73.es>
Date: Tue, 14 Dec 2021 17:16:45 +0100
Subject: [PATCH 12/23] [I18N] delivery_schenker: Spanish translation

---
 delivery_schenker/i18n/delivery_schenker.pot | 126 +++-
 delivery_schenker/i18n/es.po                 | 696 +++++++++++++++++++
 delivery_schenker/models/delivery_carrier.py |   4 +-
 3 files changed, 821 insertions(+), 5 deletions(-)
 create mode 100644 delivery_schenker/i18n/es.po

diff --git a/delivery_schenker/i18n/delivery_schenker.pot b/delivery_schenker/i18n/delivery_schenker.pot
index 98c25dfd97..31c2771de6 100644
--- a/delivery_schenker/i18n/delivery_schenker.pot
+++ b/delivery_schenker/i18n/delivery_schenker.pot
@@ -4,8 +4,10 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Odoo Server 13.0\n"
+"Project-Id-Version: Odoo Server 14.0+e\n"
 "Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-12-14 15:46+0000\n"
+"PO-Revision-Date: 2021-12-14 15:46+0000\n"
 "Last-Translator: \n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
@@ -87,7 +89,7 @@ msgstr ""
 
 #. module: delivery_schenker
 #: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_booking_type
-msgid "Choose Scnecker booking type. Only land is currently suported"
+msgid "Choose Schenker booking type. Only land is currently supported"
 msgstr ""
 
 #. module: delivery_schenker
@@ -291,7 +293,14 @@ msgstr ""
 msgid ""
 "Defines service type: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depending on the "
 "Transport mode the service will be validated. For instance if the transport "
-"mode is AIR, the service type P2P (PortToPort)"
+"mode is AIR, the service type A2A (AirportToAirport)"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__display_name
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__display_name
+#: model:ir.model.fields,field_description:delivery_schenker.field_stock_picking__display_name
+msgid "Display Name"
 msgstr ""
 
 #. module: delivery_schenker
@@ -354,6 +363,13 @@ msgstr ""
 msgid "Home Delivery"
 msgstr ""
 
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__id
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__id
+#: model:ir.model.fields,field_description:delivery_schenker.field_stock_picking__id
+msgid "ID"
+msgstr ""
+
 #. module: delivery_schenker
 #: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_default_packaging_id
 msgid ""
@@ -393,6 +409,13 @@ msgid ""
 "services could not be available"
 msgstr ""
 
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier____last_update
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging____last_update
+#: model:ir.model.fields,field_description:delivery_schenker.field_stock_picking____last_update
+msgid "Last Modified on"
+msgstr ""
+
 #. module: delivery_schenker
 #: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__loading_meters
 msgid "Loading meters"
@@ -494,12 +517,23 @@ msgstr ""
 msgid "Schenker Configuration"
 msgstr ""
 
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_picking_withcarrier_out_form
+msgid "Schenker Label"
+msgstr ""
+
 #. module: delivery_schenker
 #: code:addons/delivery_schenker/models/delivery_carrier.py:0
 #, python-format
 msgid "Schenker Shipping barcode document"
 msgstr ""
 
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/stock_picking.py:0
+#, python-format
+msgid "Schenker label for %s"
+msgstr ""
+
 #. module: delivery_schenker
 #: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
 msgid "Service"
@@ -525,6 +559,11 @@ msgstr ""
 msgid "The proper request will be formed accordingly from the picking"
 msgstr ""
 
+#. module: delivery_schenker
+#: model:ir.model,name:delivery_schenker.model_stock_picking
+msgid "Transfer"
+msgstr ""
+
 #. module: delivery_schenker
 #: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_user
 msgid "User"
@@ -559,3 +598,84 @@ msgstr ""
 #: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc8
 msgid "austroexpress PUNKT 8"
 msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_23
+msgid "cm"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_23
+msgid "kg"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_23
+msgid "m³"
+msgstr ""
diff --git a/delivery_schenker/i18n/es.po b/delivery_schenker/i18n/es.po
new file mode 100644
index 0000000000..577da98616
--- /dev/null
+++ b/delivery_schenker/i18n/es.po
@@ -0,0 +1,696 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# 	* delivery_schenker
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 14.0+e\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2021-12-14 15:46+0000\n"
+"PO-Revision-Date: 2021-12-14 15:46+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_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_barcode_format__a4
+msgid "A4"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_barcode_format__a6
+msgid "A6"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_access_key
+msgid "Access Key"
+msgstr "Clave de acceso"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__a2a
+msgid "Aiport-to-airport"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__air
+msgid "Air"
+msgstr "Aéreo"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_service_air
+msgid "Air service"
+msgstr "Servicio aéreo"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_service_air
+msgid ""
+"Air shipping product options. Depending on your customer account, some "
+"services could not be available"
+msgstr ""
+"Opciones de productos de envío aéreo. Dependiendo de tu cuenta de cliente, algunos "
+"servicios podrían no estar disponibles."
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__a2d
+msgid "Airport-to-door"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_mail
+msgid "Barcode Copy Email"
+msgstr "Enviar etiqueta por correo"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_format
+msgid "Barcode Format"
+msgstr "Formato de etiqueta"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_separated
+msgid "Barcode Separated"
+msgstr "Separar etiquetas"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_start_pos
+msgid "Barcode Start Position"
+msgstr "Primera posición de etiquetas"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_booking_type
+msgid "Booking Type"
+msgstr "Tipo de envío"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__package_carrier_type
+msgid "Carrier"
+msgstr "Transportista"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_booking_type
+msgid "Choose Schenker booking type. Only land is currently supported"
+msgstr "Elige tipo de envío Schenker. Actualmente solo está soportado los envíos terrestres."
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Connection"
+msgstr "Conexión"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__71
+msgid "DB SCHENKERdirect"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__b
+msgid "DB SCHENKERjetcargo business"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__e
+msgid "DB SCHENKERjetcargo economy"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__f
+msgid "DB SCHENKERjetcargo first"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__s
+msgid "DB SCHENKERjetcargo special"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__eagd
+msgid "DB SCHENKERjetexpress gold"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_air__easv
+msgid "DB SCHENKERjetexpress silver"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ecpa
+msgid "DB SCHENKERparcel"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ectn
+msgid "DB SCHENKERspeed"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ect1
+msgid "DB SCHENKERspeed 10"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ect2
+msgid "DB SCHENKERspeed 12"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ect8
+msgid "DB SCHENKERspeed 8"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__40
+msgid "DB SCHENKERsystem classic"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__sysd
+msgid "DB SCHENKERsystem domestic"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__schx
+msgid "DB SCHENKERsystem fix"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__42
+msgid "DB SCHENKERsystem fixday"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__schs
+msgid "DB SCHENKERsystem international"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__41
+msgid "DB SCHENKERsystem speed"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__scht
+msgid "DB SCHENKERtop"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__sch2
+msgid "DB SCHENKERtop 12"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__delivery_type__schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__product_packaging__package_carrier_type__schenker
+msgid "DB Schenker"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__43
+msgid "DBSchenker System"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__44
+msgid "DBSchenker System Premium"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__con
+msgid "DBSchenkerconcepts"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__dir
+msgid "DBSchenkerdirects"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__pal
+msgid "DBSchenkerpallets"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__lpa
+msgid "DBSchenkerparcel Logistics Parcel"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__pri
+msgid "DBSchenkerprivpark"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_incoterm_id
+msgid "Default Incoterm"
+msgstr "Incoterm por defecto"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_default_packaging_id
+msgid "Default Package Type"
+msgstr "Tipo de empaquetado por defecto"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_product_packaging__schenker_stackable
+msgid "Define if the package is stackable by default"
+msgstr "Define si el paquete es apilable por defecto"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_indoor_delivery
+msgid "Defines if indoor delivery is required"
+msgstr "Define si es necesaria la entrega a interiores"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_express
+msgid "Defines if shipment is express"
+msgstr "Define si el envío es exprés"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_food_related
+msgid "Defines if shipment is food related"
+msgstr "Define si el envío está relacionado con la comida"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_pharmaceuticals
+msgid "Defines if shipment is pharmaceutical"
+msgstr "Define si el envío es farmacéutico"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_heated_transport
+msgid "Defines if shipment is required heated transport"
+msgstr "Define si el envío requiere transporte calentado"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_home_delivery
+msgid "Defines if shipment is required home delivery"
+msgstr "Define si el envío require la entrega a domicilio"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_own_pickup
+msgid "Defines if shipment is required own pickup"
+msgstr "Define si el envío require recogida propia"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_service_type
+msgid ""
+"Defines service type: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depending on the "
+"Transport mode the service will be validated. For instance if the transport "
+"mode is AIR, the service type A2A (AirportToAirport)"
+msgstr ""
+"Define los tipos de servicio: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depende del tipo "
+"de servicio elegido será validado. Por ejemplo si el transporte es Aéreo, un tipo de "
+"de servicio correcto sería A2A (AirportToAirport)"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__display_name
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__display_name
+#: model:ir.model.fields,field_description:delivery_schenker.field_stock_picking__display_name
+msgid "Display Name"
+msgstr "Nombre mostrado"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__d2a
+msgid "Door-to-airport"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__d2d
+msgid "Door-to-door"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__d2p
+msgid "Door-to-port"
+msgstr ""
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/schenker_request.py:0
+#, python-format
+msgid ""
+"Error in the request to the Schenker API. This is the thrown message:\n"
+"\n"
+"[%s]\n"
+"%s - %s"
+msgstr ""
+"Error en el pedido contra la API Schenker. Este es el mensaje devuelto:\n"
+"\n"
+"[%s]\n"
+"%s - %s"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_express
+msgid "Express"
+msgstr "Exprés"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_food_related
+msgid "Food Related"
+msgstr "Envío relacionado con alimientos"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_separated
+msgid "For A4 define if the labels shall be printed on separate pages"
+msgstr "Para las etiquetas A4, define si se deben imprimir en páginas por separado"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_start_pos
+msgid "For A4 format you can define the starting position"
+msgstr "Para las etiquetas A4, define la primera posición"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_group_id
+msgid "Group"
+msgstr "Grupo"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_heated_transport
+msgid "Heated Transport"
+msgstr "Transporte calentado"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_home_delivery
+msgid "Home Delivery"
+msgstr "Envío a domicilio"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__id
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__id
+#: model:ir.model.fields,field_description:delivery_schenker.field_stock_picking__id
+msgid "ID"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_default_packaging_id
+msgid ""
+"If not delivery package or the package doesn't have defined the packagingit "
+"will default to this type"
+msgstr ""
+"Si el envío no es un paquete o el paquete no tiene definido el empaquetado "
+"usará este por defecto"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_indoor_delivery
+msgid "Indoor Delivery"
+msgstr "Entrega a interiores"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_incoterm_id
+msgid "It will be overriden by the sale order one if it's specified."
+msgstr "Indica el incoterm, será sobreescrito por el incoterm del pedido de venta si ese está establecido"
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Label"
+msgstr "Etiqueta"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__land
+msgid "Land"
+msgstr "Terrestre"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_service_land
+msgid "Land service"
+msgstr "Servicio terrestre"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_service_land
+msgid ""
+"Land shipping product options. Depending on your customer account, some "
+"services could not be available"
+msgstr ""
+"Opciones de productos de envío terrestre. Dependiendo de tu cuenta de cliente, algunos "
+"servicios podrían no estar disponibles."
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier____last_update
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging____last_update
+#: model:ir.model.fields,field_description:delivery_schenker.field_stock_picking____last_update
+msgid "Last Modified on"
+msgstr "Última modificación el"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__loading_meters
+msgid "Loading meters"
+msgstr "Metros de carga"
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Logistics"
+msgstr "Datos logísticos"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_measure_unit
+msgid "Measure Unit"
+msgstr "Unidad de medida"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__ocean_fcl
+msgid "Ocean FCL"
+msgstr "Marítimo FCL"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_booking_type__ocean_lcl
+msgid "Ocean LCL"
+msgstr "Marítimo LCL"
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid "Only land shipping is currently supported"
+msgstr "Actualmente solo los envíos terretres están soportados"
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid "Only volume is currently supported"
+msgstr "Actualmente solo el volumen está soportado"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_mail
+msgid "Optional: send a barcode copy to this email address"
+msgstr "Opcional: Enviar una cópia de la etiqueta a este correo"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_own_pickup
+msgid "Own Pickup"
+msgstr "Recogida propia"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__pallet_space
+msgid "Pallet space"
+msgstr "Espacio palet"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_pharmaceuticals
+msgid "Pharmaceuticals"
+msgstr "Farmacéutico"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__pieces
+msgid "Pieces"
+msgstr "Bultos"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__p2d
+msgid "Port-to-door"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model,name:delivery_schenker.model_product_packaging
+msgid "Product Packaging"
+msgstr "Empaquetado de producto"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__delivery_type
+msgid "Provider"
+msgstr "Proveedor"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__ecsp
+msgid "SCHENKERsystem-plus"
+msgstr ""
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid ""
+"Schenker 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."
+msgstr ""
+"API Schenker no provee ninguna forma de calcular las tarifas de envío, por"
+"lo tanto se deberia usar otro método o sobreescribir este en código personalizado."
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_access_key
+msgid "Schenker Access Key"
+msgstr "Clave de acceso Schenker"
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Schenker Configuration"
+msgstr "Configuración Schenker"
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_picking_withcarrier_out_form
+msgid "Schenker Label"
+msgstr "Etiqueta Schenker"
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#, python-format
+msgid "Schenker Shipping barcode document"
+msgstr "Etiqueta de envío Schenker"
+
+#. module: delivery_schenker
+#: code:addons/delivery_schenker/models/stock_picking.py:0
+#, python-format
+msgid "Schenker label for %s"
+msgstr "Etiqueta Schenker para envío %s"
+
+#. module: delivery_schenker
+#: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
+msgid "Service"
+msgstr "Servicio"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_service_type
+msgid "Service Type"
+msgstr "Tipo de servicio"
+
+#. module: delivery_schenker
+#: model:ir.model,name:delivery_schenker.model_delivery_carrier
+msgid "Shipping Methods"
+msgstr "Métodos de envío"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_product_packaging__schenker_stackable
+msgid "Stackable"
+msgstr "Apilable"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_measure_unit
+msgid "The proper request will be formed accordingly from the picking"
+msgstr "La petición apropiada será creada a partir del albarán"
+
+#. module: delivery_schenker
+#: model:ir.model,name:delivery_schenker.model_stock_picking
+msgid "Transfer"
+msgstr "Albarán"
+
+#. module: delivery_schenker
+#: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__schenker_user
+msgid "User"
+msgstr "Usuario"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_measure_unit__volume
+msgid "Volume"
+msgstr "Volumen"
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auco
+msgid "austrocargo"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc0
+msgid "austroexpress PUNKT 10"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc2
+msgid "austroexpress PUNKT 12"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__aucc
+msgid "austroexpress PUNKT 17"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc8
+msgid "austroexpress PUNKT 8"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_23
+msgid "cm"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_23
+msgid "kg"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_23
+msgid "m³"
+msgstr ""
diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index 8be68fb3cf..8982cc1f4c 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -40,7 +40,7 @@ class DeliveryCarrier(models.Model):
         ],
         default="land",
         string="Booking Type",
-        help="Choose Scnecker booking type. Only land is currently suported",
+        help="Choose Schenker booking type. Only land is currently supported",
     )
     schenker_barcode_format = fields.Selection(
         selection=[("A4", "A4"), ("A6", "A6")], default="A6", string="Barcode Format"
@@ -68,7 +68,7 @@ class DeliveryCarrier(models.Model):
         string="Service Type",
         help="Defines service type: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depending on "
         "the Transport mode the service will be validated. For instance if the "
-        "transport mode is AIR, the service type P2P (PortToPort)",
+        "transport mode is AIR, the service type A2A (AirportToAirport)",
         selection=[
             ("D2D", "Door-to-door"),
             ("D2P", "Door-to-port"),

From ebf669e2da6fb47bb344932edd86c01d75f9cc83 Mon Sep 17 00:00:00 2001
From: oca-travis <oca+oca-travis@odoo-community.org>
Date: Tue, 14 Dec 2021 17:56:00 +0000
Subject: [PATCH 13/23] [UPD] Update delivery_schenker.pot

---
 delivery_schenker/i18n/delivery_schenker.pot | 85 +-------------------
 1 file changed, 1 insertion(+), 84 deletions(-)

diff --git a/delivery_schenker/i18n/delivery_schenker.pot b/delivery_schenker/i18n/delivery_schenker.pot
index 31c2771de6..a43b19eb4d 100644
--- a/delivery_schenker/i18n/delivery_schenker.pot
+++ b/delivery_schenker/i18n/delivery_schenker.pot
@@ -4,10 +4,8 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Odoo Server 14.0+e\n"
+"Project-Id-Version: Odoo Server 14.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-14 15:46+0000\n"
-"PO-Revision-Date: 2021-12-14 15:46+0000\n"
 "Last-Translator: \n"
 "Language-Team: \n"
 "MIME-Version: 1.0\n"
@@ -598,84 +596,3 @@ msgstr ""
 #: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc8
 msgid "austroexpress PUNKT 8"
 msgstr ""
-
-#. module: delivery_schenker
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_01
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_02
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_03
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_04
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_05
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_06
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_07
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_08
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_09
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_10
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_11
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_12
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_13
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_14
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_15
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_16
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_17
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_18
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_19
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_20
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_21
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_22
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_23
-msgid "cm"
-msgstr ""
-
-#. module: delivery_schenker
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_01
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_02
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_03
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_04
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_05
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_06
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_07
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_08
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_09
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_10
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_11
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_12
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_13
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_14
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_15
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_16
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_17
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_18
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_19
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_20
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_21
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_22
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_23
-msgid "kg"
-msgstr ""
-
-#. module: delivery_schenker
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_01
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_02
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_03
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_04
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_05
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_06
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_07
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_08
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_09
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_10
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_11
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_12
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_13
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_14
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_15
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_16
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_17
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_18
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_19
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_20
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_21
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_22
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_23
-msgid "m³"
-msgstr ""

From 64e62fa75f9c367321100bb7c7b04a74767eb607 Mon Sep 17 00:00:00 2001
From: OCA-git-bot <oca-git-bot@odoo-community.org>
Date: Tue, 14 Dec 2021 18:02:26 +0000
Subject: [PATCH 14/23] [UPD] README.rst

---
 delivery_schenker/README.rst                    | 15 ++++++++++-----
 delivery_schenker/static/description/index.html | 11 ++++++++---
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/delivery_schenker/README.rst b/delivery_schenker/README.rst
index a4155ec4ec..225a645887 100644
--- a/delivery_schenker/README.rst
+++ b/delivery_schenker/README.rst
@@ -14,13 +14,13 @@ Delivery Schenker
     :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
     :alt: License: AGPL-3
 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github
-    :target: https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker
+    :target: https://github.com/OCA/delivery-carrier/tree/14.0/delivery_schenker
     :alt: OCA/delivery-carrier
 .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
-    :target: https://translation.odoo-community.org/projects/delivery-carrier-13-0/delivery-carrier-13-0-delivery_schenker
+    :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_schenker
     :alt: Translate me on Weblate
 .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
-    :target: https://runbot.odoo-community.org/runbot/99/13.0
+    :target: https://runbot.odoo-community.org/runbot/99/14.0
     :alt: Try me on Runbot
 
 |badge1| |badge2| |badge3| |badge4| |badge5| 
@@ -133,7 +133,7 @@ Bug Tracker
 Bugs are tracked on `GitHub Issues <https://github.com/OCA/delivery-carrier/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/delivery-carrier/issues/new?body=module:%20delivery_schenker%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
+`feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_schenker%0Aversion:%2014.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.
 
@@ -144,6 +144,7 @@ Authors
 ~~~~~~~
 
 * Tecnativa
+* Studio73
 
 Contributors
 ~~~~~~~~~~~~
@@ -152,6 +153,10 @@ Contributors
 
   * David Vidal
 
+* `Studio73 <https://www.studio73.es>`_:
+
+  * Ethan Hildick
+
 Maintainers
 ~~~~~~~~~~~
 
@@ -165,6 +170,6 @@ OCA, or the Odoo Community Association, is a nonprofit organization whose
 mission is to support the collaborative development of Odoo features and
 promote its widespread use.
 
-This module is part of the `OCA/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker>`_ project on GitHub.
+This module is part of the `OCA/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/14.0/delivery_schenker>`_ project on GitHub.
 
 You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/delivery_schenker/static/description/index.html b/delivery_schenker/static/description/index.html
index d75d6f1bb1..029505c24c 100644
--- a/delivery_schenker/static/description/index.html
+++ b/delivery_schenker/static/description/index.html
@@ -367,7 +367,7 @@ <h1 class="title">Delivery Schenker</h1>
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-13-0/delivery-carrier-13-0-delivery_schenker"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_schenker"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_schenker"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
 <p>This module links the <a class="reference external" href="https://www.dbschenker.com">DB Schenker</a> booking and tracking
 APIs with Odoo delivery system.</p>
 <p><strong>Table of contents</strong></p>
@@ -493,7 +493,7 @@ <h1><a class="toc-backref" href="#id10">Bug Tracker</a></h1>
 <p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/delivery-carrier/issues">GitHub Issues</a>.
 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
-<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_schenker%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
+<a class="reference external" href="https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_schenker%0Aversion:%2014.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
 <p>Do not contact contributors directly about support or help with technical issues.</p>
 </div>
 <div class="section" id="credits">
@@ -502,6 +502,7 @@ <h1><a class="toc-backref" href="#id11">Credits</a></h1>
 <h2><a class="toc-backref" href="#id12">Authors</a></h2>
 <ul class="simple">
 <li>Tecnativa</li>
+<li>Studio73</li>
 </ul>
 </div>
 <div class="section" id="contributors">
@@ -511,6 +512,10 @@ <h2><a class="toc-backref" href="#id13">Contributors</a></h2>
 <li>David Vidal</li>
 </ul>
 </li>
+<li><a class="reference external" href="https://www.studio73.es">Studio73</a>:<ul>
+<li>Ethan Hildick</li>
+</ul>
+</li>
 </ul>
 </div>
 <div class="section" id="maintainers">
@@ -520,7 +525,7 @@ <h2><a class="toc-backref" href="#id14">Maintainers</a></h2>
 <p>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.</p>
-<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/13.0/delivery_schenker">OCA/delivery-carrier</a> project on GitHub.</p>
+<p>This module is part of the <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_schenker">OCA/delivery-carrier</a> project on GitHub.</p>
 <p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
 </div>
 </div>

From 9ee0d8e39eb45176a5012ff136250254f4ac2727 Mon Sep 17 00:00:00 2001
From: Ethan Hildick <ethan@studio73.es>
Date: Thu, 13 Jan 2022 10:50:53 +0100
Subject: [PATCH 15/23] [14.0][IMP] delivery_schenker: Return expected dict
 instead of error

When returning an error, any call to rate_shipment will completely block the transaction
which is undesirable as it is always called when making an order through a website and the end customer gets an error.
The expected/correct way of handling this is to return a dict with an appropriate warning
---
 delivery_schenker/models/delivery_carrier.py | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index 8982cc1f4c..d281425cd2 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -561,13 +561,20 @@ def schenker_tracking_state_update(self, picking):
 
     def schenker_rate_shipment(self, order):
         """There's no public API so another price method should be used."""
-        raise NotImplementedError(
-            _(
+        return {
+            "success": True,
+            "price": self.product_id.lst_price,
+            "error_message": _(
                 "Schenker 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": _(
+                "Schenker 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."
+            ),
+        }
 
     # UX Control over not implemented features.
 

From 39fc1fa69eec07b44bf6de57c10611e809ac25b5 Mon Sep 17 00:00:00 2001
From: oca-ci <oca-ci@odoo-community.org>
Date: Mon, 17 Oct 2022 15:31:05 +0000
Subject: [PATCH 16/23] [UPD] Update delivery_schenker.pot

---
 delivery_schenker/i18n/delivery_schenker.pot | 1 +
 1 file changed, 1 insertion(+)

diff --git a/delivery_schenker/i18n/delivery_schenker.pot b/delivery_schenker/i18n/delivery_schenker.pot
index a43b19eb4d..aa6827b2eb 100644
--- a/delivery_schenker/i18n/delivery_schenker.pot
+++ b/delivery_schenker/i18n/delivery_schenker.pot
@@ -498,6 +498,7 @@ msgstr ""
 
 #. module: delivery_schenker
 #: code:addons/delivery_schenker/models/delivery_carrier.py:0
+#: code:addons/delivery_schenker/models/delivery_carrier.py:0
 #, python-format
 msgid ""
 "Schenker API doesn't provide methods to compute delivery rates, so you "

From b69990bca31e231022f99bc5e036623475b2752d Mon Sep 17 00:00:00 2001
From: OCA-git-bot <oca-git-bot@odoo-community.org>
Date: Mon, 17 Oct 2022 15:36:05 +0000
Subject: [PATCH 17/23] delivery_schenker 14.0.1.0.1

---
 delivery_schenker/__manifest__.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/delivery_schenker/__manifest__.py b/delivery_schenker/__manifest__.py
index dff56d785a..8b8377a4ab 100644
--- a/delivery_schenker/__manifest__.py
+++ b/delivery_schenker/__manifest__.py
@@ -4,7 +4,7 @@
 {
     "name": "Delivery Schenker",
     "summary": "Delivery Carrier implementation for DB Schenker API",
-    "version": "14.0.1.0.0",
+    "version": "14.0.1.0.1",
     "category": "Stock",
     "website": "https://github.com/OCA/delivery-carrier",
     "author": "Tecnativa, Studio73, Odoo Community Association (OCA)",

From acdc1e596526d8200137a3a00c9557f036792424 Mon Sep 17 00:00:00 2001
From: Weblate <noreply@weblate.org>
Date: Mon, 17 Oct 2022 15:36:20 +0000
Subject: [PATCH 18/23] Update translation files

Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Translation: delivery-carrier-14.0/delivery-carrier-14.0-delivery_schenker
Translate-URL: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_schenker/
---
 delivery_schenker/i18n/es.po | 112 ++++++-----------------------------
 1 file changed, 19 insertions(+), 93 deletions(-)

diff --git a/delivery_schenker/i18n/es.po b/delivery_schenker/i18n/es.po
index 577da98616..3f6a36f192 100644
--- a/delivery_schenker/i18n/es.po
+++ b/delivery_schenker/i18n/es.po
@@ -10,6 +10,7 @@ msgstr ""
 "PO-Revision-Date: 2021-12-14 15:46+0000\n"
 "Last-Translator: \n"
 "Language-Team: \n"
+"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: \n"
@@ -51,8 +52,8 @@ msgid ""
 "Air shipping product options. Depending on your customer account, some "
 "services could not be available"
 msgstr ""
-"Opciones de productos de envío aéreo. Dependiendo de tu cuenta de cliente, algunos "
-"servicios podrían no estar disponibles."
+"Opciones de productos de envío aéreo. Dependiendo de tu cuenta de cliente, "
+"algunos servicios podrían no estar disponibles."
 
 #. module: delivery_schenker
 #: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_type__a2d
@@ -92,7 +93,9 @@ msgstr "Transportista"
 #. module: delivery_schenker
 #: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_booking_type
 msgid "Choose Schenker booking type. Only land is currently supported"
-msgstr "Elige tipo de envío Schenker. Actualmente solo está soportado los envíos terrestres."
+msgstr ""
+"Elige tipo de envío Schenker. Actualmente solo está soportado los envíos "
+"terrestres."
 
 #. module: delivery_schenker
 #: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
@@ -297,9 +300,9 @@ msgid ""
 "Transport mode the service will be validated. For instance if the transport "
 "mode is AIR, the service type A2A (AirportToAirport)"
 msgstr ""
-"Define los tipos de servicio: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depende del tipo "
-"de servicio elegido será validado. Por ejemplo si el transporte es Aéreo, un tipo de "
-"de servicio correcto sería A2A (AirportToAirport)"
+"Define los tipos de servicio: D2D, D2P, P2D, P2P, D2A, A2D, A2A. Depende del "
+"tipo de servicio elegido será validado. Por ejemplo si el transporte es "
+"Aéreo, un tipo de de servicio correcto sería A2A (AirportToAirport)"
 
 #. module: delivery_schenker
 #: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier__display_name
@@ -350,7 +353,8 @@ msgstr "Envío relacionado con alimientos"
 #. module: delivery_schenker
 #: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_separated
 msgid "For A4 define if the labels shall be printed on separate pages"
-msgstr "Para las etiquetas A4, define si se deben imprimir en páginas por separado"
+msgstr ""
+"Para las etiquetas A4, define si se deben imprimir en páginas por separado"
 
 #. module: delivery_schenker
 #: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_barcode_a4_start_pos
@@ -396,7 +400,9 @@ msgstr "Entrega a interiores"
 #. module: delivery_schenker
 #: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_incoterm_id
 msgid "It will be overriden by the sale order one if it's specified."
-msgstr "Indica el incoterm, será sobreescrito por el incoterm del pedido de venta si ese está establecido"
+msgstr ""
+"Indica el incoterm, será sobreescrito por el incoterm del pedido de venta si "
+"ese está establecido"
 
 #. module: delivery_schenker
 #: model_terms:ir.ui.view,arch_db:delivery_schenker.view_delivery_carrier_form
@@ -419,8 +425,8 @@ msgid ""
 "Land shipping product options. Depending on your customer account, some "
 "services could not be available"
 msgstr ""
-"Opciones de productos de envío terrestre. Dependiendo de tu cuenta de cliente, algunos "
-"servicios podrían no estar disponibles."
+"Opciones de productos de envío terrestre. Dependiendo de tu cuenta de "
+"cliente, algunos servicios podrían no estar disponibles."
 
 #. module: delivery_schenker
 #: model:ir.model.fields,field_description:delivery_schenker.field_delivery_carrier____last_update
@@ -519,8 +525,9 @@ msgid ""
 "should relay on another price method instead or override this one in your "
 "custom code."
 msgstr ""
-"API Schenker no provee ninguna forma de calcular las tarifas de envío, por"
-"lo tanto se deberia usar otro método o sobreescribir este en código personalizado."
+"API Schenker no provee ninguna forma de calcular las tarifas de envío, porlo "
+"tanto se deberia usar otro método o sobreescribir este en código "
+"personalizado."
 
 #. module: delivery_schenker
 #: model:ir.model.fields,help:delivery_schenker.field_delivery_carrier__schenker_access_key
@@ -613,84 +620,3 @@ msgstr ""
 #: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc8
 msgid "austroexpress PUNKT 8"
 msgstr ""
-
-#. module: delivery_schenker
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_01
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_02
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_03
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_04
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_05
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_06
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_07
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_08
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_09
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_10
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_11
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_12
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_13
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_14
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_15
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_16
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_17
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_18
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_19
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_20
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_21
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_22
-#: model:product.packaging,length_uom_name:delivery_schenker.schenker_packaging_23
-msgid "cm"
-msgstr ""
-
-#. module: delivery_schenker
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_01
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_02
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_03
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_04
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_05
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_06
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_07
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_08
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_09
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_10
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_11
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_12
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_13
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_14
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_15
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_16
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_17
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_18
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_19
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_20
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_21
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_22
-#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_23
-msgid "kg"
-msgstr ""
-
-#. module: delivery_schenker
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_01
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_02
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_03
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_04
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_05
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_06
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_07
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_08
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_09
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_10
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_11
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_12
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_13
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_14
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_15
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_16
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_17
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_18
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_19
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_20
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_21
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_22
-#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_23
-msgid "m³"
-msgstr ""

From aa7e5f8662ce4bd1905415740009fdc330ff71f3 Mon Sep 17 00:00:00 2001
From: oca-ci <oca-ci@odoo-community.org>
Date: Thu, 3 Nov 2022 14:15:12 +0000
Subject: [PATCH 19/23] [UPD] Update delivery_schenker.pot

---
 delivery_schenker/i18n/delivery_schenker.pot | 54 ++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/delivery_schenker/i18n/delivery_schenker.pot b/delivery_schenker/i18n/delivery_schenker.pot
index aa6827b2eb..96c035435b 100644
--- a/delivery_schenker/i18n/delivery_schenker.pot
+++ b/delivery_schenker/i18n/delivery_schenker.pot
@@ -597,3 +597,57 @@ msgstr ""
 #: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc8
 msgid "austroexpress PUNKT 8"
 msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_23
+msgid "kg"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_23
+msgid "m³"
+msgstr ""

From 58af1a884e3833ce69f40e5a35edc18510f8df58 Mon Sep 17 00:00:00 2001
From: Weblate <noreply@weblate.org>
Date: Thu, 3 Nov 2022 14:21:27 +0000
Subject: [PATCH 20/23] Update translation files

Updated by "Update PO files to match POT (msgmerge)" hook in Weblate.

Translation: delivery-carrier-14.0/delivery-carrier-14.0-delivery_schenker
Translate-URL: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_schenker/
---
 delivery_schenker/i18n/es.po | 54 ++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/delivery_schenker/i18n/es.po b/delivery_schenker/i18n/es.po
index 3f6a36f192..25517aecdf 100644
--- a/delivery_schenker/i18n/es.po
+++ b/delivery_schenker/i18n/es.po
@@ -620,3 +620,57 @@ msgstr ""
 #: model:ir.model.fields.selection,name:delivery_schenker.selection__delivery_carrier__schenker_service_land__auc8
 msgid "austroexpress PUNKT 8"
 msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,weight_uom_name:delivery_schenker.schenker_packaging_23
+msgid "kg"
+msgstr ""
+
+#. module: delivery_schenker
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_01
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_02
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_03
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_04
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_05
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_06
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_07
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_08
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_09
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_10
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_11
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_12
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_13
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_14
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_15
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_16
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_17
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_18
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_19
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_20
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_21
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_22
+#: model:product.packaging,volume_uom_name:delivery_schenker.schenker_packaging_23
+msgid "m³"
+msgstr ""

From 21f9b1e6a127cb0a7e3c0930c7d5367862d02505 Mon Sep 17 00:00:00 2001
From: Michael Tietz <mtietz@mt-software.de>
Date: Fri, 24 Mar 2023 07:15:06 +0100
Subject: [PATCH 21/23] [FIX] delivery_schenker: fix missing dependency, before
 there was no volume field for stock.picking

---
 delivery_schenker/README.rst                    |  8 +++++---
 delivery_schenker/models/delivery_carrier.py    | 11 ++++++-----
 delivery_schenker/readme/CONTRIBUTORS.rst       |  1 +
 delivery_schenker/static/description/index.html |  5 +++--
 4 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/delivery_schenker/README.rst b/delivery_schenker/README.rst
index 225a645887..d846e793d8 100644
--- a/delivery_schenker/README.rst
+++ b/delivery_schenker/README.rst
@@ -19,9 +19,9 @@ Delivery Schenker
 .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
     :target: https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_schenker
     :alt: Translate me on Weblate
-.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
-    :target: https://runbot.odoo-community.org/runbot/99/14.0
-    :alt: Try me on Runbot
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+    :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/delivery-carrier&target_branch=14.0
+    :alt: Try me on Runboat
 
 |badge1| |badge2| |badge3| |badge4| |badge5| 
 
@@ -157,6 +157,8 @@ Contributors
 
   * Ethan Hildick
 
+* Michael Tietz (MT Software) <mtietz@mt-software.de>
+
 Maintainers
 ~~~~~~~~~~~
 
diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index d281425cd2..9de0ba5727 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -367,7 +367,7 @@ def _schenker_shipping_information(self, picking):
             }
         ]
 
-    def _schenker_measures(self, picking):
+    def _schenker_measures(self, picking, vals):
         """Only volume is supported as a pallet calculations structure should be
         provided to use the other API options. This hook can be used to communicate
         with the API in the future
@@ -375,7 +375,7 @@ def _schenker_measures(self, picking):
         :returns dict values for the proper unit key and value
         """
         if self.schenker_measure_unit == "VOLUME":
-            return {"measureUnitVolume": round(picking.volume, 2) or 0.01}
+            return {"measureUnitVolume": vals["shippingInformation"]["volume"]}
         return {}
 
     def _prepare_schenker_shipping(self, picking):
@@ -389,6 +389,7 @@ def _prepare_schenker_shipping(self, picking):
         # account to acomplish a properly formed request.
         vals = {}
         vals.update(self._prepare_schenker_barcode())
+        shipping_information = self._schenker_shipping_information(picking)
         vals.update(
             {
                 "address": self._schenker_shipping_address(picking),
@@ -401,9 +402,9 @@ def _prepare_schenker_shipping(self, picking):
                 "measurementType": self._schenker_metric_system(),
                 "grossWeight": round(picking.shipping_weight, 2),
                 "shippingInformation": {
-                    "shipmentPosition": self._schenker_shipping_information(picking),
+                    "shipmentPosition": shipping_information,
                     "grossWeight": round(picking.shipping_weight, 2),
-                    "volume": round(picking.volume, 2) or 0.01,
+                    "volume": shipping_information["volume"],
                 },
                 "measureUnit": self.schenker_measure_unit,
                 # Customs Clearance not supported for now as it needs a full customs
@@ -426,7 +427,7 @@ def _prepare_schenker_shipping(self, picking):
                 "pharmaceuticals": self.schenker_pharmaceuticals,
             }
         )
-        vals.update(self._schenker_measures(picking))
+        vals.update(self._schenker_measures(picking, vals))
         return vals
 
     def schenker_send_shipping(self, pickings):
diff --git a/delivery_schenker/readme/CONTRIBUTORS.rst b/delivery_schenker/readme/CONTRIBUTORS.rst
index 67b7b7e1dc..1b7dedd8fb 100644
--- a/delivery_schenker/readme/CONTRIBUTORS.rst
+++ b/delivery_schenker/readme/CONTRIBUTORS.rst
@@ -5,3 +5,4 @@
 * `Studio73 <https://www.studio73.es>`_:
 
   * Ethan Hildick
+* Michael Tietz (MT Software) <mtietz@mt-software.de>
diff --git a/delivery_schenker/static/description/index.html b/delivery_schenker/static/description/index.html
index 029505c24c..48d0b3ae27 100644
--- a/delivery_schenker/static/description/index.html
+++ b/delivery_schenker/static/description/index.html
@@ -3,7 +3,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils: http://docutils.sourceforge.net/" />
 <title>Delivery Schenker</title>
 <style type="text/css">
 
@@ -367,7 +367,7 @@ <h1 class="title">Delivery Schenker</h1>
 !! This file is generated by oca-gen-addon-readme !!
 !! changes will be overwritten.                   !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_schenker"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_schenker"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/99/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
+<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/delivery-carrier/tree/14.0/delivery_schenker"><img alt="OCA/delivery-carrier" src="https://img.shields.io/badge/github-OCA%2Fdelivery--carrier-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/delivery-carrier-14-0/delivery-carrier-14-0-delivery_schenker"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runboat.odoo-community.org/webui/builds.html?repo=OCA/delivery-carrier&amp;target_branch=14.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
 <p>This module links the <a class="reference external" href="https://www.dbschenker.com">DB Schenker</a> booking and tracking
 APIs with Odoo delivery system.</p>
 <p><strong>Table of contents</strong></p>
@@ -516,6 +516,7 @@ <h2><a class="toc-backref" href="#id13">Contributors</a></h2>
 <li>Ethan Hildick</li>
 </ul>
 </li>
+<li>Michael Tietz (MT Software) &lt;<a class="reference external" href="mailto:mtietz&#64;mt-software.de">mtietz&#64;mt-software.de</a>&gt;</li>
 </ul>
 </div>
 <div class="section" id="maintainers">

From 5264884b77ab48e4fdf6b2678dcd8d867fb574c0 Mon Sep 17 00:00:00 2001
From: ferran-73 <ferran@studio73.es>
Date: Tue, 18 Apr 2023 09:21:43 +0200
Subject: [PATCH 22/23] [IMP] delivery_schenker: black, isort, prettier

---
 delivery_schenker/models/schenker_request.py          | 6 +++---
 requirements.txt                                      | 1 +
 setup/delivery_schenker/odoo/addons/delivery_schenker | 1 +
 setup/delivery_schenker/setup.py                      | 6 ++++++
 4 files changed, 11 insertions(+), 3 deletions(-)
 create mode 120000 setup/delivery_schenker/odoo/addons/delivery_schenker
 create mode 100644 setup/delivery_schenker/setup.py

diff --git a/delivery_schenker/models/schenker_request.py b/delivery_schenker/models/schenker_request.py
index 1cd0af0ea1..71ee0e1228 100644
--- a/delivery_schenker/models/schenker_request.py
+++ b/delivery_schenker/models/schenker_request.py
@@ -74,13 +74,13 @@ def _process_reply(self, service, vals=None, send_as_kw=False):
                             "[%s]\n"
                             "%s - %s" % (error_text, error_code, error_message)
                         )
-                    )
+                    ) from e
                 except ValidationError:
                     raise
                 # If we can't get the proper exception, fallback to the first
                 # exception error traceback
-                except Exception:
-                    raise Fault(e)
+                except Exception as exc:
+                    raise Fault(e) from exc
         return response
 
     # Booking API methods
diff --git a/requirements.txt b/requirements.txt
index 5d6c458666..50b51d36f6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,4 @@
 # generated from manifests external_dependencies
 roulier
 unidecode
+zeep
diff --git a/setup/delivery_schenker/odoo/addons/delivery_schenker b/setup/delivery_schenker/odoo/addons/delivery_schenker
new file mode 120000
index 0000000000..42a153ee9a
--- /dev/null
+++ b/setup/delivery_schenker/odoo/addons/delivery_schenker
@@ -0,0 +1 @@
+../../../../delivery_schenker
\ No newline at end of file
diff --git a/setup/delivery_schenker/setup.py b/setup/delivery_schenker/setup.py
new file mode 100644
index 0000000000..28c57bb640
--- /dev/null
+++ b/setup/delivery_schenker/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+    setup_requires=['setuptools-odoo'],
+    odoo_addon=True,
+)

From 0e0fa7e5521fa4de9c444db650426bca4a886b2e Mon Sep 17 00:00:00 2001
From: ferran-73 <ferran@studio73.es>
Date: Tue, 18 Apr 2023 10:44:24 +0200
Subject: [PATCH 23/23] [16.0][MIG] delivery_schenker

---
 delivery_schenker/README.rst                  |  3 +-
 delivery_schenker/__manifest__.py             |  3 +-
 .../data/delivery_schenker_data.xml           | 46 +++++++++----------
 .../migrations/16.0.1.0.0/post-migration.py   | 23 ++++++++++
 delivery_schenker/models/__init__.py          |  2 +-
 delivery_schenker/models/delivery_carrier.py  | 20 ++++----
 delivery_schenker/models/schenker_request.py  |  9 +++-
 ...uct_packaging.py => stock_package_type.py} |  5 +-
 .../views/delivery_schenker_view.xml          |  2 +-
 .../views/stock_picking_views.xml             |  2 +-
 10 files changed, 73 insertions(+), 42 deletions(-)
 create mode 100644 delivery_schenker/migrations/16.0.1.0.0/post-migration.py
 rename delivery_schenker/models/{product_packaging.py => stock_package_type.py} (75%)

diff --git a/delivery_schenker/README.rst b/delivery_schenker/README.rst
index d846e793d8..796642df21 100644
--- a/delivery_schenker/README.rst
+++ b/delivery_schenker/README.rst
@@ -23,7 +23,7 @@ Delivery Schenker
     :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/delivery-carrier&target_branch=14.0
     :alt: Try me on Runboat
 
-|badge1| |badge2| |badge3| |badge4| |badge5| 
+|badge1| |badge2| |badge3| |badge4| |badge5|
 
 This module links the `DB Schenker <https://www.dbschenker.com>`_ booking and tracking
 APIs with Odoo delivery system.
@@ -156,6 +156,7 @@ Contributors
 * `Studio73 <https://www.studio73.es>`_:
 
   * Ethan Hildick
+  * Ferran Mora
 
 * Michael Tietz (MT Software) <mtietz@mt-software.de>
 
diff --git a/delivery_schenker/__manifest__.py b/delivery_schenker/__manifest__.py
index 8b8377a4ab..6356d862ff 100644
--- a/delivery_schenker/__manifest__.py
+++ b/delivery_schenker/__manifest__.py
@@ -1,10 +1,11 @@
 # Copyright 2021 Tecnativa - David Vidal
 # Copyright 2021 Studio73 - Ethan Hildick <ethan@studio73.es>
+# Copyright 2023 Studio73 - Ferran Mora <ferran@studio73.es>
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 {
     "name": "Delivery Schenker",
     "summary": "Delivery Carrier implementation for DB Schenker API",
-    "version": "14.0.1.0.1",
+    "version": "16.0.1.0.0",
     "category": "Stock",
     "website": "https://github.com/OCA/delivery-carrier",
     "author": "Tecnativa, Studio73, Odoo Community Association (OCA)",
diff --git a/delivery_schenker/data/delivery_schenker_data.xml b/delivery_schenker/data/delivery_schenker_data.xml
index cd9379a5da..0ef7221f72 100644
--- a/delivery_schenker/data/delivery_schenker_data.xml
+++ b/delivery_schenker/data/delivery_schenker_data.xml
@@ -1,117 +1,117 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <odoo noupdate="1">
     <!-- Schenker Product Packagings. It'd be nice to have proper measures -->
-    <record id="schenker_packaging_01" model="product.packaging">
+    <record id="schenker_package_type_01" model="stock.package.type">
         <field name="shipper_package_code">CI</field>
         <field name="name">(Schenker) Canister</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_02" model="product.packaging">
+    <record id="schenker_package_type_02" model="stock.package.type">
         <field name="shipper_package_code">CT</field>
         <field name="name">(Schenker) Carton</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_03" model="product.packaging">
+    <record id="schenker_package_type_03" model="stock.package.type">
         <field name="shipper_package_code">CS</field>
         <field name="name">(Schenker) Case</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_04" model="product.packaging">
+    <record id="schenker_package_type_04" model="stock.package.type">
         <field name="shipper_package_code">CO</field>
         <field name="name">(Schenker) Colli</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_05" model="product.packaging">
+    <record id="schenker_package_type_05" model="stock.package.type">
         <field name="shipper_package_code">CH</field>
         <field name="name">(Schenker) Crate</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_06" model="product.packaging">
+    <record id="schenker_package_type_06" model="stock.package.type">
         <field name="shipper_package_code">GP</field>
         <field name="name">(Schenker) Skeleton box pallet</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_07" model="product.packaging">
+    <record id="schenker_package_type_07" model="stock.package.type">
         <field name="shipper_package_code">NE</field>
         <field name="name">(Schenker) Unpacked Skid</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_08" model="product.packaging">
+    <record id="schenker_package_type_08" model="stock.package.type">
         <field name="shipper_package_code">BG</field>
         <field name="name">(Schenker) Bag</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_09" model="product.packaging">
+    <record id="schenker_package_type_09" model="stock.package.type">
         <field name="shipper_package_code">BL</field>
         <field name="name">(Schenker) Bale</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_10" model="product.packaging">
+    <record id="schenker_package_type_10" model="stock.package.type">
         <field name="shipper_package_code">DR</field>
         <field name="name">(Schenker) Barrel</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_11" model="product.packaging">
+    <record id="schenker_package_type_11" model="stock.package.type">
         <field name="shipper_package_code">BX</field>
         <field name="name">(Schenker) Box</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_12" model="product.packaging">
+    <record id="schenker_package_type_12" model="stock.package.type">
         <field name="shipper_package_code">BY</field>
         <field name="name">(Schenker) Bundle</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_13" model="product.packaging">
+    <record id="schenker_package_type_13" model="stock.package.type">
         <field name="shipper_package_code">TR</field>
         <field name="name">(Schenker) Drum</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_14" model="product.packaging">
+    <record id="schenker_package_type_14" model="stock.package.type">
         <field name="shipper_package_code">EP</field>
         <field name="name">(Schenker) Europallet</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_15" model="product.packaging">
+    <record id="schenker_package_type_15" model="stock.package.type">
         <field name="shipper_package_code">FR</field>
         <field name="name">(Schenker) Frame</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_16" model="product.packaging">
+    <record id="schenker_package_type_16" model="stock.package.type">
         <field name="shipper_package_code">HO</field>
         <field name="name">(Schenker) Hobbock</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_17" model="product.packaging">
+    <record id="schenker_package_type_17" model="stock.package.type">
         <field name="shipper_package_code">OP</field>
         <field name="name">(Schenker) One-way pallet</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_18" model="product.packaging">
+    <record id="schenker_package_type_18" model="stock.package.type">
         <field name="shipper_package_code">PK</field>
         <field name="name">(Schenker) Package</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_19" model="product.packaging">
+    <record id="schenker_package_type_19" model="stock.package.type">
         <field name="shipper_package_code">XP</field>
         <field name="name">(Schenker) Pallet</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_20" model="product.packaging">
+    <record id="schenker_package_type_20" model="stock.package.type">
         <field name="shipper_package_code">PZ</field>
         <field name="name">(Schenker) Pipe</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_21" model="product.packaging">
+    <record id="schenker_package_type_21" model="stock.package.type">
         <field name="shipper_package_code">RO</field>
         <field name="name">(Schenker) Roll</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_22" model="product.packaging">
+    <record id="schenker_package_type_22" model="stock.package.type">
         <field name="shipper_package_code">SK</field>
         <field name="name">(Schenker) Sack</field>
         <field name="package_carrier_type">schenker</field>
     </record>
-    <record id="schenker_packaging_23" model="product.packaging">
+    <record id="schenker_package_type_23" model="stock.package.type">
         <field name="shipper_package_code">ZZ</field>
         <field name="name">(Schenker) Other</field>
         <field name="package_carrier_type">schenker</field>
diff --git a/delivery_schenker/migrations/16.0.1.0.0/post-migration.py b/delivery_schenker/migrations/16.0.1.0.0/post-migration.py
new file mode 100644
index 0000000000..380cd1950d
--- /dev/null
+++ b/delivery_schenker/migrations/16.0.1.0.0/post-migration.py
@@ -0,0 +1,23 @@
+# Copyright 2023 Studio73 - Ferran Mora
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from openupgradelib import openupgrade
+
+
+@openupgrade.migrate()
+def migrate(env, version):
+    for i in range(1, 23):
+        xml_id = "delivery_schenker.schenker_packaging_{}".format(str(i).zfill(2))
+        pack = env.ref(xml_id, raise_if_not_found=False)
+        if pack:
+            xml_id = "delivery_schenker.schenker_package_type_{}".format(
+                str(i).zfill(2)
+            )
+            package_type = env.ref(xml_id, raise_if_not_found=False)
+            if package_type:
+                env.cr.execute(
+                    "SELECT schenker_stackable FROM product_packaging WHERE id=%s",
+                    (pack.id,),
+                )
+                schenker_stackable = env.cr.fetchone()
+                package_type.write({"schenker_stackable": schenker_stackable})
diff --git a/delivery_schenker/models/__init__.py b/delivery_schenker/models/__init__.py
index 494ed4481e..b575f6f0e2 100644
--- a/delivery_schenker/models/__init__.py
+++ b/delivery_schenker/models/__init__.py
@@ -1,4 +1,4 @@
 from . import delivery_carrier
-from . import product_packaging
 from . import schenker_request
+from . import stock_package_type
 from . import stock_picking
diff --git a/delivery_schenker/models/delivery_carrier.py b/delivery_schenker/models/delivery_carrier.py
index 9de0ba5727..b1d9fafad4 100644
--- a/delivery_schenker/models/delivery_carrier.py
+++ b/delivery_schenker/models/delivery_carrier.py
@@ -158,12 +158,12 @@ class DeliveryCarrier(models.Model):
         ],
         default="VOLUME",
     )
-    schenker_default_packaging_id = fields.Many2one(
-        comodel_name="product.packaging",
+    schenker_default_package_type_id = fields.Many2one(
+        comodel_name="stock.package.type",
         string="Default Package Type",
         domain=[("package_carrier_type", "=", "schenker")],
         help="If not delivery package or the package doesn't have defined the packaging"
-        "it will default to this type",
+        " it will default to this type",
     )
 
     def _get_schenker_credentials(self):
@@ -323,12 +323,12 @@ def _schenker_shipping_information_package(self, picking, package):
             # Default to 1 if no volume informed
             "volume": volume or 0.01,
             "packageType": (
-                package.packaging_id.shipper_package_code
-                or self.schenker_default_packaging_id.shipper_package_code
+                package.package_type_id.shipper_package_code
+                or self.schenker_default_package_type_id.shipper_package_code
             ),
             "stackable": (
-                package.packaging_id.schenker_stackable
-                or self.schenker_default_packaging_id.schenker_stackable
+                package.package_type_id.schenker_stackable
+                or self.schenker_default_package_type_id.schenker_stackable
             ),
             "pieces": 1,
         }
@@ -361,8 +361,8 @@ def _schenker_shipping_information(self, picking):
                 # For a more complex solution use packaging properly
                 "grossWeight": round(weight / picking.number_of_packages, 2),
                 "volume": round(volume, 2) or 0.01,
-                "packageType": self.schenker_default_packaging_id.shipper_package_code,
-                "stackable": self.schenker_default_packaging_id.schenker_stackable,
+                "packageType": self.schenker_default_package_type_id.shipper_package_code,
+                "stackable": self.schenker_default_package_type_id.schenker_stackable,
                 "pieces": picking.number_of_packages,
             }
         ]
@@ -404,7 +404,7 @@ def _prepare_schenker_shipping(self, picking):
                 "shippingInformation": {
                     "shipmentPosition": shipping_information,
                     "grossWeight": round(picking.shipping_weight, 2),
-                    "volume": shipping_information["volume"],
+                    "volume": shipping_information[0]["volume"],
                 },
                 "measureUnit": self.schenker_measure_unit,
                 # Customs Clearance not supported for now as it needs a full customs
diff --git a/delivery_schenker/models/schenker_request.py b/delivery_schenker/models/schenker_request.py
index 71ee0e1228..e8be6a59f8 100644
--- a/delivery_schenker/models/schenker_request.py
+++ b/delivery_schenker/models/schenker_request.py
@@ -71,9 +71,14 @@ def _process_reply(self, service, vals=None, send_as_kw=False):
                         _(
                             "Error in the request to the Schenker API. This is the "
                             "thrown message:\n\n"
-                            "[%s]\n"
-                            "%s - %s" % (error_text, error_code, error_message)
+                            "[%(error_text)s]\n"
+                            "%(error_code)s - %(error_message)s"
                         )
+                        % {
+                            "error_text": error_text,
+                            "error_code": error_code,
+                            "error_message": error_message,
+                        }
                     ) from e
                 except ValidationError:
                     raise
diff --git a/delivery_schenker/models/product_packaging.py b/delivery_schenker/models/stock_package_type.py
similarity index 75%
rename from delivery_schenker/models/product_packaging.py
rename to delivery_schenker/models/stock_package_type.py
index a3dc8bfc90..e06e9fc24c 100644
--- a/delivery_schenker/models/product_packaging.py
+++ b/delivery_schenker/models/stock_package_type.py
@@ -1,10 +1,11 @@
 # Copyright 2021 Tecnativa - David Vidal
+# Copyright 2023 Studio73 - Ferran Mora
 # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
 from odoo import fields, models
 
 
-class ProductPackaging(models.Model):
-    _inherit = "product.packaging"
+class StockPackageType(models.Model):
+    _inherit = "stock.package.type"
 
     package_carrier_type = fields.Selection(selection_add=[("schenker", "DB Schenker")])
     schenker_stackable = fields.Boolean(
diff --git a/delivery_schenker/views/delivery_schenker_view.xml b/delivery_schenker/views/delivery_schenker_view.xml
index 5c8113a10f..a51d017f83 100644
--- a/delivery_schenker/views/delivery_schenker_view.xml
+++ b/delivery_schenker/views/delivery_schenker_view.xml
@@ -62,7 +62,7 @@
                         </group>
                         <group string="Logistics">
                             <field
-                                name="schenker_default_packaging_id"
+                                name="schenker_default_package_type_id"
                                 attrs="{'required': [('delivery_type', '=', 'schenker')]}"
                             />
                             <field
diff --git a/delivery_schenker/views/stock_picking_views.xml b/delivery_schenker/views/stock_picking_views.xml
index 324e1b19fd..2bfdacf896 100644
--- a/delivery_schenker/views/stock_picking_views.xml
+++ b/delivery_schenker/views/stock_picking_views.xml
@@ -3,13 +3,13 @@
     <record id="view_picking_withcarrier_out_form" model="ir.ui.view">
         <field name="model">stock.picking</field>
         <field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form" />
-        <field name="groups_id" eval="[(4, ref('base.group_no_one'))]" />
         <field name="arch" type="xml">
             <xpath expr="//header" position='inside'>
                 <button
                     name="schenker_get_label"
                     string="Schenker Label"
                     type="object"
+                    groups="base.group_no_one"
                     attrs="{
                         'invisible':[
                             '|',