79 lines
3.4 KiB
Python
79 lines
3.4 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
from odoo import api, fields, models
|
||
|
from odoo.tools.float_utils import float_compare
|
||
|
|
||
|
|
||
|
class StockBackorderConfirmationLine(models.TransientModel):
|
||
|
_name = 'stock.backorder.confirmation.line'
|
||
|
_description = 'Backorder Confirmation Line'
|
||
|
|
||
|
backorder_confirmation_id = fields.Many2one('stock.backorder.confirmation', 'Immediate Transfer')
|
||
|
picking_id = fields.Many2one('stock.picking', 'Transfer')
|
||
|
to_backorder = fields.Boolean('To Backorder')
|
||
|
|
||
|
|
||
|
class StockBackorderConfirmation(models.TransientModel):
|
||
|
_name = 'stock.backorder.confirmation'
|
||
|
_description = 'Backorder Confirmation'
|
||
|
|
||
|
pick_ids = fields.Many2many('stock.picking', 'stock_picking_backorder_rel')
|
||
|
show_transfers = fields.Boolean()
|
||
|
backorder_confirmation_line_ids = fields.One2many(
|
||
|
'stock.backorder.confirmation.line',
|
||
|
'backorder_confirmation_id',
|
||
|
string="Backorder Confirmation Lines")
|
||
|
|
||
|
@api.model
|
||
|
def default_get(self, fields):
|
||
|
res = super().default_get(fields)
|
||
|
if 'backorder_confirmation_line_ids' in fields and res.get('pick_ids'):
|
||
|
res['backorder_confirmation_line_ids'] = [
|
||
|
(0, 0, {'to_backorder': True, 'picking_id': pick_id})
|
||
|
for pick_id in res['pick_ids'][0][2]
|
||
|
]
|
||
|
# default_get returns x2m values as [(6, 0, ids)]
|
||
|
# because of webclient limitations
|
||
|
return res
|
||
|
|
||
|
def _check_less_quantities_than_expected(self, pickings):
|
||
|
for pick_id in pickings:
|
||
|
moves_to_log = {}
|
||
|
for move in pick_id.move_ids:
|
||
|
picked_qty = move._get_picked_quantity()
|
||
|
if float_compare(move.product_uom_qty,
|
||
|
picked_qty,
|
||
|
precision_rounding=move.product_uom.rounding) > 0:
|
||
|
moves_to_log[move] = (picked_qty, move.product_uom_qty)
|
||
|
if moves_to_log:
|
||
|
pick_id._log_less_quantities_than_expected(moves_to_log)
|
||
|
|
||
|
def process(self):
|
||
|
pickings_to_do = self.env['stock.picking']
|
||
|
pickings_not_to_do = self.env['stock.picking']
|
||
|
for line in self.backorder_confirmation_line_ids:
|
||
|
if line.to_backorder is True:
|
||
|
pickings_to_do |= line.picking_id
|
||
|
else:
|
||
|
pickings_not_to_do |= line.picking_id
|
||
|
|
||
|
pickings_to_validate = self.env.context.get('button_validate_picking_ids')
|
||
|
if pickings_to_validate:
|
||
|
pickings_to_validate = self.env['stock.picking'].browse(pickings_to_validate).with_context(skip_backorder=True)
|
||
|
if pickings_not_to_do:
|
||
|
self._check_less_quantities_than_expected(pickings_not_to_do)
|
||
|
pickings_to_validate = pickings_to_validate.with_context(picking_ids_not_to_backorder=pickings_not_to_do.ids)
|
||
|
return pickings_to_validate.button_validate()
|
||
|
return True
|
||
|
|
||
|
def process_cancel_backorder(self):
|
||
|
pickings_to_validate_ids = self.env.context.get('button_validate_picking_ids')
|
||
|
if pickings_to_validate_ids:
|
||
|
pickings_to_validate = self.env['stock.picking'].browse(pickings_to_validate_ids)
|
||
|
self._check_less_quantities_than_expected(pickings_to_validate)
|
||
|
return pickings_to_validate\
|
||
|
.with_context(skip_backorder=True, picking_ids_not_to_backorder=self.pick_ids.ids)\
|
||
|
.button_validate()
|
||
|
return True
|