From 27a4c07187c2c286f8c6487192f98ecb0f07f1c2 Mon Sep 17 00:00:00 2001 From: Simon Lejeune Date: Thu, 22 Aug 2019 09:30:19 +0000 Subject: [PATCH] [REF] stock_dropshipping: multi company Now that company_id is required on the picking type, make sure we create as many dropship picking type/rules/sequence as there are companies task-1985992 --- addons/stock_dropshipping/data/stock_data.xml | 31 +---- addons/stock_dropshipping/models/__init__.py | 2 + .../stock_dropshipping/models/res_company.py | 109 ++++++++++++++++++ addons/stock_dropshipping/models/stock.py | 15 +++ 4 files changed, 131 insertions(+), 26 deletions(-) create mode 100644 addons/stock_dropshipping/models/res_company.py create mode 100644 addons/stock_dropshipping/models/stock.py diff --git a/addons/stock_dropshipping/data/stock_data.xml b/addons/stock_dropshipping/data/stock_data.xml index 1b49842d8b5..f182dde866b 100644 --- a/addons/stock_dropshipping/data/stock_data.xml +++ b/addons/stock_dropshipping/data/stock_data.xml @@ -1,24 +1,9 @@ - - Dropship - DS - 5 - - + + - - Dropship - DS - - incoming - - - - - - Dropship 3 @@ -28,14 +13,8 @@ - - Vendor → Customer (Dropshipping) - buy - - - make_to_stock - - - + + + diff --git a/addons/stock_dropshipping/models/__init__.py b/addons/stock_dropshipping/models/__init__.py index 7d6f1be055f..9e307a98b9f 100644 --- a/addons/stock_dropshipping/models/__init__.py +++ b/addons/stock_dropshipping/models/__init__.py @@ -2,4 +2,6 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import purchase +from . import res_company from . import sale +from . import stock diff --git a/addons/stock_dropshipping/models/res_company.py b/addons/stock_dropshipping/models/res_company.py new file mode 100644 index 00000000000..e81141adcf0 --- /dev/null +++ b/addons/stock_dropshipping/models/res_company.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ + + +class ResCompany(models.Model): + _inherit = 'res.company' + + # ------------------------------------------------------------------------- + # Sequences + # ------------------------------------------------------------------------- + def _create_dropship_sequence(self): + dropship_vals = [] + for company in self: + dropship_vals.append({ + 'name': 'Dropship (%s)' % company.name, + 'code': 'stock.dropshipping', + 'company_id': company.id, + 'prefix': 'DS/', + 'padding': 5, + }) + if dropship_vals: + self.env['ir.sequence'].create(dropship_vals) + + @api.model + def create_missing_dropship_sequence(self): + company_ids = self.env['res.company'].search([]) + company_has_dropship_seq = self.env['ir.sequence'].search([('code', '=', 'stock.dropshippping')]).mapped('company_id') + company_todo_sequence = company_ids - company_has_dropship_seq + company_todo_sequence._create_dropship_sequence() + + def _create_per_company_sequences(self): + super(ResCompany, self)._create_per_company_sequences() + self._create_dropship_sequence() + + # ------------------------------------------------------------------------- + # Picking types + # ------------------------------------------------------------------------- + def _create_dropship_picking_type(self): + dropship_vals = [] + for company in self: + sequence = self.env['ir.sequence'].search([ + ('code', '=', 'stock.dropshipping'), + ('company_id', '=', company.id), + ]) + dropship_vals.append({ + 'name': 'Dropship', + 'company_id': company.id, + 'warehouse_id': False, + 'sequence_id': sequence.id, + 'code': 'incoming', + 'default_location_src_id': self.env.ref('stock.stock_location_suppliers').id, + 'default_location_dest_id': self.env.ref('stock.stock_location_customers').id, + 'sequence_code': 'DS', + }) + if dropship_vals: + self.env['stock.picking.type'].create(dropship_vals) + + @api.model + def create_missing_dropship_picking_type(self): + company_ids = self.env['res.company'].search([]) + company_has_dropship_picking_type = self.env['stock.picking.type'].search([('name', '=', 'Dropship')]).mapped('company_id') + company_todo_picking_type = company_ids - company_has_dropship_picking_type + company_todo_picking_type._create_dropship_picking_type() + + def _create_per_company_picking_types(self): + super(ResCompany, self)._create_per_company_picking_types() + self._create_dropship_picking_type() + + # ------------------------------------------------------------------------- + # Stock rules + # ------------------------------------------------------------------------- + def _create_dropship_rule(self): + dropship_route = self.env.ref('stock_dropshipping.route_drop_shipping') + supplier_location = self.env.ref('stock.stock_location_suppliers') + customer_location = self.env.ref('stock.stock_location_customers') + + dropship_vals = [] + for company in self: + dropship_picking_type = self.env['stock.picking.type'].search([ + ('name', '=', 'Dropship'), + ('company_id', '=', company.id), + ]) + dropship_vals.append({ + 'name': '%s → %s' % (supplier_location.name, customer_location.name), + 'action': 'buy', + 'location_id': customer_location.id, + 'location_src_id': supplier_location.id, + 'procure_method': 'make_to_stock', + 'route_id': dropship_route.id, + 'picking_type_id': dropship_picking_type.id, + 'company_id': company.id, + }) + if dropship_vals: + self.env['stock.rule'].create(dropship_vals) + + @api.model + def create_missing_dropship_rule(self): + dropship_route = self.env.ref('stock_dropshipping.route_drop_shipping') + + company_ids = self.env['res.company'].search([]) + company_has_dropship_rule = self.env['stock.rule'].search([('route_id', '=', dropship_route.id)]).mapped('company_id') + company_todo_rule = company_ids - company_has_dropship_rule + company_todo_rule._create_dropship_rule() + + def _create_per_company_rules(self): + super(ResCompany, self)._create_per_company_rules() + self._create_dropship_rule() diff --git a/addons/stock_dropshipping/models/stock.py b/addons/stock_dropshipping/models/stock.py new file mode 100644 index 00000000000..e18004815b8 --- /dev/null +++ b/addons/stock_dropshipping/models/stock.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, models + + +class ProcurementGroup(models.Model): + _inherit = "procurement.group" + + @api.model + def _get_rule_domain(self, location, values): + if 'sale_line_id' in values and values.get('company_id'): + return [('location_id', '=', location.id), ('action', '!=', 'push'), ('company_id', '=', values['company_id'].id)] + else: + return super(ProcurementGroup, self)._get_rule_domain(location, values)