diff --git a/partner_delivery_zone/README.rst b/partner_delivery_zone/README.rst new file mode 100644 index 0000000000..203fc61222 --- /dev/null +++ b/partner_delivery_zone/README.rst @@ -0,0 +1,124 @@ +===================== +Partner Delivery Zone +===================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d11ebabf8d20f7a341daee3cb217c295aa865c9f8cced1e4f51573665f9ab094 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/18.0/partner_delivery_zone + :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-18-0/delivery-carrier-18-0-partner_delivery_zone + :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=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to allocate delivery zones to customers. Information +is shown on sale orders and stock pickings. It also allows to group and +search by delivery zone in partners, sale orders and stock pickings +views. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +1. Go to **Contacts > Configuration > Delivery Zones** and create the + required codes. + +Usage +===== + +To use this module you need to: + +1. Go to Sales > Orders > Customers. +2. Choose a customer. +3. Click on 'Edit' button. +4. Go to Sales & Purchase tab. +5. In 'Delivery Zone' field select an option for this partner. +6. Click on 'Save' button to apply changes. +7. Go to Sales > Orders > Quotations. +8. Create a quotation. 'Delivery zone' field is automatically filled. + Confirm quotation. +9. Open picking or 'Delivery' info (top right). In 'Additional Info' tab + you can see a 'Delivery Zone' choice has been added. + +Known issues / Roadmap +====================== + +- In future versions, the system will be capable of setting delivery + zones based on partner's zip or postal codes. + +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 +------- + +* Tecnativa +* Pesol + +Contributors +------------ + +- `Tecnativa `__ + + - Sergio Teruel + - César A. Sánchez + - Luis Daniel Lafaurie + +- `Pesol `__ + + - Angel Moya Pardo + - Antonio J Rubio Lorente + +- `Heliconia Solutions Pvt. Ltd. `__ + + - Bhavesh Heliconia + +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 `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/partner_delivery_zone/__init__.py b/partner_delivery_zone/__init__.py new file mode 100644 index 0000000000..3275ac2adf --- /dev/null +++ b/partner_delivery_zone/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models diff --git a/partner_delivery_zone/__manifest__.py b/partner_delivery_zone/__manifest__.py new file mode 100644 index 0000000000..8792217d12 --- /dev/null +++ b/partner_delivery_zone/__manifest__.py @@ -0,0 +1,25 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Partner Delivery Zone", + "summary": "This module allows to create partner " + "delivery zones for physical products", + "version": "18.0.1.0.0", + "development_status": "Beta", + "category": "Delivery", + "website": "https://github.com/OCA/delivery-carrier", + "author": "Tecnativa, Pesol, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["sale_stock", "contacts"], + "data": [ + "security/ir.model.access.csv", + "views/partner_delivery_zone_view.xml", + "views/res_partner_view.xml", + "views/sale_order_view.xml", + "views/stock_picking_view.xml", + "views/report_deliveryslip.xml", + "views/report_shipping.xml", + ], +} diff --git a/partner_delivery_zone/i18n/de.po b/partner_delivery_zone/i18n/de.po new file mode 100644 index 0000000000..6a8c261e9f --- /dev/null +++ b/partner_delivery_zone/i18n/de.po @@ -0,0 +1,125 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_delivery_zone +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2019-10-11 10:36+0000\n" +"Last-Translator: Maria Sparenberg \n" +"Language-Team: none\n" +"Language: de\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 3.8\n" + +#. module: partner_delivery_zone +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_delivery_document +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_picking +msgid "Zone" +msgstr "Zone" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__active +msgid "Active" +msgstr "" + +#. module: partner_delivery_zone +#: model_terms:ir.actions.act_window,help:partner_delivery_zone.partner_delivery_zone_action +msgid "Click to set a new delivery zone for partners." +msgstr "" +"Bitte hier klicken, um eine neue Auslieferungszone für Partner zu erstellen." + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__code +msgid "Code" +msgstr "Schlüssel" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_partner__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_users__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_sale_order__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_move__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_picking__delivery_zone_id +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_form +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_picking_internal_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_res_partner_filter +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_sales_order_filter +msgid "Delivery Zone" +msgstr "Auslieferungszone" + +#. module: partner_delivery_zone +#: model:ir.actions.act_window,name:partner_delivery_zone.partner_delivery_zone_action +#: model:ir.ui.menu,name:partner_delivery_zone.partner_delivery_zone_menu +msgid "Delivery Zones" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__id +msgid "ID" +msgstr "ID" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone____last_update +msgid "Last Modified on" +msgstr "Zuletzt geändert am" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_uid +msgid "Last Updated by" +msgstr "Zuletzt aktualisiert von" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_date +msgid "Last Updated on" +msgstr "Zuletzt aktualisiert am" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_partner_delivery_zone +msgid "Partner delivery zone" +msgstr "Auslieferungszone des Partners" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_sale_order +#, fuzzy +msgid "Sales Order" +msgstr "Verkaufsauftrag" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_move +msgid "Stock Move" +msgstr "Lagerbewegung" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__name +msgid "Zone" +msgstr "Zone" diff --git a/partner_delivery_zone/i18n/es.po b/partner_delivery_zone/i18n/es.po new file mode 100644 index 0000000000..0acc42b07c --- /dev/null +++ b/partner_delivery_zone/i18n/es.po @@ -0,0 +1,131 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_delivery_zone +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-10-18 07:44+0000\n" +"PO-Revision-Date: 2023-10-09 18:14+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: partner_delivery_zone +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_delivery_document +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_picking +msgid "Zone" +msgstr "Zona" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__active +msgid "Active" +msgstr "Activo" + +#. module: partner_delivery_zone +#: model_terms:ir.actions.act_window,help:partner_delivery_zone.partner_delivery_zone_action +msgid "Click to set a new delivery zone for partners." +msgstr "Pincha aquí para crear nuevas zonas de entrega." + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__code +msgid "Code" +msgstr "Código" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_res_partner +msgid "Contact" +msgstr "Contacto" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_partner__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_users__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_sale_order__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_move__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_picking__delivery_zone_id +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_form +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_picking_internal_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_res_partner_filter +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_sales_order_filter +msgid "Delivery Zone" +msgstr "Zona de entrega" + +#. module: partner_delivery_zone +#: model:ir.actions.act_window,name:partner_delivery_zone.partner_delivery_zone_action +#: model:ir.ui.menu,name:partner_delivery_zone.partner_delivery_zone_menu +msgid "Delivery Zones" +msgstr "Zonas de entrega" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_uid +msgid "Last Updated by" +msgstr "Última modificación por" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_partner_delivery_zone +msgid "Partner delivery zone" +msgstr "Zona de entrega de socios" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_sale_order +msgid "Sales Order" +msgstr "Orden de Venta" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_move +msgid "Stock Move" +msgstr "Movimiento de existencias" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_picking +msgid "Transfer" +msgstr "Transferir" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__name +msgid "Zone" +msgstr "Zona" + +#~ msgid "Quotation" +#~ msgstr "Presupuesto" + +#, fuzzy +#~ msgid "Delivery Schedule" +#~ msgstr "Horario" diff --git a/partner_delivery_zone/i18n/fr_FR.po b/partner_delivery_zone/i18n/fr_FR.po new file mode 100644 index 0000000000..0146631bad --- /dev/null +++ b/partner_delivery_zone/i18n/fr_FR.po @@ -0,0 +1,123 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_delivery_zone +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-03-19 13:46+0000\n" +"Last-Translator: Sandrine (ACSONE) \n" +"Language-Team: none\n" +"Language: fr_FR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: partner_delivery_zone +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_delivery_document +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_picking +msgid "Zone" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__active +msgid "Active" +msgstr "" + +#. module: partner_delivery_zone +#: model_terms:ir.actions.act_window,help:partner_delivery_zone.partner_delivery_zone_action +msgid "Click to set a new delivery zone for partners." +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__code +msgid "Code" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_res_partner +msgid "Contact" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_uid +msgid "Created by" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_date +msgid "Created on" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_partner__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_users__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_sale_order__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_move__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_picking__delivery_zone_id +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_form +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_picking_internal_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_res_partner_filter +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_sales_order_filter +msgid "Delivery Zone" +msgstr "Zone de livraison" + +#. module: partner_delivery_zone +#: model:ir.actions.act_window,name:partner_delivery_zone.partner_delivery_zone_action +#: model:ir.ui.menu,name:partner_delivery_zone.partner_delivery_zone_menu +msgid "Delivery Zones" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__display_name +msgid "Display Name" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__id +msgid "ID" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone____last_update +msgid "Last Modified on" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_date +msgid "Last Updated on" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_partner_delivery_zone +msgid "Partner delivery zone" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__name +msgid "Zone" +msgstr "" diff --git a/partner_delivery_zone/i18n/it.po b/partner_delivery_zone/i18n/it.po new file mode 100644 index 0000000000..3a8cd4410d --- /dev/null +++ b/partner_delivery_zone/i18n/it.po @@ -0,0 +1,123 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_delivery_zone +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-05-07 12:35+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\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: partner_delivery_zone +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_delivery_document +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_picking +msgid "Zone" +msgstr "Zona" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__active +msgid "Active" +msgstr "Attivo" + +#. module: partner_delivery_zone +#: model_terms:ir.actions.act_window,help:partner_delivery_zone.partner_delivery_zone_action +msgid "Click to set a new delivery zone for partners." +msgstr "Clicca per impostare una nuova zona di consegna per i contatti." + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__code +msgid "Code" +msgstr "Codice" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_partner__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_users__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_sale_order__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_move__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_picking__delivery_zone_id +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_form +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_picking_internal_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_res_partner_filter +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_sales_order_filter +msgid "Delivery Zone" +msgstr "Zona di consegna" + +#. module: partner_delivery_zone +#: model:ir.actions.act_window,name:partner_delivery_zone.partner_delivery_zone_action +#: model:ir.ui.menu,name:partner_delivery_zone.partner_delivery_zone_menu +msgid "Delivery Zones" +msgstr "Zona consegna" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__id +msgid "ID" +msgstr "ID" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_partner_delivery_zone +msgid "Partner delivery zone" +msgstr "Zona di consegna del contatto" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_sale_order +msgid "Sales Order" +msgstr "Ordine di vendita" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_move +msgid "Stock Move" +msgstr "Movimento di magazzino" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__name +msgid "Zone" +msgstr "Zona" diff --git a/partner_delivery_zone/i18n/partner_delivery_zone.pot b/partner_delivery_zone/i18n/partner_delivery_zone.pot new file mode 100644 index 0000000000..b4d90c67cc --- /dev/null +++ b/partner_delivery_zone/i18n/partner_delivery_zone.pot @@ -0,0 +1,120 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_delivery_zone +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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: partner_delivery_zone +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_delivery_document +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_picking +msgid "Zone" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__active +msgid "Active" +msgstr "" + +#. module: partner_delivery_zone +#: model_terms:ir.actions.act_window,help:partner_delivery_zone.partner_delivery_zone_action +msgid "Click to set a new delivery zone for partners." +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__code +msgid "Code" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_res_partner +msgid "Contact" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_uid +msgid "Created by" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_date +msgid "Created on" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_partner__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_users__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_sale_order__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_move__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_picking__delivery_zone_id +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_form +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_picking_internal_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_res_partner_filter +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_sales_order_filter +msgid "Delivery Zone" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.actions.act_window,name:partner_delivery_zone.partner_delivery_zone_action +#: model:ir.ui.menu,name:partner_delivery_zone.partner_delivery_zone_menu +msgid "Delivery Zones" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__display_name +msgid "Display Name" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__id +msgid "ID" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone____last_update +msgid "Last Modified on" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_date +msgid "Last Updated on" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_partner_delivery_zone +msgid "Partner delivery zone" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__name +msgid "Zone" +msgstr "" diff --git a/partner_delivery_zone/i18n/zh_CN.po b/partner_delivery_zone/i18n/zh_CN.po new file mode 100644 index 0000000000..fb9301c26d --- /dev/null +++ b/partner_delivery_zone/i18n/zh_CN.po @@ -0,0 +1,123 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_delivery_zone +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-03-21 13:13+0000\n" +"Last-Translator: Dong \n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.10\n" + +#. module: partner_delivery_zone +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_delivery_document +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.report_picking +msgid "Zone" +msgstr "卸货区域" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__active +msgid "Active" +msgstr "" + +#. module: partner_delivery_zone +#: model_terms:ir.actions.act_window,help:partner_delivery_zone.partner_delivery_zone_action +msgid "Click to set a new delivery zone for partners." +msgstr "单击此处为业务伙伴设置一个新的卸货区域。" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__code +msgid "Code" +msgstr "代码" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_res_partner +msgid "Contact" +msgstr "联系人" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_uid +msgid "Created by" +msgstr "创建人" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__create_date +msgid "Created on" +msgstr "创建时间" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_partner__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_res_users__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_sale_order__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_move__delivery_zone_id +#: model:ir.model.fields,field_description:partner_delivery_zone.field_stock_picking__delivery_zone_id +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_form +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_partner_delivery_zone_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_picking_internal_search +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_res_partner_filter +#: model_terms:ir.ui.view,arch_db:partner_delivery_zone.view_sales_order_filter +msgid "Delivery Zone" +msgstr "卸货区域" + +#. module: partner_delivery_zone +#: model:ir.actions.act_window,name:partner_delivery_zone.partner_delivery_zone_action +#: model:ir.ui.menu,name:partner_delivery_zone.partner_delivery_zone_menu +msgid "Delivery Zones" +msgstr "" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__display_name +msgid "Display Name" +msgstr "显示名称" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__id +msgid "ID" +msgstr "ID" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone____last_update +msgid "Last Modified on" +msgstr "最近修改时间" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_uid +msgid "Last Updated by" +msgstr "最近更新人" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__write_date +msgid "Last Updated on" +msgstr "最近更新时间" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_partner_delivery_zone +msgid "Partner delivery zone" +msgstr "业务伙伴卸货区域" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_sale_order +msgid "Sales Order" +msgstr "销售订单" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_move +msgid "Stock Move" +msgstr "库存移动" + +#. module: partner_delivery_zone +#: model:ir.model,name:partner_delivery_zone.model_stock_picking +msgid "Transfer" +msgstr "调拨" + +#. module: partner_delivery_zone +#: model:ir.model.fields,field_description:partner_delivery_zone.field_partner_delivery_zone__name +msgid "Zone" +msgstr "卸货区域" diff --git a/partner_delivery_zone/models/__init__.py b/partner_delivery_zone/models/__init__.py new file mode 100644 index 0000000000..c4f9f2fac8 --- /dev/null +++ b/partner_delivery_zone/models/__init__.py @@ -0,0 +1,6 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import partner_delivery_zone +from . import res_partner +from . import sale_order +from . import stock_move +from . import stock_picking diff --git a/partner_delivery_zone/models/partner_delivery_zone.py b/partner_delivery_zone/models/partner_delivery_zone.py new file mode 100644 index 0000000000..3a3b0b9c0a --- /dev/null +++ b/partner_delivery_zone/models/partner_delivery_zone.py @@ -0,0 +1,12 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class PartnerDeliveryZone(models.Model): + _name = "partner.delivery.zone" + _description = "Partner delivery zone" + + code = fields.Char() + name = fields.Char(string="Zone", required=True) + active = fields.Boolean(default=True) diff --git a/partner_delivery_zone/models/res_partner.py b/partner_delivery_zone/models/res_partner.py new file mode 100644 index 0000000000..9318563d08 --- /dev/null +++ b/partner_delivery_zone/models/res_partner.py @@ -0,0 +1,34 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from lxml import etree + +from odoo import api, fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + delivery_zone_id = fields.Many2one( + comodel_name="partner.delivery.zone", + string="Delivery Zone", + ondelete="restrict", + index=True, + ) + + @api.model + def get_view(self, view_id=None, view_type="form", **options): + """The purpose of this is to write a context on "child_ids" field + respecting other contexts on this field. + """ + res = super().get_view(view_id, view_type, **options) + if view_type == "form": + partner_xml = etree.XML(res["arch"]) + partner_fields = partner_xml.xpath("//field[@name='child_ids']") + if partner_fields: + partner_field = partner_fields[0] + context = partner_field.attrib.get("context", "{}").replace( + "{", "{'default_delivery_zone_id': delivery_zone_id, ", 1 + ) + partner_field.attrib["context"] = context + res["arch"] = etree.tostring(partner_xml) + return res diff --git a/partner_delivery_zone/models/sale_order.py b/partner_delivery_zone/models/sale_order.py new file mode 100644 index 0000000000..10a794aafc --- /dev/null +++ b/partner_delivery_zone/models/sale_order.py @@ -0,0 +1,39 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class SaleOrder(models.Model): + _inherit = "sale.order" + + delivery_zone_id = fields.Many2one( + comodel_name="partner.delivery.zone", + string="Delivery Zone", + ondelete="restrict", + compute="_compute_delivery_zone_id", + store=True, + readonly=False, + index=True, + ) + + @api.depends("partner_shipping_id") + def _compute_delivery_zone_id(self): + for so in self: + partner = ( + so.partner_shipping_id + if so.partner_shipping_id.type == "delivery" + else so.partner_shipping_id.commercial_partner_id + ) + so.delivery_zone_id = partner.delivery_zone_id + + def write(self, vals): + # Update picking delivery zone if user update it in sale order that + # creates a picking, + res = super().write(vals) + if "delivery_zone_id" in vals and not self.env.context.get( + "skip_delivery_zone_update", False + ): + self.mapped("picking_ids").with_context( + skip_delivery_zone_update=True + ).write({"delivery_zone_id": vals["delivery_zone_id"]}) + return res diff --git a/partner_delivery_zone/models/stock_move.py b/partner_delivery_zone/models/stock_move.py new file mode 100644 index 0000000000..e68ce2ef31 --- /dev/null +++ b/partner_delivery_zone/models/stock_move.py @@ -0,0 +1,29 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class StockMove(models.Model): + _inherit = "stock.move" + + delivery_zone_id = fields.Many2one( + comodel_name="partner.delivery.zone", related="picking_id.delivery_zone_id" + ) + + def get_original_move(self): + if self.move_dest_ids: + return self.move_dest_ids.get_original_move() + return self + + def _get_new_picking_values(self): + vals = super()._get_new_picking_values() + original_move = self.get_original_move() + zone_id = original_move.sale_line_id.order_id.delivery_zone_id.id + if not zone_id: + zone_id = ( + self.env["res.partner"] + .browse(vals.get("partner_id", False)) + .delivery_zone_id.id + ) + vals["delivery_zone_id"] = zone_id + return vals diff --git a/partner_delivery_zone/models/stock_picking.py b/partner_delivery_zone/models/stock_picking.py new file mode 100644 index 0000000000..060a520d6f --- /dev/null +++ b/partner_delivery_zone/models/stock_picking.py @@ -0,0 +1,38 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + delivery_zone_id = fields.Many2one( + comodel_name="partner.delivery.zone", + string="Delivery Zone", + index=True, + store=True, + readonly=False, + compute="_compute_delivery_zone_id", + ) + + @api.depends("partner_id") + def _compute_delivery_zone_id(self): + for picking in self: + partner = ( + picking.partner_id + if picking.partner_id.type == "delivery" + else picking.partner_id.commercial_partner_id + ) + picking.delivery_zone_id = partner.delivery_zone_id + + def write(self, vals): + # Update sale order delivery zone if user update it a picking linked + # to a sale order, + res = super().write(vals) + if "delivery_zone_id" in vals and not self.env.context.get( + "skip_delivery_zone_update", False + ): + self.mapped("sale_id").with_context(skip_delivery_zone_update=True).write( + {"delivery_zone_id": vals["delivery_zone_id"]} + ) + return res diff --git a/partner_delivery_zone/pyproject.toml b/partner_delivery_zone/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/partner_delivery_zone/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/partner_delivery_zone/readme/CONFIGURATION.rst b/partner_delivery_zone/readme/CONFIGURATION.rst new file mode 100644 index 0000000000..3c7378cc6e --- /dev/null +++ b/partner_delivery_zone/readme/CONFIGURATION.rst @@ -0,0 +1,3 @@ +To configure this module, you need to: + +#. Go to **Contacts > Configuration > Delivery Zones** and create required codes diff --git a/partner_delivery_zone/readme/CONFIGURE.md b/partner_delivery_zone/readme/CONFIGURE.md new file mode 100644 index 0000000000..b6fabb3c5e --- /dev/null +++ b/partner_delivery_zone/readme/CONFIGURE.md @@ -0,0 +1,4 @@ +To configure this module, you need to: + +1. Go to **Contacts \> Configuration \> Delivery Zones** and create the + required codes. diff --git a/partner_delivery_zone/readme/CONTRIBUTORS.md b/partner_delivery_zone/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..aae4183304 --- /dev/null +++ b/partner_delivery_zone/readme/CONTRIBUTORS.md @@ -0,0 +1,9 @@ +- [Tecnativa](https://www.tecnativa.com) + - Sergio Teruel + - César A. Sánchez + - Luis Daniel Lafaurie +- [Pesol](https://www.pesol.es) + - Angel Moya Pardo \<\> + - Antonio J Rubio Lorente \<\> +- [Heliconia Solutions Pvt. Ltd.](https://www.heliconia.io) + - Bhavesh Heliconia diff --git a/partner_delivery_zone/readme/DESCRIPTION.md b/partner_delivery_zone/readme/DESCRIPTION.md new file mode 100644 index 0000000000..fd5322f2e6 --- /dev/null +++ b/partner_delivery_zone/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +This module allows to allocate delivery zones to customers. Information +is shown on sale orders and stock pickings. It also allows to group and +search by delivery zone in partners, sale orders and stock pickings +views. diff --git a/partner_delivery_zone/readme/ROADMAP.md b/partner_delivery_zone/readme/ROADMAP.md new file mode 100644 index 0000000000..f17712f2c1 --- /dev/null +++ b/partner_delivery_zone/readme/ROADMAP.md @@ -0,0 +1,2 @@ +- In future versions, the system will be capable of setting delivery + zones based on partner's zip or postal codes. diff --git a/partner_delivery_zone/readme/USAGE.md b/partner_delivery_zone/readme/USAGE.md new file mode 100644 index 0000000000..491376d5d7 --- /dev/null +++ b/partner_delivery_zone/readme/USAGE.md @@ -0,0 +1,13 @@ +To use this module you need to: + +1. Go to Sales \> Orders \> Customers. +2. Choose a customer. +3. Click on 'Edit' button. +4. Go to Sales & Purchase tab. +5. In 'Delivery Zone' field select an option for this partner. +6. Click on 'Save' button to apply changes. +7. Go to Sales \> Orders \> Quotations. +8. Create a quotation. 'Delivery zone' field is automatically filled. + Confirm quotation. +9. Open picking or 'Delivery' info (top right). In 'Additional Info' + tab you can see a 'Delivery Zone' choice has been added. diff --git a/partner_delivery_zone/security/ir.model.access.csv b/partner_delivery_zone/security/ir.model.access.csv new file mode 100644 index 0000000000..b68f7173eb --- /dev/null +++ b/partner_delivery_zone/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_partner_delivery_zone_user,access_partner_delivery_zone_user,model_partner_delivery_zone,base.group_user,1,0,0,0 +access_partner_delivery_zone_manager,access_partner_delivery_zone_manager,model_partner_delivery_zone,sales_team.group_sale_manager,1,1,1,1 +access_partner_delivery_zone_portal,partner.delivery.zone.portal,model_partner_delivery_zone,base.group_portal,1,0,0,0 diff --git a/partner_delivery_zone/static/description/icon.png b/partner_delivery_zone/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/partner_delivery_zone/static/description/icon.png differ diff --git a/partner_delivery_zone/static/description/index.html b/partner_delivery_zone/static/description/index.html new file mode 100644 index 0000000000..e12141431f --- /dev/null +++ b/partner_delivery_zone/static/description/index.html @@ -0,0 +1,476 @@ + + + + + +Partner Delivery Zone + + + +
+

Partner Delivery Zone

+ + +

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

+

This module allows to allocate delivery zones to customers. Information +is shown on sale orders and stock pickings. It also allows to group and +search by delivery zone in partners, sale orders and stock pickings +views.

+

Table of contents

+ +
+

Configuration

+

To configure this module, you need to:

+
    +
  1. Go to Contacts > Configuration > Delivery Zones and create the +required codes.
  2. +
+
+
+

Usage

+

To use this module you need to:

+
    +
  1. Go to Sales > Orders > Customers.
  2. +
  3. Choose a customer.
  4. +
  5. Click on ‘Edit’ button.
  6. +
  7. Go to Sales & Purchase tab.
  8. +
  9. In ‘Delivery Zone’ field select an option for this partner.
  10. +
  11. Click on ‘Save’ button to apply changes.
  12. +
  13. Go to Sales > Orders > Quotations.
  14. +
  15. Create a quotation. ‘Delivery zone’ field is automatically filled. +Confirm quotation.
  16. +
  17. Open picking or ‘Delivery’ info (top right). In ‘Additional Info’ tab +you can see a ‘Delivery Zone’ choice has been added.
  18. +
+
+
+

Known issues / Roadmap

+
    +
  • In future versions, the system will be capable of setting delivery +zones based on partner’s zip or postal codes.
  • +
+
+
+

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

+
    +
  • Tecnativa
  • +
  • Pesol
  • +
+
+
+

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.

+

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/partner_delivery_zone/tests/__init__.py b/partner_delivery_zone/tests/__init__.py new file mode 100644 index 0000000000..e182ca7d6a --- /dev/null +++ b/partner_delivery_zone/tests/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import test_partner_delivery_zone diff --git a/partner_delivery_zone/tests/test_partner_delivery_zone.py b/partner_delivery_zone/tests/test_partner_delivery_zone.py new file mode 100644 index 0000000000..2ce68eebe2 --- /dev/null +++ b/partner_delivery_zone/tests/test_partner_delivery_zone.py @@ -0,0 +1,171 @@ +# Copyright 2018 Tecnativa - Sergio Teruel +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from lxml import etree + +from odoo import Command +from odoo.tests import tagged + +from odoo.addons.base.tests.common import BaseCommon + + +@tagged("post_install", "-at_install") +class TestPartnerDeliveryZone(BaseCommon): + at_install = False + post_install = True + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.warehouse = cls.env.ref("stock.warehouse0") + cls.delivery_zone_a = cls.env["partner.delivery.zone"].create( + {"name": "Delivery Zone A", "code": "10"} + ) + cls.delivery_zone_b = cls.env["partner.delivery.zone"].create( + {"name": "Delivery Zone A", "code": "10"} + ) + cls.partner = cls.env["res.partner"].create( + {"name": "test", "delivery_zone_id": cls.delivery_zone_a.id} + ) + cls.product = cls.env["product.product"].create({"name": "test"}) + so = cls.env["sale.order"].new( + { + "partner_id": cls.partner.id, + "order_line": [ + Command.create( + { + "name": cls.product.name, + "product_id": cls.product.id, + "product_uom_qty": 10.0, + "product_uom": cls.product.uom_id.id, + "price_unit": 1000.00, + } + ) + ], + } + ) + cls.order = cls.env["sale.order"].create(so._convert_to_write(so._cache)) + cls.View = cls.env["ir.ui.view"] + + def test_partner_child_propagate(self): + other_partner = self.env["res.partner"].create( + {"name": "other partner", "delivery_zone_id": self.delivery_zone_b.id} + ) + self.order.partner_shipping_id = other_partner + self.assertEqual(self.order.delivery_zone_id, other_partner.delivery_zone_id) + + def test_sale_order_confirm(self): + self.order.action_confirm() + self.assertEqual( + self.order.picking_ids.delivery_zone_id, self.partner.delivery_zone_id + ) + + def test_stock_picking(self): + partner2 = self.env["res.partner"].create( + {"name": "partner 2", "delivery_zone_id": self.delivery_zone_b.id} + ) + self.order.action_confirm() + self.order.picking_ids.partner_id = partner2 + self.assertEqual(self.order.picking_ids.delivery_zone_id, self.delivery_zone_b) + + def _get_ctx_from_view(self, res): + partner_xml = etree.XML(res["arch"]) + partner_path = "//field[@name='child_ids']" + partner_field = partner_xml.xpath(partner_path)[0] + return partner_field.attrib.get("context", "{}") + + def test_default_line_discount_value(self): + res = self.partner.get_view( + view_id=self.env.ref("partner_delivery_zone.view_partner_form").id, + view_type="form", + ) + ctx = self._get_ctx_from_view(res) + self.assertTrue("default_delivery_zone_id" in ctx) + view = self.View.create( + { + "name": "test", + "type": "form", + "model": "res.partner", + "arch": """ +
+ + +
+ """, + } + ) + res = self.partner.get_view(view_id=view.id, view_type="form") + ctx = self._get_ctx_from_view(res) + self.assertTrue("default_delivery_zone_id" in ctx) + + def test_order_assign_commercial_partner_delivery_zone(self): + # For contact type partners the delivery zone get from commercial + # partner + self.child_partner_contact = self.env["res.partner"].create( + {"name": "Partner contact", "type": "contact", "parent_id": self.partner.id} + ) + self.child_partner_delivery = self.env["res.partner"].create( + { + "name": "Partner delivery", + "type": "delivery", + "parent_id": self.partner.id, + } + ) + + self.order.partner_shipping_id = self.child_partner_contact + self.assertEqual(self.order.delivery_zone_id, self.partner.delivery_zone_id) + + self.order.partner_shipping_id = self.child_partner_delivery + self.assertFalse(self.order.delivery_zone_id) + + def test_picking_assign_commercial_partner_contact_zone(self): + # For contact type partners the delivery zone get from commercial + # partner + self.child_partner_contact = self.env["res.partner"].create( + {"name": "Partner contact", "type": "contact", "parent_id": self.partner.id} + ) + self.order.action_confirm() + picking = self.order.picking_ids[0] + picking.partner_id = self.child_partner_contact + self.assertEqual(picking.delivery_zone_id, self.partner.delivery_zone_id) + + def test_picking_assign_commercial_partner_delivery_zone(self): + # For contact type partners the delivery zone get from commercial + # partner + self.child_partner_delivery = self.env["res.partner"].create( + { + "name": "Partner delivery", + "type": "delivery", + "parent_id": self.partner.id, + } + ) + self.order.action_confirm() + picking = self.order.picking_ids[0] + picking.partner_id = self.child_partner_delivery + self.assertFalse(picking.delivery_zone_id) + + def test_change_delivery_zone(self): + self.order.action_confirm() + self.assertEqual(self.order.picking_ids.delivery_zone_id, self.delivery_zone_a) + self.order.picking_ids.delivery_zone_id = self.delivery_zone_b + self.assertEqual(self.order.delivery_zone_id, self.delivery_zone_b) + self.order.delivery_zone_id = self.delivery_zone_a + self.assertEqual(self.order.picking_ids.delivery_zone_id, self.delivery_zone_a) + + def test_wharehouse_three_steps(self): + self.warehouse.delivery_steps = "pick_pack_ship" + self.order.action_confirm() + for picking in self.order.picking_ids: + self.assertEqual(picking.delivery_zone_id, self.order.delivery_zone_id) + + def test_wharehouse_three_steps_so_wo_delivery_zone(self): + # If SO has not delivery zone, all pickings obtains the delivery zone + # from shipping partner + self.warehouse.delivery_steps = "pick_pack_ship" + self.order.delivery_zone_id = False + self.order.action_confirm() + for picking in self.order.picking_ids: + self.assertEqual( + picking.delivery_zone_id, + self.order.partner_shipping_id.delivery_zone_id, + ) diff --git a/partner_delivery_zone/views/partner_delivery_zone_view.xml b/partner_delivery_zone/views/partner_delivery_zone_view.xml new file mode 100644 index 0000000000..b344d8634c --- /dev/null +++ b/partner_delivery_zone/views/partner_delivery_zone_view.xml @@ -0,0 +1,42 @@ + + + + + partner.delivery.zone.tree + partner.delivery.zone + + + + + + + + + partner.delivery.zone.tree + partner.delivery.zone + + + + + + + + + Delivery Zones + partner.delivery.zone + list + + +

Click to set a new delivery zone for partners.

+
+
+ +
diff --git a/partner_delivery_zone/views/report_deliveryslip.xml b/partner_delivery_zone/views/report_deliveryslip.xml new file mode 100644 index 0000000000..6123bd9619 --- /dev/null +++ b/partner_delivery_zone/views/report_deliveryslip.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/partner_delivery_zone/views/report_shipping.xml b/partner_delivery_zone/views/report_shipping.xml new file mode 100644 index 0000000000..3317ce162a --- /dev/null +++ b/partner_delivery_zone/views/report_shipping.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/partner_delivery_zone/views/res_partner_view.xml b/partner_delivery_zone/views/res_partner_view.xml new file mode 100644 index 0000000000..050ad2a583 --- /dev/null +++ b/partner_delivery_zone/views/res_partner_view.xml @@ -0,0 +1,38 @@ + + + + + res.partner + partner delivery zone + + + + + + + + + + + + res.partner + + + + + + + + + + + + diff --git a/partner_delivery_zone/views/sale_order_view.xml b/partner_delivery_zone/views/sale_order_view.xml new file mode 100644 index 0000000000..55a8ae9e85 --- /dev/null +++ b/partner_delivery_zone/views/sale_order_view.xml @@ -0,0 +1,45 @@ + + + + + sale.order.delivery.zone.form.view + sale.order + + + + + + + + + sale.order + + + + + + + + + sale.order + + + + + + + + + + + + diff --git a/partner_delivery_zone/views/stock_picking_view.xml b/partner_delivery_zone/views/stock_picking_view.xml new file mode 100644 index 0000000000..51c22bf2a1 --- /dev/null +++ b/partner_delivery_zone/views/stock_picking_view.xml @@ -0,0 +1,64 @@ + + + + + stock.picking + + + + + + + + + + + stock.picking + + + + + + + + + + + + + stock.picking.delivery.kanban + stock.picking + + 999 + + + + + +
+
+ +
+
+ +
+
+
+
+
+ + stock.picking.delivery.tree + stock.picking + + + + + + + +