[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
This commit is contained in:
JF Aubert
2021-09-02 10:41:45 +00:00
committed by Arnold Moyaux
parent 5d41c38673
commit 40eb8e158c
7 changed files with 128 additions and 1 deletions
@@ -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()
@@ -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',
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<odoo>
<data noupdate="1">
<record id="route_subcontracting_dropshipping" model='stock.location.route'>
<field name="name">Dropship Subcontractor on Order</field>
<field name="sequence">5</field>
<field name="company_id"></field>
<field name="product_selectable" eval="True"/>
</record>
<function model="res.company" name="create_missing_subcontracting_dropshipping_rules"/>
<function model="stock.warehouse" name="write">
<value model="stock.warehouse" eval="obj().env['stock.warehouse'].search([]).ids"/>
<value eval="{'subcontracting_dropshipping_to_resupply': True}"/>
</function>
</data>
</odoo>
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_warehouse_inherit_mrp_subcontracting_dropshipping" model="ir.ui.view">
<field name="name">Stock Warehouse Inherit Subcontracting Dropshipping</field>
<field name="model">stock.warehouse</field>
<field name="inherit_id" ref="mrp_subcontracting.view_warehouse_inherit_mrp_subcontracting"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='subcontracting_to_resupply']" position="before">
<field name="subcontracting_dropshipping_to_resupply" />
</xpath>
</field>
</record>
</odoo>