purchase_requisition/wizard/purchase_requisition_create_alternative.py

94 lines
4.5 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import _, api, fields, models, Command
from odoo.exceptions import UserError
class PurchaseRequisitionCreateAlternative(models.TransientModel):
_name = 'purchase.requisition.create.alternative'
_description = 'Wizard to preset values for alternative PO'
origin_po_id = fields.Many2one(
'purchase.order', help="The original PO that this alternative PO is being created for."
)
partner_id = fields.Many2one(
'res.partner', string='Vendor', required=True,
help="Choose a vendor for alternative PO")
creation_blocked = fields.Boolean(
help="If the chosen vendor or if any of the products in the original PO have a blocking warning then we prevent creation of alternative PO. "
"This is because normally these fields are cleared w/warning message within form view, but we cannot recreate that in this case.",
compute="_compute_purchase_warn",
groups="purchase.group_warning_purchase")
purchase_warn_msg = fields.Text(
'Warning Messages',
compute="_compute_purchase_warn",
groups="purchase.group_warning_purchase")
copy_products = fields.Boolean(
"Copy Products", default=True,
help="If this is checked, the product quantities of the original PO will be copied")
@api.depends('partner_id', 'copy_products')
def _compute_purchase_warn(self):
self.creation_blocked = False
self.purchase_warn_msg = ''
# follows partner warning logic from PurchaseOrder
if not self.env.user.has_group('purchase.group_warning_purchase'):
return
partner = self.partner_id
# If partner has no warning, check its company
if partner and partner.purchase_warn == 'no-message':
partner = partner.parent_id
if partner and partner.purchase_warn != 'no-message':
self.purchase_warn_msg = _("Warning for %(partner)s:\n%(warning_message)s\n", partner=partner.name, warning_message=partner.purchase_warn_msg)
if partner.purchase_warn == 'block':
self.creation_blocked = True
self.purchase_warn_msg += _("This is a blocking warning!\n")
if self.copy_products and self.origin_po_id.order_line:
for line in self.origin_po_id.order_line:
if line.product_id.purchase_line_warn != 'no-message':
self.purchase_warn_msg += _("Warning for %(product)s:\n%(warning_message)s\n", product=line.product_id.name, warning_message=line.product_id.purchase_line_warn_msg)
if line.product_id.purchase_line_warn == 'block':
self.creation_blocked = True
self.purchase_warn_msg += _("This is a blocking warning!\n")
def action_create_alternative(self):
if self.env.user.has_group('purchase.group_warning_purchase') and self.creation_blocked:
raise UserError(
_('The vendor you have selected or at least one of the products you are copying from the original '
'order has a blocking warning on it and cannot be selected to create an alternative.')
)
vals = self._get_alternative_values()
alt_po = self.env['purchase.order'].with_context(origin_po_id=self.origin_po_id.id, default_requisition_id=False).create(vals)
return {
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': 'purchase.order',
'res_id': alt_po.id,
'context': {
'active_id': alt_po.id,
},
}
def _get_alternative_values(self):
vals = {
'date_order': self.origin_po_id.date_order,
'partner_id': self.partner_id.id,
'user_id': self.origin_po_id.user_id.id,
'dest_address_id': self.origin_po_id.dest_address_id.id,
'origin': self.origin_po_id.origin,
}
if self.copy_products and self.origin_po_id:
vals['order_line'] = [Command.create(self._get_alternative_line_value(line)) for line in self.origin_po_id.order_line]
return vals
@api.model
def _get_alternative_line_value(self, order_line):
return {
'product_id': order_line.product_id.id,
'product_qty': order_line.product_qty,
'product_uom': order_line.product_uom.id,
'display_type': order_line.display_type,
'name': order_line.name,
}