You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.2 KiB
66 lines
2.2 KiB
# -*- coding: utf-8 -*-
|
|
from odoo import api, models
|
|
|
|
class PosOrder(models.Model):
|
|
_inherit = 'pos.order'
|
|
|
|
@api.model
|
|
def _process_order(self, order, draft, existing_order):
|
|
"""
|
|
Ensure lots are properly updated after POS order validation.
|
|
"""
|
|
# Call the original method
|
|
pos_order_id = super(PosOrder, self)._process_order(order, draft, existing_order)
|
|
|
|
# Make sure we have the record, not just an ID
|
|
pos_order = pos_order_id
|
|
if isinstance(pos_order_id, int):
|
|
pos_order = self.browse(pos_order_id)
|
|
|
|
# Now safely loop through order lines
|
|
for order_line in pos_order.lines:
|
|
if order_line.pack_lot_ids:
|
|
self._update_lot_stock(order_line)
|
|
|
|
return pos_order_id
|
|
|
|
def _update_lot_stock(self, order_line):
|
|
"""Deduct quantities from the correct lots when POS order is validated"""
|
|
product = order_line.product_id
|
|
pos_config = order_line.order_id.session_id.config_id
|
|
location_id = pos_config.picking_type_id.default_location_src_id.id
|
|
|
|
for pack_lot in order_line.pack_lot_ids:
|
|
lot = self.env['stock.lot'].search([
|
|
('name', '=', pack_lot.lot_name),
|
|
('product_id', '=', product.id)
|
|
], limit=1)
|
|
|
|
if not lot:
|
|
continue
|
|
|
|
# Get all quants for this lot at POS location
|
|
quants = self.env['stock.quant'].sudo().search([
|
|
('product_id', '=', product.id),
|
|
('lot_id', '=', lot.id),
|
|
('location_id', '=', location_id)
|
|
])
|
|
if not quants:
|
|
continue
|
|
|
|
qty_to_deduct = abs(order_line.qty) # ensure positive qty
|
|
|
|
for quant in quants:
|
|
if qty_to_deduct <= 0:
|
|
break
|
|
|
|
if quant.quantity >= qty_to_deduct:
|
|
quant.quantity -= qty_to_deduct
|
|
qty_to_deduct = 0
|
|
else:
|
|
qty_to_deduct -= quant.quantity
|
|
quant.quantity = 0
|
|
|
|
# Optional: mark as taken if fully used
|
|
remaining_qty = sum(quants.mapped('quantity'))
|
|
lot.is_taken = remaining_qty <= 0
|
|
|