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$>s@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 > Configuration > Delivery > 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&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) <<a class="reference external" href="mailto:mtietz@mt-software.de">mtietz@mt-software.de</a>></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':[ '|',