Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion delivery_roulier/models/stock_quant_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@

_logger = logging.getLogger(__name__)
try:
from roulier import roulier
from roulier.exception import CarrierError, InvalidApiInput

from roulier import roulier
except ImportError:
_logger.debug("Cannot `import roulier`.")

Expand Down
3 changes: 2 additions & 1 deletion delivery_roulier/tests/test_delivery_roulier.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
from unittest.mock import MagicMock, patch

from odoo_test_helper import FakeModelLoader
from roulier import roulier

from odoo.tests.common import SavepointCase

from roulier import roulier

roulier_ret = {
"parcels": [
{
Expand Down
84 changes: 84 additions & 0 deletions delivery_roulier_dhl_express/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
============================
Delivery Carrier DHL Express
============================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:b265053a9e222e1f48fc77481db992870e3d8a768298b1743b6c57b6db6ae08a
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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/14.0/delivery_roulier_dhl_express
: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-14-0/delivery-carrier-14-0-delivery_roulier_dhl_express
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/delivery-carrier&target_branch=14.0
:alt: Try me on Runboat

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

Send and track parcels with DHL Express.

**Table of contents**

.. contents::
:local:

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 to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/delivery-carrier/issues/new?body=module:%20delivery_roulier_dhl_express%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.

Credits
=======

Authors
-------

* Akretion

Contributors
------------

- Florian Mounier florian.mounier@akretion.com

Maintainers
-----------

This module is maintained by the OCA.

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

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

.. |maintainer-paradoxxxzero| image:: https://github.com/paradoxxxzero.png?size=40px
:target: https://github.com/paradoxxxzero
:alt: paradoxxxzero

Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-paradoxxxzero|

This module is part of the `OCA/delivery-carrier <https://github.com/OCA/delivery-carrier/tree/14.0/delivery_roulier_dhl_express>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions delivery_roulier_dhl_express/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
28 changes: 28 additions & 0 deletions delivery_roulier_dhl_express/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2026 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
"name": "Delivery Carrier DHL Express",
"version": "14.0.1.0.0",
"author": "Akretion, Odoo Community Association (OCA)",
"summary": "DHL Express integration through Roulier API",
"category": "Warehouse",
"depends": [
"delivery_roulier_option", # for customs specific roulier code (yeah...)
"stock_quant_package_dimension", # dhl requires package dimensions
"intrastat_base", # for customs declaration
],
"website": "https://github.com/OCA/delivery-carrier",
"data": [
"views/carrier_account_views.xml",
"data/product.product.xml",
"data/delivery_carrier.xml",
],
"maintainers": ["paradoxxxzero"],
"demo": [
"demo/carrier_account.xml",
],
"installable": True,
"license": "AGPL-3",
}
115 changes: 115 additions & 0 deletions delivery_roulier_dhl_express/data/delivery_carrier.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2026 Akretion (http://www.akretion.com).
@author Florian Mounier <florian.mounier@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">

<record id="delivery_carrier_dhl_express_dom" model="delivery.carrier">
<!-- Livraison domestique dans la journée. (Corse & Monaco inclus hors DOM-TOM) -->
<field name="name">DHL Domestic Express France (DOM)</field>
<field name="code">N</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_dot" model="delivery.carrier">
<!-- Livraison avant 12h sans dédouanement en France (Corse & Monaco inclus. hors DOM-TOM) (produit disponible selon la destination) -->
<field name="name">DHL Domestic Express 12:00 France (DOT)</field>
<field name="code">1</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_dol" model="delivery.carrier">
<!-- Livraison avant 10h30 sans dédouanement, en France (Corse & Monaco inclus. hors DOM-TOM) (produit disponible selon la destination) -->
<field name="name">DHL Domestic Express 10:30 France (DOL)</field>
<field name="code">O</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_ecx" model="delivery.carrier">
<!-- Livraison Express au sein de l’Union Européenne. -->
<field name="name">DHL Express Worldwide EU UE hors France (ECX)</field>
<field name="code">U</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_tdt" model="delivery.carrier">
<!-- Livraison avant 12h (produit disponible selon la destination). -->
<field name="name">DHL Express 12:00 DOC Monde hors France (TDT)</field>
<field name="code">T</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_tdl" model="delivery.carrier">
<!-- Livraison avant 10h30 de produits [DOC] Non soumis à dédouanement (produit disponible selon la destination). -->
<field name="name">DHL Express 10:30 DOC Monde hors France (TDL)</field>
<field name="code">L</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_tdk" model="delivery.carrier">
<!-- Livraison avant 9h (produit disponible selon la destination). -->
<field name="name">DHL Express 9:00 DOC Monde hors France (TDK)</field>
<field name="code">K</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_esu" model="delivery.carrier">
<!-- Livraison économique -->
<field
name="name"
>DHL Economy Select (EU) UE hors France, Malte et Chypre (ESU)</field>
<field name="code">W</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_dox" model="delivery.carrier">
<!-- Livraison dans la journée de produits [DOC] Non soumis à dédouanement. -->
<field name="name">DHL Express Worldwide DOC Monde hors UE hors FR (DOX)</field>
<field name="code">D</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_wpx" model="delivery.carrier">
<!-- Livraison dans la journée de marchandise [Non DOC] avec dédouanement. -->
<field
name="name"
>DHL Express Worldwide Non DOC Monde hors UE hors FR (WPX)</field>
<field name="code">P</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_tdy" model="delivery.carrier">
<!-- Livraison avant 12h de marchandise [Non DOC] avec dédouanement (produit disponible selon la destination). -->
<field name="name">DHL Express 12:00 Non DOC Monde hors UE hors FR (TDY)</field>
<field name="code">Y</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_tdm" model="delivery.carrier">
<!-- Livraison avant 10h30 de marchandise [Non DOC] avec dédouanement (produit disponible selon la destination). -->
<field name="name">DHL Express 10:30 Non DOC Monde hors UE hors FR (TDM)</field>
<field name="code">M</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_tde" model="delivery.carrier">
<!-- Livraison avant 9h de marchandise [Non DOC] avec dédouanement (produit disponible selon la destination). -->
<field name="name">DHL Express 9:00 Non DOC Monde hors UE hors FR (TDE)</field>
<field name="code">E</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>
<record id="delivery_carrier_dhl_express_esi" model="delivery.carrier">
<!-- Livraison économique -->
<field
name="name"
>DHL Economy Select (Non DOC) Uniquement Norvège, Suisse et Royaume-Uni (ESI)</field>
<field name="code">H</field>
<field name="product_id" ref="dhl_express_product" />
<field name="delivery_type">dhl_express</field>
</record>


</odoo>
13 changes: 13 additions & 0 deletions delivery_roulier_dhl_express/data/product.product.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2026 Akretion (http://www.akretion.com).
@author Florian Mounier <florian.mounier@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="dhl_express_product" model="product.product">
<field name="default_code">SHIP_DHL_EXPRESS</field>
<field name="type">service</field>
<field name="name">Coûts de livraison - DHL Express</field>
</record>
</odoo>
14 changes: 14 additions & 0 deletions delivery_roulier_dhl_express/demo/carrier_account.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2026 Akretion (http://www.akretion.com).
@author Florian Mounier <florian.mounier@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="demo_carrier_account_dhl_express" model="carrier.account">
<field name="name">DHL Express default</field>
<field name="account">Demo Account</field>
<field name="password">Demo password</field>
<field name="delivery_type">dhl_express</field>
</record>
</odoo>
4 changes: 4 additions & 0 deletions delivery_roulier_dhl_express/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from . import stock_picking
from . import delivery_carrier
from . import stock_quant_package
from . import carrier_account
22 changes: 22 additions & 0 deletions delivery_roulier_dhl_express/models/carrier_account.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2026 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).


from odoo import fields, models


class CarrierAccount(models.Model):
_inherit = "carrier.account"

dhl_express_account_number = fields.Char()
dhl_express_file_format = fields.Selection(
selection=[
("PDF", "PDF"),
("ZPL", "ZPL"),
("DPL", "LP2"),
("EPL", "EPL"),
],
string="DHL Express File Format",
help="Default format of the carrier's label you want to print",
)
14 changes: 14 additions & 0 deletions delivery_roulier_dhl_express/models/delivery_carrier.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Copyright 2026 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import fields, models


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

delivery_type = fields.Selection(
selection_add=[("dhl_express", "DHL Express")],
ondelete={"dhl_express": "set default"},
)
37 changes: 37 additions & 0 deletions delivery_roulier_dhl_express/models/stock_picking.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Copyright 2026 Akretion (http://www.akretion.com).
# @author Florian Mounier <florian.mounier@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import api, models


class StockPicking(models.Model):
_inherit = "stock.picking"

def _dhl_express_get_service(self, account, package=None):
service = self._roulier_get_service(account, package=package)
service.update(
{
"product": self.carrier_code,
"customerId": account.dhl_express_account_number,
"shipment_description": f"Shipment {self.name} from "
f"{self.partner_id.name} from Odoo",
"reference1": self.partner_id.name[:35]
if self.partner_id.name
else "/",
}
)
return service

@api.model
def _dhl_express_convert_address(self, partner):
address = self._roulier_convert_address(partner) or {}
# Use get_split_adress from partner_helper module
# to split the address on 3 lines
streets = partner._get_split_address(3, 45)
(
address["street1"],
address["street2"],
address["street3"],
) = streets
return address
Loading
Loading