65 lines
2.9 KiB
Python
65 lines
2.9 KiB
Python
from odoo import api, fields, models, _
|
||
from odoo.tools import float_compare
|
||
|
||
|
||
class PurchaseOrder(models.Model):
|
||
_inherit = 'purchase.order'
|
||
|
||
state = fields.Selection([
|
||
('draft', '询价'),
|
||
('sent', '发送询价'),
|
||
('to approve', '待批准'),
|
||
("approved", "已批准"),
|
||
('purchase', '采购订单'),
|
||
('done', '完成'),
|
||
('cancel', '取消'),
|
||
('rejected', '已驳回')
|
||
], string='Status', readonly=True, index=True, copy=False, default='draft', tracking=True)
|
||
|
||
|
||
def button_confirm(self):
|
||
res = super(PurchaseOrder, self).button_confirm()
|
||
# 取消反向调拨单
|
||
reverse_move_ids = self.env['stock.move'].search([
|
||
('origin', '=', self.name),
|
||
('purchase_line_id', '=', False),
|
||
('state', '!=', 'done')
|
||
])
|
||
if reverse_move_ids:
|
||
reverse_move_ids.picking_id.action_cancel()
|
||
return res
|
||
|
||
def button_cancel(self):
|
||
"""
|
||
1. 先将采购订单行与目标库存移动断开链接,避免采购单取消后,调拨单被调整为mts的问题
|
||
2. 取消采购订单
|
||
3. 将采购订单行与目标库存移动重新建立链接
|
||
"""
|
||
created_purchase_request_line_ids = {}
|
||
if self.order_line.move_dest_ids.created_purchase_request_line_id:
|
||
move_ids = self.order_line.move_dest_ids.filtered(lambda move: move.state != 'done' and not move.scrapped)
|
||
created_purchase_request_line_ids = {move.id: move.created_purchase_request_line_id for move in move_ids}
|
||
self.order_line.write({'move_dest_ids': [(5, 0, 0)]})
|
||
res =super(PurchaseOrder, self).button_cancel()
|
||
for move_id, created_purchase_request_line_id in created_purchase_request_line_ids.items():
|
||
self.env['stock.move'].browse(move_id).created_purchase_request_line_id = created_purchase_request_line_id
|
||
# if move_ids.mapped('created_purchase_request_line_id'):
|
||
# move_ids.write({'state': 'waiting', 'is_done': False})
|
||
return res
|
||
|
||
def write(self, vals):
|
||
res = super(PurchaseOrder, self).write(vals)
|
||
if 'state' in vals and vals['state'] == 'purchase':
|
||
purchase_request = self.order_line.purchase_request_lines.request_id
|
||
if purchase_request:
|
||
finished = True
|
||
# 判断该采购申请所有明细行是否都完成
|
||
for purchase_request_line in purchase_request.line_ids:
|
||
finished_qty = sum(purchase_request_line.purchase_lines.filtered(lambda line: line.state == 'purchase').mapped('product_qty'))
|
||
if float_compare(finished_qty ,purchase_request_line.product_qty, precision_rounding=purchase_request_line.product_id.uom_id.rounding) < 0:
|
||
finished = False
|
||
break
|
||
if finished:
|
||
purchase_request.button_done()
|
||
return res
|