diff --git a/delivery_roulier_option/README.rst b/delivery_roulier_option/README.rst new file mode 100644 index 0000000000..a0ca0a5fc9 --- /dev/null +++ b/delivery_roulier_option/README.rst @@ -0,0 +1,86 @@ +======================= +Delivery Roulier Option +======================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:aa9c19952667ec3e566f24051f7ab7d6c417669ecd2802fb5a98163366086ad5 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/17.0/delivery_roulier_option + :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-17-0/delivery-carrier-17-0-delivery_roulier_option + :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=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Manage options for the delivery method. Like insurance or cash on +delivery + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Akretion + +Contributors +------------ + +- David BEAL +- Raphaël REVERDY + +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-florian-dacosta| image:: https://github.com/florian-dacosta.png?size=40px + :target: https://github.com/florian-dacosta + :alt: florian-dacosta + +Current `maintainer `__: + +|maintainer-florian-dacosta| + +This module is part of the `OCA/delivery-carrier `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/delivery_roulier_option/__init__.py b/delivery_roulier_option/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/delivery_roulier_option/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/delivery_roulier_option/__manifest__.py b/delivery_roulier_option/__manifest__.py new file mode 100644 index 0000000000..c718576d9a --- /dev/null +++ b/delivery_roulier_option/__manifest__.py @@ -0,0 +1,20 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Delivery Roulier Option", + "version": "17.0.1.0.0", + "author": "Akretion,Odoo Community Association (OCA)", + "summary": "Add options to roulier modules", + "maintainers": ["florian-dacosta"], + "category": "Warehouse", + "depends": [ + "delivery_roulier", + "product_harmonized_system", # from OCA/intrastat-extrastat + ], + "website": "https://github.com/OCA/delivery-carrier", + "data": [ + "data/delivery.xml", + ], + "installable": True, + "license": "AGPL-3", +} diff --git a/delivery_roulier_option/data/delivery.xml b/delivery_roulier_option/data/delivery.xml new file mode 100644 index 0000000000..19a58b4526 --- /dev/null +++ b/delivery_roulier_option/data/delivery.xml @@ -0,0 +1,25 @@ + + + + + + Acknowledgment + ACK + + + + Free of charges and rights + FCR + + + + Shipping Cash On Delivery + COD + + + + Insurance + INS + + + diff --git a/delivery_roulier_option/i18n/delivery_roulier_option.pot b/delivery_roulier_option/i18n/delivery_roulier_option.pot new file mode 100644 index 0000000000..84ed514665 --- /dev/null +++ b/delivery_roulier_option/i18n/delivery_roulier_option.pot @@ -0,0 +1,134 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_roulier_option +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.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_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_ACK +msgid "Acknowledgment" +msgstr "" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__commercial +#, python-format +msgid "Commercial Goods" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking__customs_category +msgid "Customs Category" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model,name:delivery_roulier_option.model_delivery_carrier_template_option +msgid "Delivery carrier template option" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option__display_name +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking__display_name +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_quant_package__display_name +msgid "Display Name" +msgstr "" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__document +#, python-format +msgid "Documents" +msgstr "" + +#. module: delivery_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_FCR +msgid "Free of charges and rights" +msgstr "" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__gift +#, python-format +msgid "Gift" +msgstr "" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__return +#, python-format +msgid "Goods return" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option__id +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking__id +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_quant_package__id +msgid "ID" +msgstr "" + +#. module: delivery_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_INS +msgid "Insurance" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option____last_update +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking____last_update +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_quant_package____last_update +msgid "Last Modified on" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_option__name +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option__name +msgid "Name" +msgstr "" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_quant_package.py:0 +#, python-format +msgid "No H.S. Code on product '%s' nor on it's product category '%s'." +msgstr "" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__other +#, python-format +msgid "Other" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model,name:delivery_roulier_option.model_stock_quant_package +msgid "Packages" +msgstr "" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__sample +#, python-format +msgid "Samples" +msgstr "" + +#. module: delivery_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_COD +msgid "Shipping Cash On Delivery" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model,name:delivery_roulier_option.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: delivery_roulier_option +#: model:ir.model.fields,help:delivery_roulier_option.field_stock_picking__customs_category +msgid "Type of sending for the customs" +msgstr "" diff --git a/delivery_roulier_option/i18n/es.po b/delivery_roulier_option/i18n/es.po new file mode 100644 index 0000000000..bcfaf4c041 --- /dev/null +++ b/delivery_roulier_option/i18n/es.po @@ -0,0 +1,138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * delivery_roulier_option +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-12-20 19:35+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: delivery_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_ACK +msgid "Acknowledgment" +msgstr "Acuse de recibo" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__commercial +#, python-format +msgid "Commercial Goods" +msgstr "Productos Comerciales" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking__customs_category +msgid "Customs Category" +msgstr "Categoría Aduanera" + +#. module: delivery_roulier_option +#: model:ir.model,name:delivery_roulier_option.model_delivery_carrier_template_option +msgid "Delivery carrier template option" +msgstr "Opción de plantilla de transportista de entrega" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option__display_name +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking__display_name +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_quant_package__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__document +#, python-format +msgid "Documents" +msgstr "Documentos" + +#. module: delivery_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_FCR +msgid "Free of charges and rights" +msgstr "Libre de cargas y derechos" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__gift +#, python-format +msgid "Gift" +msgstr "Regalo" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__return +#, python-format +msgid "Goods return" +msgstr "Devolución de mercancías" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option__id +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking__id +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_quant_package__id +msgid "ID" +msgstr "ID" + +#. module: delivery_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_INS +msgid "Insurance" +msgstr "Seguro" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option____last_update +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_picking____last_update +#: model:ir.model.fields,field_description:delivery_roulier_option.field_stock_quant_package____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: delivery_roulier_option +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_option__name +#: model:ir.model.fields,field_description:delivery_roulier_option.field_delivery_carrier_template_option__name +msgid "Name" +msgstr "Nombre" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_quant_package.py:0 +#, python-format +msgid "No H.S. Code on product '%s' nor on it's product category '%s'." +msgstr "" +"No hay código H.S. en el producto '%s' ni en su categoría de producto '%s'." + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__other +#, python-format +msgid "Other" +msgstr "Otro" + +#. module: delivery_roulier_option +#: model:ir.model,name:delivery_roulier_option.model_stock_quant_package +msgid "Packages" +msgstr "Paquetes" + +#. module: delivery_roulier_option +#: code:addons/delivery_roulier_option/models/stock_picking.py:0 +#: model:ir.model.fields.selection,name:delivery_roulier_option.selection__stock_picking__customs_category__sample +#, python-format +msgid "Samples" +msgstr "Ejemplos" + +#. module: delivery_roulier_option +#: model:delivery.carrier.template.option,name:delivery_roulier_option.carrier_opt_tmpl_COD +msgid "Shipping Cash On Delivery" +msgstr "Envío Contra Reembolso" + +#. module: delivery_roulier_option +#: model:ir.model,name:delivery_roulier_option.model_stock_picking +msgid "Transfer" +msgstr "Transferencia" + +#. module: delivery_roulier_option +#: model:ir.model.fields,help:delivery_roulier_option.field_stock_picking__customs_category +msgid "Type of sending for the customs" +msgstr "Tipo de envío para la aduana" diff --git a/delivery_roulier_option/models/__init__.py b/delivery_roulier_option/models/__init__.py new file mode 100644 index 0000000000..27b55814f4 --- /dev/null +++ b/delivery_roulier_option/models/__init__.py @@ -0,0 +1,3 @@ +from . import stock_picking +from . import delivery_option +from . import stock_quant_package diff --git a/delivery_roulier_option/models/delivery_option.py b/delivery_roulier_option/models/delivery_option.py new file mode 100644 index 0000000000..72cf05907c --- /dev/null +++ b/delivery_roulier_option/models/delivery_option.py @@ -0,0 +1,10 @@ +# © 2016 David BEAL @ Akretion +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class DeliveryCarrierTemplateOption(models.Model): + _inherit = "delivery.carrier.template.option" + + name = fields.Char(translate=True) diff --git a/delivery_roulier_option/models/stock_picking.py b/delivery_roulier_option/models/stock_picking.py new file mode 100644 index 0000000000..9a924ce4a5 --- /dev/null +++ b/delivery_roulier_option/models/stock_picking.py @@ -0,0 +1,60 @@ +# @author Raphael Reverdy +# David BEAL +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import logging + +from odoo import _, api, fields, models + +from odoo.addons.delivery_roulier import implemented_by_carrier + +_logger = logging.getLogger(__name__) + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + customs_category = fields.Selection( + selection=[ + ("gift", _("Gift")), + ("sample", _("Samples")), + ("commercial", _("Commercial Goods")), + ("document", _("Documents")), + ("other", _("Other")), + ("return", _("Goods return")), + ], + default="commercial", + help="Type of sending for the customs", + ) + + @implemented_by_carrier + def _map_options(self): + pass + + @implemented_by_carrier + def _get_options(self, package): + pass + + @api.model + def _roulier_map_options(self): + """Customize this mapping with your own carrier. + + Like + return { + 'FCR': 'fcr', + 'COD': 'cod', + 'INS': 'ins', + } + """ + return {} + + def _roulier_get_options(self, package): + mapping_options = self._map_options() + options = {} + if self.option_ids: + for opt in self.option_ids: + opt_key = str(opt.tmpl_option_id["code"]) + if opt_key in mapping_options: + options[mapping_options[opt_key]] = True + else: + options[opt_key] = True + return options diff --git a/delivery_roulier_option/models/stock_quant_package.py b/delivery_roulier_option/models/stock_quant_package.py new file mode 100644 index 0000000000..f0bb81e2e0 --- /dev/null +++ b/delivery_roulier_option/models/stock_quant_package.py @@ -0,0 +1,102 @@ +# @author Raphael Reverdy +# David BEAL +# EBII MonsieurB +# Sébastien BEAU +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import _, models +from odoo.exceptions import UserError + +from odoo.addons.delivery_roulier import implemented_by_carrier + + +class StockQuantPackage(models.Model): + _inherit = "stock.quant.package" + + @implemented_by_carrier + def _get_cash_on_delivery(self, picking): + pass + + @implemented_by_carrier + def _get_customs(self, picking): + pass + + @implemented_by_carrier + def _get_sale_price(self, picking): + pass + + @implemented_by_carrier + def _should_include_customs(self, picking): + pass + + def _roulier_get_cash_on_delivery(self, picking): + """for 'cod' option""" + # TODO improve to take account Sale if picking created from sale + amount = 0 + for oper in self.get_operations(): + amount += oper.product_id.list_price * oper.product_qty + return amount + + def _roulier_should_include_customs(self, picking): + """Choose if custom docs should be sent. + + Really dumb implementation. + You may improve this for your carrier. + """ + sender = picking._get_sender(self) + receiver = picking._get_receiver(self) + return sender.country_id.code != receiver.country_id.code + + def _roulier_get_customs(self, picking): + """Format customs infos for each product in the package. + + The decision whether to include these infos or not is + taken in _should_include_customs() + + Returns: + dict.'articles' : list with qty, weight, hs_code + int category: gift 1, sample 2, commercial 3, ... + """ + self.ensure_one() + + articles = [] + for operation in self.get_operations(): + article = {} + articles.append(article) + product = operation.product_id + # stands for harmonized_system + hs = product.get_hs_code_recursively() + if not hs: + raise UserError( + _( + "No H.S. Code on product '%(prod_displ_name)s' nor on it's " + "product category '%(categ_displ_name)s'." + ) + % { + "prod_displ_name": product.display_name, + "categ_displ_name": product.categ_id.display_name, + } + ) + + article["quantity"] = "%.f" % (operation.qty_done or operation.product_qty) + article["weight"] = operation.get_weight() / ( + operation.qty_done or operation.product_qty + ) + article["originCountry"] = product.origin_country_id.code + article["description"] = hs.description or product.name[:60] + article["hsCode"] = hs.hs_code + article["value"] = operation.get_unit_price_for_customs() + + category = picking.customs_category + return { + "articles": articles, + "category": category, + } + + def _roulier_get_sale_price(self, picking): + """helper. Could be use to compute an insurance value or a value + for customs + """ + total = 0.0 + for operation in self.get_operations(): + total += operation.get_unit_price_for_customs() * operation.product_qty + return total diff --git a/delivery_roulier_option/pyproject.toml b/delivery_roulier_option/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/delivery_roulier_option/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/delivery_roulier_option/readme/CONTRIBUTORS.md b/delivery_roulier_option/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..28ce828808 --- /dev/null +++ b/delivery_roulier_option/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- David BEAL \<\> +- Raphaël REVERDY \<\> diff --git a/delivery_roulier_option/readme/DESCRIPTION.md b/delivery_roulier_option/readme/DESCRIPTION.md new file mode 100644 index 0000000000..4260d511e8 --- /dev/null +++ b/delivery_roulier_option/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Manage options for the delivery method. Like insurance or cash on +delivery diff --git a/delivery_roulier_option/static/description/icon.png b/delivery_roulier_option/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/delivery_roulier_option/static/description/icon.png differ diff --git a/delivery_roulier_option/static/description/index.html b/delivery_roulier_option/static/description/index.html new file mode 100644 index 0000000000..6fbec4a075 --- /dev/null +++ b/delivery_roulier_option/static/description/index.html @@ -0,0 +1,427 @@ + + + + + +Delivery Roulier Option + + + +
+

Delivery Roulier Option

+ + +

Beta License: AGPL-3 OCA/delivery-carrier Translate me on Weblate Try me on Runboat

+

Manage options for the delivery method. Like insurance or cash on +delivery

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Akretion
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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

+

Current maintainer:

+

florian-dacosta

+

This module is part of the OCA/delivery-carrier project on GitHub.

+

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

+
+
+
+ +