103 lines
4.1 KiB
Python
103 lines
4.1 KiB
Python
from odoo import models, fields, api
|
|
|
|
class SFSaleOrderCancelWizard(models.TransientModel):
|
|
_name = 'sf.sale.order.cancel.wizard'
|
|
_description = '销售订单取消向导'
|
|
|
|
order_id = fields.Many2one('sale.order', string='销售订单')
|
|
related_docs = fields.One2many('sf.sale.order.cancel.line', 'wizard_id', string='相关单据')
|
|
|
|
@api.model
|
|
def default_get(self, fields_list):
|
|
defaults = super().default_get(fields_list)
|
|
if self._context.get('active_id'):
|
|
order = self.env['sale.order'].browse(self._context.get('active_id'))
|
|
defaults['order_id'] = order.id
|
|
# 创建向导时自动创建关联单据行
|
|
wizard = self.create(defaults)
|
|
self.env['sf.sale.order.cancel.line'].create_from_order(wizard.id, order)
|
|
defaults['related_docs'] = wizard.related_docs.ids
|
|
return defaults
|
|
|
|
def action_confirm_cancel(self):
|
|
self.ensure_one()
|
|
return self.order_id.action_cancel()
|
|
|
|
class SFSaleOrderCancelLine(models.TransientModel):
|
|
_name = 'sf.sale.order.cancel.line'
|
|
_description = '销售订单取消行'
|
|
|
|
wizard_id = fields.Many2one('sf.sale.order.cancel.wizard')
|
|
sequence = fields.Integer('序号')
|
|
category = fields.Char('大类')
|
|
doc_name = fields.Char('单据名称')
|
|
operation_type = fields.Char('作业类型')
|
|
doc_number = fields.Char('单据编号')
|
|
line_number = fields.Char('行号')
|
|
product_name = fields.Char('产品名称')
|
|
quantity = fields.Float('数量')
|
|
doc_state = fields.Char('单据状态')
|
|
cancel_reason = fields.Char('禁止取消原因')
|
|
|
|
@api.model
|
|
def create_from_order(self, wizard_id, order):
|
|
sequence = 1
|
|
lines = []
|
|
|
|
# 检查销售订单
|
|
if order.invoice_ids:
|
|
for invoice in order.invoice_ids:
|
|
vals = {
|
|
'wizard_id': wizard_id,
|
|
'sequence': sequence,
|
|
'category': '销售',
|
|
'doc_name': '销售订单',
|
|
'operation_type': '销售',
|
|
'doc_number': invoice.name,
|
|
'product_name': invoice.product_id.name,
|
|
'quantity': invoice.quantity,
|
|
'doc_state': invoice.state,
|
|
'cancel_reason': '已有异动' if invoice.state != 'draft' else ''
|
|
}
|
|
lines.append(self.create(vals))
|
|
sequence += 1
|
|
|
|
# 检查交货单
|
|
if order.picking_ids:
|
|
for picking in order.picking_ids:
|
|
vals = {
|
|
'wizard_id': wizard_id,
|
|
'sequence': sequence,
|
|
'category': '库存',
|
|
'doc_name': '交货单',
|
|
'operation_type': '调拨',
|
|
'doc_number': picking.name,
|
|
'product_name': picking.product_id.name if picking.product_id else '',
|
|
'quantity': picking.product_qty if hasattr(picking, 'product_qty') else 0,
|
|
'doc_state': picking.state,
|
|
'cancel_reason': '已有异动' if picking.state not in ['draft', 'cancel', 'waiting'] else ''
|
|
}
|
|
lines.append(self.create(vals))
|
|
sequence += 1
|
|
|
|
# 检查制造订单
|
|
manufacturing_orders = self.env['mrp.production'].search([
|
|
('origin', '=', order.name)
|
|
])
|
|
for mo in manufacturing_orders:
|
|
vals = {
|
|
'wizard_id': wizard_id,
|
|
'sequence': sequence,
|
|
'category': '制造',
|
|
'doc_name': '制造订单',
|
|
'operation_type': '制造',
|
|
'doc_number': mo.name,
|
|
'product_name': mo.product_id.name,
|
|
'quantity': mo.product_qty,
|
|
'doc_state': mo.state,
|
|
'cancel_reason': '已有异动' if mo.state not in ['draft', 'cancel'] else ''
|
|
}
|
|
lines.append(self.create(vals))
|
|
sequence += 1
|
|
|
|
return lines |