1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/stock_barcode/models/stock_move_line.py
2024-12-10 09:04:09 +07:00

101 lines
4.3 KiB
Python

# -*- coding: utf-8 -*-
from odoo import api, fields, models
from odoo.tools import frozendict
class StockMoveLine(models.Model):
_inherit = 'stock.move.line'
product_barcode = fields.Char(related='product_id.barcode')
location_processed = fields.Boolean()
dummy_id = fields.Char(compute='_compute_dummy_id', inverse='_inverse_dummy_id')
parent_location_id = fields.Many2one('stock.location', compute='_compute_parent_location_id')
parent_location_dest_id = fields.Many2one('stock.location', compute='_compute_parent_location_id')
product_stock_quant_ids = fields.One2many('stock.quant', compute='_compute_product_stock_quant_ids')
product_packaging_id = fields.Many2one(related='move_id.product_packaging_id')
product_packaging_uom_qty = fields.Float('Packaging Quantity', compute='_compute_product_packaging_uom_qty', help="Quantity of the Packaging in the UoM of the Stock Move Line.")
hide_lot_name = fields.Boolean(compute='_compute_hide_lot_name')
hide_lot = fields.Boolean(compute='_compute_hide_lot_name')
image_1920 = fields.Image(related="product_id.image_1920")
product_reference_code = fields.Char(related="product_id.code", string="Product Reference Code")
qty_done = fields.Float(compute='_compute_qty_done', inverse='_inverse_qty_done') # Dummy field
@api.depends('tracking', 'picking_type_use_existing_lots', 'picking_type_use_create_lots', 'lot_name')
def _compute_hide_lot_name(self):
for line in self:
if line.tracking == 'none':
line.hide_lot_name = True
line.hide_lot = True
continue
line.hide_lot_name = not line.picking_type_use_create_lots or (line.picking_type_use_existing_lots and not line.lot_name)
line.hide_lot = not line.picking_type_use_existing_lots or (line.picking_type_use_create_lots and line.lot_name)
@api.depends('picking_id')
def _compute_parent_location_id(self):
for line in self:
line.parent_location_id = line.picking_id.location_id
line.parent_location_dest_id = line.picking_id.location_dest_id
def _compute_product_stock_quant_ids(self):
for line in self:
line.product_stock_quant_ids = line.product_id.stock_quant_ids.filtered(lambda q: q.company_id in self.env.companies and q.location_id.usage == 'internal')
def _compute_dummy_id(self):
self.dummy_id = ''
def _compute_qty_done(self):
for line in self:
line.qty_done = line.quantity if line.picked else 0
def _compute_product_packaging_uom_qty(self):
for sml in self:
sml.product_packaging_uom_qty = sml.product_packaging_id.product_uom_id._compute_quantity(sml.product_packaging_id.qty, sml.product_uom_id)
def _inverse_dummy_id(self):
pass
def _inverse_qty_done(self):
for line in self:
line.quantity = line.qty_done
line.picked = line.quantity > 0
@api.model_create_multi
def create(self, vals_list):
for vals in vals_list:
# To avoid a write on `quantity` at the creation of the record (in the `qty_done`
# inverse, when the line's move is not created yet), we set the `quantity` directly at
# the creation and remove `qty_done` in the meantime.
if 'qty_done' in vals:
vals['quantity'] = vals['qty_done']
vals['picked'] = vals['qty_done'] > 0
del vals['qty_done']
# Also delete the default value in the context.
self.env.context = frozendict({k: v for k, v in self.env.context.items() if k != 'default_qty_done'})
return super().create(vals_list)
def _get_fields_stock_barcode(self):
return [
'product_id',
'product_category_name',
'location_id',
'location_dest_id',
'move_id',
'qty_done',
'quantity',
'display_name',
'product_uom_id',
'product_barcode',
'owner_id',
'lot_id',
'lot_name',
'package_id',
'result_package_id',
'dummy_id',
'picked',
'product_packaging_id',
'product_packaging_uom_qty',
'move_id',
]