From 3b04ff23d582584cdf1598f86f964cf02ef93f6b Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Wed, 9 May 2018 09:17:09 -0700 Subject: [PATCH] Initial commit of `sale_sourced_by_line` for 11.0 --- sale_sourced_by_line/README.rst | 17 ++++++++++ sale_sourced_by_line/__init__.py | 1 + sale_sourced_by_line/__manifest__.py | 29 +++++++++++++++++ sale_sourced_by_line/models/__init__.py | 1 + sale_sourced_by_line/models/sale.py | 25 +++++++++++++++ sale_sourced_by_line/tests/__init__.py | 1 + .../tests/test_sale_sources.py | 23 +++++++++++++ sale_sourced_by_line/views/sale_views.xml | 32 +++++++++++++++++++ 8 files changed, 129 insertions(+) create mode 100644 sale_sourced_by_line/README.rst create mode 100644 sale_sourced_by_line/__init__.py create mode 100644 sale_sourced_by_line/__manifest__.py create mode 100644 sale_sourced_by_line/models/__init__.py create mode 100644 sale_sourced_by_line/models/sale.py create mode 100644 sale_sourced_by_line/tests/__init__.py create mode 100644 sale_sourced_by_line/tests/test_sale_sources.py create mode 100644 sale_sourced_by_line/views/sale_views.xml diff --git a/sale_sourced_by_line/README.rst b/sale_sourced_by_line/README.rst new file mode 100644 index 00000000..2c747686 --- /dev/null +++ b/sale_sourced_by_line/README.rst @@ -0,0 +1,17 @@ +============================ +Hibou - Sale Sourced by Line +============================ + +Adds warehouse and planned date fields to sale order lines. Will split the delivery orders +to every distinct warehouse. + +Additionally, adds fields per line and to the sale order to set the planned date on generated +delivery orders. + +======= +License +======= + +Please see `LICENSE `_. + +Copyright Hibou Corp. 2018 diff --git a/sale_sourced_by_line/__init__.py b/sale_sourced_by_line/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/sale_sourced_by_line/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_sourced_by_line/__manifest__.py b/sale_sourced_by_line/__manifest__.py new file mode 100644 index 00000000..1bf80449 --- /dev/null +++ b/sale_sourced_by_line/__manifest__.py @@ -0,0 +1,29 @@ +{ + 'name': 'Sale Sourced by Line', + 'summary': 'Multiple warehouse source locations for Sale order', + 'version': '11.0.1.0.0', + 'author': "Hibou Corp.,Odoo Community Association (OCA)", + 'category': 'Warehouse', + 'license': 'AGPL-3', + 'complexity': 'expert', + 'images': [], + 'website': "https://hibou.io", + 'description': """ +Sale Sourced by Line +==================== + +Adds the possibility to source a line of sale order from a specific +warehouse instead of using the warehouse of the sale order. + +""", + 'depends': [ + 'sale_stock', + 'sale_order_dates', + ], + 'demo': [], + 'data': [ + 'views/sale_views.xml', + ], + 'auto_install': False, + 'installable': True, +} diff --git a/sale_sourced_by_line/models/__init__.py b/sale_sourced_by_line/models/__init__.py new file mode 100644 index 00000000..8a0dc04e --- /dev/null +++ b/sale_sourced_by_line/models/__init__.py @@ -0,0 +1 @@ +from . import sale diff --git a/sale_sourced_by_line/models/sale.py b/sale_sourced_by_line/models/sale.py new file mode 100644 index 00000000..ea2b438d --- /dev/null +++ b/sale_sourced_by_line/models/sale.py @@ -0,0 +1,25 @@ +from odoo import api, fields, models + + +class SaleOrder(models.Model): + _inherit = 'sale.order' + + date_planned = fields.Datetime('Planned Date') + + +class SaleOrderLine(models.Model): + _inherit = 'sale.order.line' + + warehouse_id = fields.Many2one('stock.warehouse', string='Warehouse') + date_planned = fields.Datetime('Planned Date') + + @api.multi + def _prepare_procurement_values(self, group_id=False): + vals = super(SaleOrderLine, self)._prepare_procurement_values(group_id=group_id) + if self.warehouse_id: + vals.update({'warehouse_id': self.warehouse_id}) + if self.date_planned: + vals.update({'date_planned': self.date_planned}) + elif self.order_id.date_planned: + vals.update({'date_planned': self.order_id.date_planned}) + return vals diff --git a/sale_sourced_by_line/tests/__init__.py b/sale_sourced_by_line/tests/__init__.py new file mode 100644 index 00000000..90197d28 --- /dev/null +++ b/sale_sourced_by_line/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_sources diff --git a/sale_sourced_by_line/tests/test_sale_sources.py b/sale_sourced_by_line/tests/test_sale_sources.py new file mode 100644 index 00000000..2038d24a --- /dev/null +++ b/sale_sourced_by_line/tests/test_sale_sources.py @@ -0,0 +1,23 @@ +from odoo.tests import common + + +class TestSaleSources(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') + product_2 = self.env.ref('product.product_product_16_product_template') + wh_1 = self.env.ref('stock.stock_warehouse_shop0') + wh_2 = self.env.ref('stock.warehouse0') + so = self.env['sale.order'].create({ + 'warehouse_id': wh_1.id, + 'partner_id': partner.id, + 'date_planned': '2018-01-01', + 'order_line': [(0, 0, {'product_id': product_1.product_variant_id.id}), + (0, 0, {'product_id': product_2.product_variant_id.id, 'date_planned': '2018-02-01', 'warehouse_id': wh_2.id})] + }) + so.action_confirm() + self.assertTrue(so.state in ('sale', 'done')) + self.assertEqual(len(so.picking_ids), 2) + self.assertEqual(len(so.picking_ids.filtered(lambda p: p.picking_type_id.warehouse_id == wh_1)), 1) + self.assertEqual(len(so.picking_ids.filtered(lambda p: p.picking_type_id.warehouse_id == wh_2)), 1) diff --git a/sale_sourced_by_line/views/sale_views.xml b/sale_sourced_by_line/views/sale_views.xml new file mode 100644 index 00000000..05d68816 --- /dev/null +++ b/sale_sourced_by_line/views/sale_views.xml @@ -0,0 +1,32 @@ + + + + sale.order.form.warehouse + sale.order + + + + + + + + + + + + + + + + + sale.order.line.tree.warehouse + sale.order.line + + + + + + + + + \ No newline at end of file