# Copyright 2021-2024 Criptomart # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) from odoo import api, models, fields from odoo.exceptions import ValidationError import logging _logger = logging.getLogger(__name__) class PickingType(models.Model): _inherit = 'stock.picking.type' is_deposit = fields.Boolean( string='Depósito', help='Los albaranes creados con éste tipo son depósitos, no son compras/ventas finales.', default= False, ) class Picking(models.Model): _inherit = 'stock.picking' @api.model_create_multi def create(self, vals_list): for vals in vals_list: vals = self.create_single(vals) return super().create(vals_list) def create_single(self, vals): if vals.get('picking_type_id'): picking_type = self.env['stock.picking.type'].browse(vals.get('picking_type_id')) if picking_type.is_deposit: self.change_dest_location(vals, picking_type.code) return vals def write(self, vals): if vals.get("picking_type_id"): picking_type = self.env["stock.picking.type"].browse(vals.get("picking_type_id")) if picking_type.is_deposit: self.change_dest_location(vals, picking_type.code) return super().write(vals) @api.onchange("partner_id") def onchange_partner_id(self): #super().onchange_partner_id() for picking in self: if not picking.partner_id: return _logger.debug("onchange %s %s", picking.location_dest_id.name, picking.location_id.name) # web client does not update without this, wtf? if picking.picking_type_id.is_deposit: if picking.picking_type_id.code in ["internal"]: if not picking.partner_id.deposit_sale_accept: raise ValidationError("Éste cliente no acepta material en depósito, configúralo antes de crear un depósito para él.") return picking.location_id = picking.partner_id.deposit_sale_location_id.id, moves = picking.env["stock.move"].search([("picking_id", "=", picking.id)]) for move in moves: move.write({"partner_id": picking.partner_id.id}, {"location_id": picking.location_id}) elif picking.picking_type_id.code == "incoming": if not picking.partner_id.deposit_buy_accept: raise ValidationError("Éste proveedor no suministra material en depósito, configúralo antes de crear un depósito para él.") return picking.location_dest_id = picking.partner_id.deposit_buy_location_id.id moves = picking.env["stock.move"].search([("picking_id", "=", picking.id)]) for move in moves: move.write({"partner_id": picking.partner_id.id}, {"location_dest_id": picking.location_dest_id}) def change_dest_location(self, vals, code): if vals.get("partner_id"): partner = self.env["res.partner"].browse(vals.get("partner_id")) if code in ["internal"]: if not partner.deposit_sale_accept: raise ValidationError("Éste cliente no acepta material en depósito, configúralo antes de crear un depósito para él.") return vals.update({ "location_id": partner.deposit_sale_location_id.id, }) elif code == 'incoming': if not partner.deposit_buy_accept: raise ValidationError("Éste proveedor no suministra material en depósito, configúralo antes de crear un depósito para él.") return vals.update({ "location_dest_id": partner.deposit_buy_location_id.id, })