From 40eb8e158cb3ec210346c407cdd6cbc246205884 Mon Sep 17 00:00:00 2001 From: JF Aubert Date: Fri, 20 Aug 2021 10:21:57 +0000 Subject: [PATCH] [IMP] mrp_subcontracting_dropshipping: Add new route Added 'Dropship Subcontractor on Order' route to simplify user interaction and stay tuned with 'Resupply Subcontractor on Order'. Task: 2444742 Part-of: odoo/odoo#71732 --- .../models/stock_picking.py | 2 +- .../__manifest__.py | 4 ++ .../mrp_subcontracting_dropshipping_data.xml | 20 ++++++++ .../models/__init__.py | 2 + .../models/res_company.py | 46 +++++++++++++++++++ .../models/stock_warehouse.py | 42 +++++++++++++++++ .../views/stock_warehouse_views.xml | 13 ++++++ 7 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 addons/mrp_subcontracting_dropshipping/data/mrp_subcontracting_dropshipping_data.xml create mode 100644 addons/mrp_subcontracting_dropshipping/models/res_company.py create mode 100644 addons/mrp_subcontracting_dropshipping/models/stock_warehouse.py create mode 100644 addons/mrp_subcontracting_dropshipping/views/stock_warehouse_views.xml diff --git a/addons/mrp_subcontracting/models/stock_picking.py b/addons/mrp_subcontracting/models/stock_picking.py index ecef047906a..725eaecb057 100644 --- a/addons/mrp_subcontracting/models/stock_picking.py +++ b/addons/mrp_subcontracting/models/stock_picking.py @@ -93,7 +93,7 @@ class StockPicking(models.Model): return self.move_lines.filtered(lambda move: move.is_subcontract).move_orig_ids.production_id def _get_warehouse(self, subcontract_move): - return subcontract_move.warehouse_id or self.picking_type_id.warehouse_id + return subcontract_move.warehouse_id or self.picking_type_id.warehouse_id or subcontract_move.move_dest_ids.picking_type_id.warehouse_id def _prepare_subcontract_mo_vals(self, subcontract_move, bom): subcontract_move.ensure_one() diff --git a/addons/mrp_subcontracting_dropshipping/__manifest__.py b/addons/mrp_subcontracting_dropshipping/__manifest__.py index 644099353b1..c9da839f96f 100644 --- a/addons/mrp_subcontracting_dropshipping/__manifest__.py +++ b/addons/mrp_subcontracting_dropshipping/__manifest__.py @@ -10,6 +10,10 @@ This bridge module allows to manage subcontracting with the dropshipping module. """, 'depends': ['mrp_subcontracting', 'stock_dropshipping'], + 'data': [ + 'data/mrp_subcontracting_dropshipping_data.xml', + 'views/stock_warehouse_views.xml', + ], 'installable': True, 'auto_install': True, 'license': 'LGPL-3', diff --git a/addons/mrp_subcontracting_dropshipping/data/mrp_subcontracting_dropshipping_data.xml b/addons/mrp_subcontracting_dropshipping/data/mrp_subcontracting_dropshipping_data.xml new file mode 100644 index 00000000000..d4ada8aeb57 --- /dev/null +++ b/addons/mrp_subcontracting_dropshipping/data/mrp_subcontracting_dropshipping_data.xml @@ -0,0 +1,20 @@ + + + + + + Dropship Subcontractor on Order + 5 + + + + + + + + + + + + + diff --git a/addons/mrp_subcontracting_dropshipping/models/__init__.py b/addons/mrp_subcontracting_dropshipping/models/__init__.py index ac9517445ae..069e3f45f70 100644 --- a/addons/mrp_subcontracting_dropshipping/models/__init__.py +++ b/addons/mrp_subcontracting_dropshipping/models/__init__.py @@ -2,3 +2,5 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import stock_picking +from . import res_company +from . import stock_warehouse diff --git a/addons/mrp_subcontracting_dropshipping/models/res_company.py b/addons/mrp_subcontracting_dropshipping/models/res_company.py new file mode 100644 index 00000000000..b1cddbd7975 --- /dev/null +++ b/addons/mrp_subcontracting_dropshipping/models/res_company.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, models + + +class ResCompany(models.Model): + _inherit = 'res.company' + + def _create_subcontracting_dropshipping_rules(self): + route = self.env.ref('mrp_subcontracting_dropshipping.route_subcontracting_dropshipping') + supplier_location = self.env.ref('stock.stock_location_suppliers') + vals = [] + for company in self: + subcontracting_location = company.subcontracting_location_id + dropship_picking_type = self.env['stock.picking.type'].search([ + ('company_id', '=', company.id), + ('default_location_src_id.usage', '=', 'supplier'), + ('default_location_dest_id.usage', '=', 'customer'), + ], limit=1, order='sequence') + if dropship_picking_type: + vals.append({ + 'name': '%s → %s' % (supplier_location.name, subcontracting_location.name), + 'action': 'buy', + 'location_id': subcontracting_location.id, + 'location_src_id': supplier_location.id, + 'procure_method': 'make_to_stock', + 'route_id': route.id, + 'picking_type_id': dropship_picking_type.id, + 'company_id': company.id, + }) + if vals: + self.env['stock.rule'].create(vals) + + @api.model + def create_missing_subcontracting_dropshipping_rules(self): + route = self.env.ref('mrp_subcontracting_dropshipping.route_subcontracting_dropshipping') + company_ids = self.env['res.company'].search([]) + company_has_rules = self.env['stock.rule'].search([('route_id', '=', route.id)]).mapped('company_id') + company_todo_rules = company_ids - company_has_rules + company_todo_rules._create_subcontracting_dropshipping_rules() + + def _create_per_company_rules(self): + res = super()._create_per_company_rules() + self.create_missing_subcontracting_dropshipping_rules() + return res diff --git a/addons/mrp_subcontracting_dropshipping/models/stock_warehouse.py b/addons/mrp_subcontracting_dropshipping/models/stock_warehouse.py new file mode 100644 index 00000000000..c85e5dd3ca7 --- /dev/null +++ b/addons/mrp_subcontracting_dropshipping/models/stock_warehouse.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models, _ + + +class StockWarehouse(models.Model): + _inherit = 'stock.warehouse' + + subcontracting_dropshipping_to_resupply = fields.Boolean( + 'Dropship Subcontractors', default=True, + help="Dropship subcontractors with components") + + subcontracting_dropshipping_pull_id = fields.Many2one( + 'stock.rule', 'Subcontracting-Dropshipping MTS Rule' + ) + + def _get_global_route_rules_values(self): + rules = super()._get_global_route_rules_values() + subcontract_location_id = self._get_subcontracting_location() + production_location_id = self._get_production_location() + rules.update({ + 'subcontracting_dropshipping_pull_id': { + 'depends': ['subcontracting_dropshipping_to_resupply'], + 'create_values': { + 'procure_method': 'make_to_order', + 'company_id': self.company_id.id, + 'action': 'pull', + 'auto': 'manual', + 'route_id': self._find_global_route('mrp_subcontracting_dropshipping.route_subcontracting_dropshipping', + _('Dropship Subcontractor on Order')).id, + 'name': self._format_rulename(subcontract_location_id, production_location_id, False), + 'location_id': production_location_id.id, + 'location_src_id': subcontract_location_id.id, + 'picking_type_id': self.subcontracting_type_id.id + }, + 'update_values': { + 'active': self.subcontracting_dropshipping_to_resupply + } + }, + }) + return rules diff --git a/addons/mrp_subcontracting_dropshipping/views/stock_warehouse_views.xml b/addons/mrp_subcontracting_dropshipping/views/stock_warehouse_views.xml new file mode 100644 index 00000000000..e61b6ff48f4 --- /dev/null +++ b/addons/mrp_subcontracting_dropshipping/views/stock_warehouse_views.xml @@ -0,0 +1,13 @@ + + + + Stock Warehouse Inherit Subcontracting Dropshipping + stock.warehouse + + + + + + + +