arregla el depósito de entrada, no probado con salida, pero debería

funcionar igual. Cambia el location dst en el onchange partner_id. También
se asegura que si se han creado stock moves se cambie su location dst.
El create y el write  no sé si son necesarios, a lo mejor para
importaciones, duplicados y así. El escribir el stock location
directamnete no es muy elegante, lo suyo sería sobreescribir el
onchange_partner_id de stock.move y dejar que se enargue de location dst
ahí.
This commit is contained in:
snt 2024-09-12 21:43:10 +02:00
parent 492c8c6025
commit 4b27d29d53

View file

@ -1,53 +1,72 @@
# Copyright 2021-2024 Criptomart # Copyright 2021-2024 Criptomart
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
import logging
from odoo import api, models, fields from odoo import api, models, fields
from odoo.exceptions import ValidationError from odoo.exceptions import ValidationError
_logger = logging.getLogger(__name__)
class PickingType(models.Model): class PickingType(models.Model):
_inherit = 'stock.picking.type' _inherit = 'stock.picking.type'
is_deposit = fields.Boolean( is_deposit = fields.Boolean(
string='Depósito', string='Depósito',
help='Éste albarán es un depósito, no es una venta final.', help='Los albaranes creados con éste tipo son depósitos, no son compras/ventas finales.',
default= False, default= False,
) )
class Picking(models.Model): class Picking(models.Model):
_inherit = 'stock.picking' _inherit = 'stock.picking'
@api.model @api.model
def create(self, vals): def create(self, vals):
pick = super().create(vals) if vals.get('picking_type_id'):
if pick.picking_type_id.is_deposit: picking_type = self.env['stock.picking.type'].browse(vals.get('picking_type_id'))
pick.change_dest_location() if picking_type.is_deposit:
return pick self.change_dest_location(vals, picking_type.code)
return super().create(vals)
@api.onchange("partner_id") 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): def onchange_partner_id(self):
if self.partner_id and self.picking_type_id.is_deposit: for picking in self:
if self.picking_type_id.code == 'internal': if not self.partner_id:
self.location_dest_id = self.partner_id.deposit_sale_location_id return
elif self.picking_type_id.code == 'incoming': if self.picking_type_id.is_deposit:
self.location_dest_id = self.partner_id.deposit_buy_location_id
_logger.warning("location id: %s %s", self.location_dest_id, self.partner_id.deposit_sale_location_id)
def change_dest_location(self):
if self.picking_type_id.code == 'internal': if self.picking_type_id.code == 'internal':
if not self.partner_id.deposit_sale_accept: if not self.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.") raise ValidationError("Éste cliente no acepta material en depósito, configúralo antes de crear un depósito para él.")
return return
self.update({ self.location_dest_id = self.partner_id.deposit_sale_location_id.id,
'location_dest_id': self.partner_id.deposit_sale_location_id.id,
})
elif self.picking_type_id.code == 'incoming': elif self.picking_type_id.code == 'incoming':
if not self.partner_id.deposit_buy_accept: if not self.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.") raise ValidationError("Éste proveedor no suministra material en depósito, configúralo antes de crear un depósito para él.")
return return
self.update({ self.location_dest_id = self.partner_id.deposit_buy_location_id.id
'location_dest_id': self.partner_id.deposit_buy_location_id.id, moves = self.env['stock.move'].search([('picking_id', '=', self.id)])
for move in moves:
move.write({'partner_id': self.partner_id.id}, {'location_dest_id': self.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,
}) })