diff --git a/jikimo_purchase_request/models/__init__.py b/jikimo_purchase_request/models/__init__.py index 1c32c33a..ce8d8227 100644 --- a/jikimo_purchase_request/models/__init__.py +++ b/jikimo_purchase_request/models/__init__.py @@ -1,2 +1,3 @@ # -*- coding: utf-8 -*- -from . import product_template \ No newline at end of file +from . import product_template +from . import purchase_request \ No newline at end of file diff --git a/jikimo_purchase_request/models/product_template.py b/jikimo_purchase_request/models/product_template.py index e6e96f10..623c0981 100644 --- a/jikimo_purchase_request/models/product_template.py +++ b/jikimo_purchase_request/models/product_template.py @@ -1,5 +1,6 @@ from odoo import models, fields + class ProductTemplate(models.Model): _inherit = 'product.template' @@ -7,11 +8,12 @@ class ProductTemplate(models.Model): def no_bom_product_create(self, product_id, item, order_id, route_type, i, finish_product): """ 创建坯料时,复制采购申请 """ - template_id = super(ProductTemplate, self).no_bom_product_create(product_id, item, order_id, route_type, i, finish_product) + template_id = super(ProductTemplate, self).no_bom_product_create(product_id, item, order_id, route_type, i, + finish_product) template_id.purchase_request = product_id.purchase_request return template_id def copy_template(self, product_template_id): """ 复制成品模板时,复制采购申请 """ super(ProductTemplate, self).copy_template(product_template_id) - self.purchase_request = product_template_id.purchase_request \ No newline at end of file + self.purchase_request = product_template_id.purchase_request diff --git a/jikimo_purchase_request/models/purchase_request.py b/jikimo_purchase_request/models/purchase_request.py new file mode 100644 index 00000000..95dd6f94 --- /dev/null +++ b/jikimo_purchase_request/models/purchase_request.py @@ -0,0 +1,14 @@ +from odoo import models, fields + + +class PurchaseRequest(models.Model): + _inherit = 'purchase.request' + _description = '采购申请' + + # 为state添加取消状态 + state = fields.Selection(selection_add=[('cancel', '已取消')]) + + +class PurchaseRequestLine(models.Model): + _inherit = 'purchase.request.line' + _description = '采购申请明细' diff --git a/sf_manufacturing/models/sale_order.py b/sf_manufacturing/models/sale_order.py index baf2740c..d9e6bd86 100644 --- a/sf_manufacturing/models/sale_order.py +++ b/sf_manufacturing/models/sale_order.py @@ -5,6 +5,7 @@ from odoo.exceptions import UserError _logger = logging.getLogger(__name__) + class SaleOrder(models.Model): _inherit = 'sale.order' @@ -39,13 +40,16 @@ class SaleOrder(models.Model): product_template_id = self.env.ref('sf_dlm.product_template_sf').sudo().product_tmpl_id elif line.supply_method == 'outsourcing': bom_type = 'subcontract' - product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_outsourcing').sudo() + product_template_id = self.env.ref( + 'jikimo_sale_multiple_supply_methods.product_template_outsourcing').sudo() elif line.supply_method == 'purchase': - product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_purchase').sudo() + product_template_id = self.env.ref( + 'jikimo_sale_multiple_supply_methods.product_template_purchase').sudo() elif line.supply_method == 'manual': bom_type = 'normal' - product_template_id = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_manual_processing').sudo() - + product_template_id = self.env.ref( + 'jikimo_sale_multiple_supply_methods.product_template_manual_processing').sudo() + # 复制成品模板上的属性 line.product_id.product_tmpl_id.copy_template(product_template_id) # 将模板上的single_manufacturing属性复制到成品上 @@ -70,13 +74,15 @@ class SaleOrder(models.Model): bom_data = self.env['mrp.bom'].with_user(self.env.ref("base.user_admin")).get_bom(product) _logger.info('bom_data:%s' % bom_data) if bom_data: - bom = self.env['mrp.bom'].with_user(self.env.ref("base.user_admin")).bom_create(product, 'normal', False) + bom = self.env['mrp.bom'].with_user(self.env.ref("base.user_admin")).bom_create(product, 'normal', + False) bom.with_user(self.env.ref("base.user_admin")).bom_create_line_has(bom_data) else: - # 当成品上带有客供料选项时,生成坯料时选择“客供料”路线 + # 当成品上带有客供料选项时,生成坯料时选择“客供料”路线 if line.embryo_redundancy_id: # 将成品模板的内容复制到成品上 - customer_provided_embryo = self.env.ref('jikimo_sale_multiple_supply_methods.product_template_embryo_customer_provided').sudo() + customer_provided_embryo = self.env.ref( + 'jikimo_sale_multiple_supply_methods.product_template_embryo_customer_provided').sudo() # 创建坯料,客供料的批量不需要创建bom material_customer_provided_embryo = self.env['product.template'].sudo().no_bom_product_create( customer_provided_embryo.with_context(active_test=False).product_variant_id, @@ -86,7 +92,8 @@ class SaleOrder(models.Model): product_bom_material_customer_provided = self.env['mrp.bom'].with_user( self.env.ref("base.user_admin")).bom_create( product, bom_type, 'product') - product_bom_material_customer_provided.with_user(self.env.ref("base.user_admin")).bom_create_line_has( + product_bom_material_customer_provided.with_user( + self.env.ref("base.user_admin")).bom_create_line_has( material_customer_provided_embryo) elif line.product_id.materials_type_id.gain_way == '自加工': self_machining_id = self.env.ref('sf_dlm.product_embryo_sf_self_machining').sudo() @@ -115,10 +122,11 @@ class SaleOrder(models.Model): outsource_id = self.env.ref('sf_dlm.product_embryo_sf_outsource').sudo() # 创建坯料 outsource_embryo = self.env['product.template'].sudo().no_bom_product_create(outsource_id, - item, - order_id, - 'subcontract', - product_seria, product) + item, + order_id, + 'subcontract', + product_seria, + product) if outsource_embryo == -3: raise UserError('该订单模型的材料型号暂未设置获取方式和供应商,请先配置再进行分配') # 创建坯料的bom @@ -138,10 +146,11 @@ class SaleOrder(models.Model): elif line.product_id.materials_type_id.gain_way == '采购': purchase_id = self.env.ref('sf_dlm.product_embryo_sf_purchase').sudo() purchase_embryo = self.env['product.template'].sudo().no_bom_product_create(purchase_id, - item, - order_id, - 'purchase', product_seria, - product) + item, + order_id, + 'purchase', + product_seria, + product) if purchase_embryo == -3: raise UserError('该订单模型的材料型号暂未设置获取方式和供应商,请先配置再进行分配') else: @@ -151,15 +160,15 @@ class SaleOrder(models.Model): product_bom_purchase.with_user(self.env.ref("base.user_admin")).bom_create_line_has( purchase_embryo) return super(SaleOrder, self).action_confirm() - + def action_show_cancel_wizard(self): wizard = self.env['sf.sale.order.cancel.wizard'].create({ 'order_id': self.id, }) - + # 创建关联单据行 self.env['sf.sale.order.cancel.line'].create_from_order(wizard.id, self) - + return { 'name': '取消销售订单', 'type': 'ir.actions.act_window', @@ -169,6 +178,7 @@ class SaleOrder(models.Model): 'res_id': wizard.id, } + class SaleOrderLine(models.Model): _inherit = 'sale.order.line' part_number = fields.Char('零件图号', related='product_id.part_number', readonly=True) diff --git a/sf_manufacturing/wizard/sale_order_cancel.py b/sf_manufacturing/wizard/sale_order_cancel.py index 08938c10..4e839289 100644 --- a/sf_manufacturing/wizard/sale_order_cancel.py +++ b/sf_manufacturing/wizard/sale_order_cancel.py @@ -72,6 +72,20 @@ class SFSaleOrderCancelWizard(models.TransientModel): if purchase_orders: purchase_orders.write({'state': 'cancel'}) + # 取消销售订单关联的采购申请明细 + purchase_request_lines = self.env['purchase.request.line'].search([ + ('origin', '=', self.order_id.name) + ]) + if purchase_request_lines: + purchase_request_lines.write({'state': 'cancel'}) + + # 取消销售订单关联的采购申请 + purchase_requests = self.env['purchase.request'].search([ + ('origin', '=', self.order_id.name) + ]) + if purchase_requests: + purchase_requests.write({'state': 'cancel'}) + # 取消销售订单 result = self.order_id.action_cancel() @@ -444,6 +458,28 @@ class SFSaleOrderCancelLine(models.TransientModel): } lines.append(self.create(vals)) + # 检查采购申请明细 + purchase_request_lines = self.env['purchase.request.line'].search([ + ('origin', '=', order.name) + ]) + if purchase_request_lines: + prl_count = 0 + for purchase_request_line in purchase_request_lines: + prl_count += 1 + vals = { + 'wizard_id': wizard_id, + 'sequence': sequence, + 'category': module_name_dict[purchase_request_line._original_module], + 'doc_name': purchase_request_line._description, + 'doc_number': purchase_request_line.name, + 'line_number': prl_count, + 'product_name': f'[{purchase_request_line.product_id.default_code}] {purchase_request_line.product_id.name}', + 'quantity': purchase_request_line.product_qty, + 'doc_state': map_dict.get(purchase_request_line.state, purchase_request_line.state), + 'cancel_reason': '已有异动' if purchase_request_line.state not in ['draft', 'cancel'] else '' + } + lines.append(self.create(vals)) + # 检查制造订单 manufacturing_orders = self.env['mrp.production'].search([ ('origin', '=', order.name)