From 32f2884073d68f62cf313fd4b6fb3254e03f1240 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Wed, 9 May 2018 09:31:24 -0700 Subject: [PATCH 1/6] Initial commit of `stock_delivery_route` fro 11.0 --- stock_delivery_route/README.rst | 18 ++++ stock_delivery_route/__init__.py | 1 + stock_delivery_route/__manifest__.py | 32 +++++++ stock_delivery_route/models/__init__.py | 3 + stock_delivery_route/models/partner.py | 7 ++ stock_delivery_route/models/sale.py | 32 +++++++ stock_delivery_route/models/stock.py | 43 ++++++++++ .../security/ir.model.access.csv | 2 + stock_delivery_route/tests/__init__.py | 1 + .../tests/test_sale_routes.py | 22 +++++ stock_delivery_route/views/partner_views.xml | 17 ++++ stock_delivery_route/views/sale_views.xml | 13 +++ stock_delivery_route/views/stock_views.xml | 86 +++++++++++++++++++ 13 files changed, 277 insertions(+) create mode 100644 stock_delivery_route/README.rst create mode 100644 stock_delivery_route/__init__.py create mode 100644 stock_delivery_route/__manifest__.py create mode 100644 stock_delivery_route/models/__init__.py create mode 100644 stock_delivery_route/models/partner.py create mode 100644 stock_delivery_route/models/sale.py create mode 100644 stock_delivery_route/models/stock.py create mode 100644 stock_delivery_route/security/ir.model.access.csv create mode 100644 stock_delivery_route/tests/__init__.py create mode 100644 stock_delivery_route/tests/test_sale_routes.py create mode 100644 stock_delivery_route/views/partner_views.xml create mode 100644 stock_delivery_route/views/sale_views.xml create mode 100644 stock_delivery_route/views/stock_views.xml diff --git a/stock_delivery_route/README.rst b/stock_delivery_route/README.rst new file mode 100644 index 00000000..77695d27 --- /dev/null +++ b/stock_delivery_route/README.rst @@ -0,0 +1,18 @@ +******************************** +Hibou - Warehouse Delivery Route +******************************** + +Define delivery routes per warehouse. Pick the delivery route on the sale order or delivery order. + +Optionally define warehouse routes on the Customer or Customer's Delivery address to pre-select +the delivery route. + +For more information and add-ons, visit `Hibou.io `_. + + +======= +License +======= + +Please see `LICENSE `_. +Copyright Hibou Corp. 2018 \ No newline at end of file diff --git a/stock_delivery_route/__init__.py b/stock_delivery_route/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/stock_delivery_route/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/stock_delivery_route/__manifest__.py b/stock_delivery_route/__manifest__.py new file mode 100644 index 00000000..5202f523 --- /dev/null +++ b/stock_delivery_route/__manifest__.py @@ -0,0 +1,32 @@ +{ + 'name': 'Warehouse Delivery Routes', + 'summary': 'Assign a delivery route to a sale order or picking.', + 'version': '11.0.1.0.0', + 'author': "Hibou Corp. ", + 'category': 'Warehouse', + 'license': 'AGPL-3', + 'complexity': 'expert', + 'images': [], + 'website': "https://hibou.io", + 'description': """ +Warehouse Delivery Routes +========================= + +Assign a delivery route at the time of sale order. +Additionally, set a default route on the customer level. + +""", + 'depends': [ + 'sale_stock', + 'stock_picking_batch', + ], + 'demo': [], + 'data': [ + 'views/partner_views.xml', + 'views/sale_views.xml', + 'views/stock_views.xml', + 'security/ir.model.access.csv', + ], + 'auto_install': False, + 'installable': True, +} diff --git a/stock_delivery_route/models/__init__.py b/stock_delivery_route/models/__init__.py new file mode 100644 index 00000000..920b3030 --- /dev/null +++ b/stock_delivery_route/models/__init__.py @@ -0,0 +1,3 @@ +from . import stock +from . import partner +from . import sale diff --git a/stock_delivery_route/models/partner.py b/stock_delivery_route/models/partner.py new file mode 100644 index 00000000..57a26abc --- /dev/null +++ b/stock_delivery_route/models/partner.py @@ -0,0 +1,7 @@ +from odoo import fields, models + + +class Partner(models.Model): + _inherit = 'res.partner' + + delivery_route_ids = fields.Many2many('stock.warehouse.delivery.route', string="Delivery Routes") diff --git a/stock_delivery_route/models/sale.py b/stock_delivery_route/models/sale.py new file mode 100644 index 00000000..86b6eb30 --- /dev/null +++ b/stock_delivery_route/models/sale.py @@ -0,0 +1,32 @@ +from odoo import api, fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + delivery_route_id = fields.Many2one('stock.warehouse.delivery.route', string='Delivery Route') + + @api.onchange('partner_id', 'partner_shipping_id', 'warehouse_id') + @api.multi + def _prefill_delivery_route(self): + for so in self: + if so.warehouse_id: + for route in so.partner_shipping_id.delivery_route_ids.filtered(lambda d: d.warehouse_id == so.warehouse_id): + so.delivery_route_id = route + break + else: + for route in so.partner_id.delivery_route_ids.filtered(lambda d: d.warehouse_id == so.warehouse_id): + so.delivery_route_id = route + break + else: + so.delivery_route_id = False + else: + so.delivery_route_id = False + + @api.multi + def action_confirm(self): + val = super(SaleOrder, self).action_confirm() + for so in self: + if so.delivery_route_id and so.picking_ids: + so.picking_ids.write({'delivery_route_id': so.delivery_route_id.id}) + return val diff --git a/stock_delivery_route/models/stock.py b/stock_delivery_route/models/stock.py new file mode 100644 index 00000000..87d78cec --- /dev/null +++ b/stock_delivery_route/models/stock.py @@ -0,0 +1,43 @@ +from odoo import api, fields, models + + +class Warehouse(models.Model): + _inherit = 'stock.warehouse' + + delivery_route_ids = fields.One2many('stock.warehouse.delivery.route', 'warehouse_id', string='Delivery Routes') + + +class Picking(models.Model): + _inherit = 'stock.picking' + _order = 'sequence asc, priority desc, date asc, id desc' + + sequence = fields.Integer(string='Sequence') + warehouse_id = fields.Many2one('stock.warehouse', related='picking_type_id.warehouse_id') + delivery_route_id = fields.Many2one('stock.warehouse.delivery.route', string='Delivery Route') + partner_address = fields.Char(string='Address', compute='_compute_partner_address') + + @api.multi + def _compute_partner_address(self): + for pick in self: + if pick.partner_id: + pick.partner_address = '%s: %s, %s' % (pick.partner_id.name or '', pick.partner_id.street or '', pick.partner_id.city or '') + else: + pick.partner_address = '' + + +class WarehouseDeliveryRoute(models.Model): + _name = 'stock.warehouse.delivery.route' + + name = fields.Char(string='Name') + warehouse_id = fields.Many2one('stock.warehouse', string='Warehouse') + note = fields.Text(string='Note') + + @api.multi + def name_get(self): + res = [] + for route in self: + res.append((route.id, '[%s] %s' % (route.warehouse_id.code, route.name))) + return res + + + diff --git a/stock_delivery_route/security/ir.model.access.csv b/stock_delivery_route/security/ir.model.access.csv new file mode 100644 index 00000000..e30455da --- /dev/null +++ b/stock_delivery_route/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +"user_stock_warehouse_delivery_route","user stock_warehouse_delivery_route","model_stock_warehouse_delivery_route","base.group_user",1,1,1,1 \ No newline at end of file diff --git a/stock_delivery_route/tests/__init__.py b/stock_delivery_route/tests/__init__.py new file mode 100644 index 00000000..91e10996 --- /dev/null +++ b/stock_delivery_route/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_routes diff --git a/stock_delivery_route/tests/test_sale_routes.py b/stock_delivery_route/tests/test_sale_routes.py new file mode 100644 index 00000000..f425e0e0 --- /dev/null +++ b/stock_delivery_route/tests/test_sale_routes.py @@ -0,0 +1,22 @@ +from odoo.tests import common + + +class TestSaleRoutes(common.TransactionCase): + + def test_plan_two_warehouses(self): + partner = self.env.ref('base.res_partner_2') + product_1 = self.env.ref('product.product_product_24_product_template') + wh_1 = self.env.ref('stock.stock_warehouse_shop0') + delivery_route = self.env['stock.warehouse.delivery.route'].create({ + 'name': 'Test', + 'warehouse_id': wh_1.id, + }) + so = self.env['sale.order'].create({ + 'warehouse_id': wh_1.id, + 'partner_id': partner.id, + 'order_line': [(0, 0, {'product_id': product_1.product_variant_id.id})], + 'delivery_route_id': delivery_route.id, + }) + so.action_confirm() + self.assertTrue(so.state in ('sale', 'done')) + self.assertEqual(so.picking_ids[0].delivery_route_id, delivery_route) diff --git a/stock_delivery_route/views/partner_views.xml b/stock_delivery_route/views/partner_views.xml new file mode 100644 index 00000000..2583db73 --- /dev/null +++ b/stock_delivery_route/views/partner_views.xml @@ -0,0 +1,17 @@ + + + + res.partner.form.inherit + res.partner + + + + + + + + + + + + \ No newline at end of file diff --git a/stock_delivery_route/views/sale_views.xml b/stock_delivery_route/views/sale_views.xml new file mode 100644 index 00000000..3fa4d46d --- /dev/null +++ b/stock_delivery_route/views/sale_views.xml @@ -0,0 +1,13 @@ + + + + sale.order.form.sale.stock.inherit + sale.order + + + + + + + + \ No newline at end of file diff --git a/stock_delivery_route/views/stock_views.xml b/stock_delivery_route/views/stock_views.xml new file mode 100644 index 00000000..70ff0b99 --- /dev/null +++ b/stock_delivery_route/views/stock_views.xml @@ -0,0 +1,86 @@ + + + + + stock.warehouse.inherit + stock.warehouse + + + + + + + + + + +
+ + + + + + + + + +
+
+
+
+
+
+
+ + + + stock.picking.internal.search.inherit + stock.picking + + + + + + + + + + + + stock.picking.tree.search.inherit + stock.picking + + + + + + + + + + + + stock.picking.form.inherit + stock.picking + + + + + + + + + + + + stock.picking.batch.form.inherit + stock.picking.batch + + + + + + + + +
\ No newline at end of file From f0824c68218b2f0300edcd020233401f3a3517b6 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Sat, 16 Mar 2019 11:04:42 -0700 Subject: [PATCH 2/6] MIG `stock_delivery_route` to 12.0 --- stock_delivery_route/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock_delivery_route/__manifest__.py b/stock_delivery_route/__manifest__.py index 5202f523..f15ac887 100644 --- a/stock_delivery_route/__manifest__.py +++ b/stock_delivery_route/__manifest__.py @@ -1,7 +1,7 @@ { 'name': 'Warehouse Delivery Routes', 'summary': 'Assign a delivery route to a sale order or picking.', - 'version': '11.0.1.0.0', + 'version': '12.0.1.0.0', 'author': "Hibou Corp. ", 'category': 'Warehouse', 'license': 'AGPL-3', From c2c4a8a11b380c7bad47eb81c541bc4763a44bfe Mon Sep 17 00:00:00 2001 From: Connor Christian Date: Mon, 9 Nov 2020 16:34:13 -0500 Subject: [PATCH 3/6] [MIG] stock_delivery_route: for Odoo 13.0 --- stock_delivery_route/__manifest__.py | 2 +- stock_delivery_route/models/sale.py | 2 -- stock_delivery_route/models/stock.py | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/stock_delivery_route/__manifest__.py b/stock_delivery_route/__manifest__.py index f15ac887..82250984 100644 --- a/stock_delivery_route/__manifest__.py +++ b/stock_delivery_route/__manifest__.py @@ -1,7 +1,7 @@ { 'name': 'Warehouse Delivery Routes', 'summary': 'Assign a delivery route to a sale order or picking.', - 'version': '12.0.1.0.0', + 'version': '13.0.1.0.0', 'author': "Hibou Corp. ", 'category': 'Warehouse', 'license': 'AGPL-3', diff --git a/stock_delivery_route/models/sale.py b/stock_delivery_route/models/sale.py index 86b6eb30..f9fd0d6d 100644 --- a/stock_delivery_route/models/sale.py +++ b/stock_delivery_route/models/sale.py @@ -7,7 +7,6 @@ class SaleOrder(models.Model): delivery_route_id = fields.Many2one('stock.warehouse.delivery.route', string='Delivery Route') @api.onchange('partner_id', 'partner_shipping_id', 'warehouse_id') - @api.multi def _prefill_delivery_route(self): for so in self: if so.warehouse_id: @@ -23,7 +22,6 @@ class SaleOrder(models.Model): else: so.delivery_route_id = False - @api.multi def action_confirm(self): val = super(SaleOrder, self).action_confirm() for so in self: diff --git a/stock_delivery_route/models/stock.py b/stock_delivery_route/models/stock.py index 87d78cec..e3fedf9f 100644 --- a/stock_delivery_route/models/stock.py +++ b/stock_delivery_route/models/stock.py @@ -16,7 +16,6 @@ class Picking(models.Model): delivery_route_id = fields.Many2one('stock.warehouse.delivery.route', string='Delivery Route') partner_address = fields.Char(string='Address', compute='_compute_partner_address') - @api.multi def _compute_partner_address(self): for pick in self: if pick.partner_id: @@ -32,7 +31,6 @@ class WarehouseDeliveryRoute(models.Model): warehouse_id = fields.Many2one('stock.warehouse', string='Warehouse') note = fields.Text(string='Note') - @api.multi def name_get(self): res = [] for route in self: From 98379eeb3994f1867f30bb4562235c54992669bf Mon Sep 17 00:00:00 2001 From: Connor Christian Date: Tue, 10 Nov 2020 12:53:12 -0500 Subject: [PATCH 4/6] [MIG] stock_delivery_route: for Odoo 14.0 --- stock_delivery_route/__manifest__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock_delivery_route/__manifest__.py b/stock_delivery_route/__manifest__.py index 82250984..dcfff5a2 100644 --- a/stock_delivery_route/__manifest__.py +++ b/stock_delivery_route/__manifest__.py @@ -1,7 +1,7 @@ { 'name': 'Warehouse Delivery Routes', 'summary': 'Assign a delivery route to a sale order or picking.', - 'version': '13.0.1.0.0', + 'version': '14.0.1.0.0', 'author': "Hibou Corp. ", 'category': 'Warehouse', 'license': 'AGPL-3', From e1ee7fa67367ff8e65ac5afd12ef4e8dfc61ab4f Mon Sep 17 00:00:00 2001 From: Connor Christian Date: Tue, 10 Nov 2020 16:50:16 -0500 Subject: [PATCH 5/6] [FIX] stock_delivery_route: fix reference to proper warehouse xml id --- stock_delivery_route/tests/test_sale_routes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stock_delivery_route/tests/test_sale_routes.py b/stock_delivery_route/tests/test_sale_routes.py index f425e0e0..a06c6057 100644 --- a/stock_delivery_route/tests/test_sale_routes.py +++ b/stock_delivery_route/tests/test_sale_routes.py @@ -6,7 +6,7 @@ class TestSaleRoutes(common.TransactionCase): def test_plan_two_warehouses(self): partner = self.env.ref('base.res_partner_2') product_1 = self.env.ref('product.product_product_24_product_template') - wh_1 = self.env.ref('stock.stock_warehouse_shop0') + wh_1 = self.env.ref('stock.warehouse0') delivery_route = self.env['stock.warehouse.delivery.route'].create({ 'name': 'Test', 'warehouse_id': wh_1.id, From d5ae08400d221e639523dbe883f39dc3b1eef74f Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Thu, 7 Oct 2021 13:42:46 -0700 Subject: [PATCH 6/6] [MIG] stock_delivery_route: to Odoo 15.0 --- stock_delivery_route/__manifest__.py | 4 ++-- stock_delivery_route/views/stock_views.xml | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/stock_delivery_route/__manifest__.py b/stock_delivery_route/__manifest__.py index dcfff5a2..4ae65bc2 100644 --- a/stock_delivery_route/__manifest__.py +++ b/stock_delivery_route/__manifest__.py @@ -1,10 +1,10 @@ { 'name': 'Warehouse Delivery Routes', 'summary': 'Assign a delivery route to a sale order or picking.', - 'version': '14.0.1.0.0', + 'version': '15.0.1.0.0', 'author': "Hibou Corp. ", 'category': 'Warehouse', - 'license': 'AGPL-3', + 'license': 'LGPL-3', 'complexity': 'expert', 'images': [], 'website': "https://hibou.io", diff --git a/stock_delivery_route/views/stock_views.xml b/stock_delivery_route/views/stock_views.xml index 70ff0b99..cd8aa8d1 100644 --- a/stock_delivery_route/views/stock_views.xml +++ b/stock_delivery_route/views/stock_views.xml @@ -72,15 +72,16 @@ - - stock.picking.batch.form.inherit - stock.picking.batch - + + stock_picking_batch.picking.tree.batch.inherit + stock.picking + - + + \ No newline at end of file