diff --git a/sf_demand_plan/models/purchase_order.py b/sf_demand_plan/models/purchase_order.py index 5bc07313..b9802866 100644 --- a/sf_demand_plan/models/purchase_order.py +++ b/sf_demand_plan/models/purchase_order.py @@ -5,38 +5,42 @@ from odoo.tools import float_compare class PurchaseOrder(models.Model): _inherit = 'purchase.order' - demand_plan_line_id = fields.Many2one(comodel_name="sf.production.demand.plan", - string="需求计划明细", readonly=True) - def button_confirm(self): - if self.demand_plan_line_id: + if self.order_line[0].demand_plan_line_id: self = self.with_context( - demand_plan_line_id=self.demand_plan_line_id.id + demand_plan_line_id=self.order_line[0].demand_plan_line_id.id ) res = super(PurchaseOrder, self).button_confirm() return res - @api.depends('origin', 'demand_plan_line_id') + @api.depends('origin') def _compute_purchase_type(self): for purchase in self: if purchase.order_line[0].product_id.categ_id.name == '坯料': if purchase.order_line[0].product_id.materials_type_id.gain_way == '外协': purchase.purchase_type = 'outsourcing' else: - if purchase.demand_plan_line_id.supply_method == 'outsourcing': + if purchase.order_line[0].demand_plan_line_id.supply_method == 'outsourcing': purchase.purchase_type = 'outsourcing' - elif purchase.demand_plan_line_id.supply_method == 'purchase': + elif purchase.order_line[0].demand_plan_line_id.supply_method == 'purchase': purchase.purchase_type = 'outside' + +class PurchaseOrderLine(models.Model): + _inherit = 'purchase.order.line' + + demand_plan_line_id = fields.Many2one(comodel_name="sf.production.demand.plan", + string="需求计划明细", readonly=True) + @api.model def create(self, vals): - res = super(PurchaseOrder, self).create(vals) + res = super(PurchaseOrderLine, self).create(vals) if not res.demand_plan_line_id: - origin = [origin.replace(' ', '') for origin in res.origin.split(',')] + origin = [origin.replace(' ', '') for origin in res.order_id.origin.split(',')] if self.env.context.get('demand_plan_line_id'): res.demand_plan_line_id = self.env.context.get('demand_plan_line_id') - elif 'MO' in res.origin: + elif 'MO' in res.order_id.origin: # 原单据是制造订单 mp_ids = self.env['mrp.production'].sudo().search([('name', 'in', origin)]) if mp_ids: diff --git a/sf_demand_plan/models/purchase_request.py b/sf_demand_plan/models/purchase_request.py index 9cb15518..d1539976 100644 --- a/sf_demand_plan/models/purchase_request.py +++ b/sf_demand_plan/models/purchase_request.py @@ -28,83 +28,8 @@ class PurchaseRequestLine(models.Model): class PurchaseRequestLineMakePurchaseOrder(models.TransientModel): _inherit = "purchase.request.line.make.purchase.order" - def make_purchase_order(self): - res = [] - purchase_obj = self.env["purchase.order"] - po_line_obj = self.env["purchase.order.line"] - purchase = False - - if len(set([item_id.line_id.supply_method for item_id in self.item_ids])) > 1: - raise ValidationError('不同供货方式不可合并创建询价单!') - - for item in self.item_ids: - line = item.line_id - if item.product_qty <= 0.0: - raise UserError(_("Enter a positive quantity.")) - if self.purchase_order_id: - purchase = self.purchase_order_id - if not purchase: - po_data = self._prepare_purchase_order( - line.request_id.picking_type_id, - line.request_id.group_id, - line.company_id, - line.request_id.origin, - ) - po_data['demand_plan_line_id'] = item.line_id.demand_plan_line_id.id - # po_data.update({'related_product':line.related_product.id}) - purchase = purchase_obj.create(po_data) - - # Look for any other PO line in the selected PO with same - # product and UoM to sum quantities instead of creating a new - # po line - domain = self._get_order_line_search_domain(purchase, item) - available_po_lines = po_line_obj.search(domain) - new_pr_line = True - # If Unit of Measure is not set, update from wizard. - if not line.product_uom_id: - line.product_uom_id = item.product_uom_id - # Allocation UoM has to be the same as PR line UoM - alloc_uom = line.product_uom_id - wizard_uom = item.product_uom_id - if available_po_lines and not item.keep_description: - new_pr_line = False - po_line = available_po_lines[0] - po_line.purchase_request_lines = [(4, line.id)] - po_line.move_dest_ids |= line.move_dest_ids - po_line_product_uom_qty = po_line.product_uom._compute_quantity( - po_line.product_uom_qty, alloc_uom - ) - wizard_product_uom_qty = wizard_uom._compute_quantity( - item.product_qty, alloc_uom - ) - all_qty = min(po_line_product_uom_qty, wizard_product_uom_qty) - self.create_allocation(po_line, line, all_qty, alloc_uom) - else: - po_line_data = self._prepare_purchase_order_line(purchase, item) - if item.keep_description: - po_line_data["name"] = item.name - if line.related_product: - po_line_data.update({'related_product': line.related_product.id}) - po_line = po_line_obj.create(po_line_data) - po_line_product_uom_qty = po_line.product_uom._compute_quantity( - po_line.product_uom_qty, alloc_uom - ) - wizard_product_uom_qty = wizard_uom._compute_quantity( - item.product_qty, alloc_uom - ) - all_qty = min(po_line_product_uom_qty, wizard_product_uom_qty) - self.create_allocation(po_line, line, all_qty, alloc_uom) - self._post_process_po_line(item, po_line, new_pr_line) - res.append(purchase.id) - - purchase_requests = self.item_ids.mapped("request_id") - purchase_requests.button_in_progress() - return { - "domain": [("id", "in", res)], - "name": _("RFQ"), - "view_mode": "tree,form", - "res_model": "purchase.order", - "view_id": False, - "context": False, - "type": "ir.actions.act_window", - } + @api.model + def _prepare_purchase_order_line(self, po, item): + ret = super(PurchaseRequestLineMakePurchaseOrder, self)._prepare_purchase_order_line(po, item) + ret['demand_plan_line_id'] = item.line_id.demand_plan_line_id.id + return ret diff --git a/sf_demand_plan/models/sf_demand_plan.py b/sf_demand_plan/models/sf_demand_plan.py index 83e890af..864f8002 100644 --- a/sf_demand_plan/models/sf_demand_plan.py +++ b/sf_demand_plan/models/sf_demand_plan.py @@ -184,6 +184,16 @@ class SfDemandPlan(models.Model): lambda p: p.status in ('50', '60') and p.new_supply_method == 'custom_made') line.readonly_custom_made_type = bool(production_demand_plan) + def write(self, vals): + res = super(SfDemandPlan, self).write(vals) + if 'line_ids' in vals: + for line in self.line_ids: + if not line.sale_order_id: + line.sale_order_id = self.sale_order_id + if not line.sale_order_line_id: + line.sale_order_line_id = self.sale_order_line_id + return res + def name_get(self): result = [] for plan in self: