obook/stock_picking_deposito/models/stock_picking.py
2024-09-18 17:22:12 +02:00

79 lines
3.7 KiB
Python

# 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
def create(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().create(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 cliebt does not update without this, wtf?
if picking.picking_type_id.is_deposit:
if picking.picking_type_id.code in ["internal","outgoing"]:
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 == "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_dest_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,
})