95 lines
4.9 KiB
Python
95 lines
4.9 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo import api, 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'
|
||
|
)
|
||
|
|
||
|
@api.model_create_multi
|
||
|
def create(self, vals_list):
|
||
|
res = super().create(vals_list)
|
||
|
# if new warehouse has resupply enabled, enable global route
|
||
|
if any([vals.get('subcontracting_dropshipping_to_resupply', False) for vals in vals_list]):
|
||
|
res.update_global_route_dropship_subcontractor()
|
||
|
return res
|
||
|
|
||
|
def write(self, vals):
|
||
|
res = super().write(vals)
|
||
|
# if all warehouses have resupply disabled, disable global route, until its enabled on a warehouse
|
||
|
if 'subcontracting_dropshipping_to_resupply' in vals or 'active' in vals:
|
||
|
if 'subcontracting_dropshipping_to_resupply' in vals:
|
||
|
# ignore when warehouse archived since it will auto-archive all of its rules
|
||
|
self._update_dropship_subcontract_rules()
|
||
|
self.update_global_route_dropship_subcontractor()
|
||
|
return res
|
||
|
|
||
|
def _update_dropship_subcontract_rules(self):
|
||
|
'''update (archive/unarchive) any warehouse subcontracting location dropship rules'''
|
||
|
subcontracting_locations = self._get_subcontracting_locations()
|
||
|
route_id = self._find_global_route('mrp_subcontracting_dropshipping.route_subcontracting_dropshipping',
|
||
|
_('Dropship Subcontractor on Order'))
|
||
|
warehouses_dropship = self.filtered(lambda w: w.subcontracting_dropshipping_to_resupply and w.active)
|
||
|
if warehouses_dropship:
|
||
|
self.env['stock.rule'].with_context(active_test=False).search([
|
||
|
('route_id', '=', route_id.id),
|
||
|
('action', '=', 'pull'),
|
||
|
('warehouse_id', 'in', warehouses_dropship.ids),
|
||
|
('location_src_id', 'in', subcontracting_locations.ids)]).action_unarchive()
|
||
|
|
||
|
warehouses_no_dropship = self - warehouses_dropship
|
||
|
if warehouses_no_dropship:
|
||
|
self.env['stock.rule'].search([
|
||
|
('route_id', '=', route_id.id),
|
||
|
('action', '=', 'pull'),
|
||
|
('warehouse_id', 'in', warehouses_no_dropship.ids),
|
||
|
('location_src_id', 'in', subcontracting_locations.ids)]).action_archive()
|
||
|
|
||
|
def update_global_route_dropship_subcontractor(self):
|
||
|
route_id = self._find_global_route('mrp_subcontracting_dropshipping.route_subcontracting_dropshipping',
|
||
|
_('Dropship Subcontractor on Order'))
|
||
|
# if route has no pull rules, it means all warehouses have Dropship Subcontractor disabled
|
||
|
# Pick type is per company so we need to check rules per company to archive it, however
|
||
|
# the route is global so we need to check all rules regardless of company
|
||
|
all_rules = route_id.sudo().rule_ids.filtered(lambda r: r.active)
|
||
|
for company in self.company_id:
|
||
|
company_rules = all_rules.filtered(lambda r: r.company_id == company)
|
||
|
company.dropship_subcontractor_pick_type_id.active = bool(company_rules.filtered(lambda r: r.action == 'pull'))
|
||
|
|
||
|
route_id.active = bool(all_rules.filtered(lambda r: r.action == 'pull'))
|
||
|
|
||
|
def _generate_global_route_rules_values(self):
|
||
|
rules = super()._generate_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'), raise_if_not_found=False).id,
|
||
|
'name': self._format_rulename(subcontract_location_id, production_location_id, False),
|
||
|
'location_dest_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
|