75 lines
3.3 KiB
Python
75 lines
3.3 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):
|
|
for picking in self:
|
|
if not picking.partner_id:
|
|
return
|
|
_logger.debug("onchange %s", picking.location_dest_id.name)
|
|
if picking.picking_type_id.is_deposit:
|
|
if picking.picking_type_id.code == '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_dest_id = picking.partner_id.deposit_sale_location_id.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,
|
|
})
|