'name': self.pool.get('ir.sequence').get(cr, uid, 'purchase.order.requisition'),
})
return super(purchase_requisition, self).copy(cr, uid, id, default, context)
-
+
def tender_cancel(self, cr, uid, ids, context=None):
purchase_order_obj = self.pool.get('purchase.order')
- for purchase in self.browse(cr, uid, ids, context=context):
- for purchase_id in purchase.purchase_ids:
- if str(purchase_id.state) in('draft'):
- purchase_order_obj.action_cancel(cr,uid,[purchase_id.id])
+ #try to set all associated quotations to cancel state
+ purchase_ids = []
+ for tender in self.browse(cr, uid, ids, context=context):
+ for purchase_order in tender.purchase_ids:
+ purchase_order_obj.action_cancel(cr, uid, [purchase_order.id], context=context)
+ purchase_order_obj.message_post(cr, uid, [purchase_order.id], body=_('Cancelled by the tender associated to this quotation.'), context=context)
+ procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', 'in', ids)], context=context)
+ self.pool['procurement.order'].action_done(cr, uid, procurement_ids)
return self.write(cr, uid, ids, {'state': 'cancel'})
def tender_in_progress(self, cr, uid, ids, context=None):
- return self.write(cr, uid, ids, {'state':'in_progress'} ,context=context)
+ return self.write(cr, uid, ids, {'state': 'in_progress'}, context=context)
+
+ def tender_open(self, cr, uid, ids, context=None):
+ return self.write(cr, uid, ids, {'state': 'open'}, context=context)
def tender_reset(self, cr, uid, ids, context=None):
- return self.write(cr, uid, ids, {'state': 'draft'})
+ self.write(cr, uid, ids, {'state': 'draft'})
+ for p_id in ids:
+ # Deleting the existing instance of workflow for PO
+ self.delete_workflow(cr, uid, [p_id])
+ self.create_workflow(cr, uid, [p_id])
+ return True
def tender_done(self, cr, uid, ids, context=None):
+ procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', 'in', ids)], context=context)
+ self.pool['procurement.order'].action_done(cr, uid, procurement_ids)
- return self.write(cr, uid, ids, {'state':'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S')}, context=context)
-
- def _planned_date(self, requisition, delay=0.0):
- company = requisition.company_id
- date_planned = False
- if requisition.date_start:
- date_planned = datetime.strptime(requisition.date_start, '%Y-%m-%d %H:%M:%S') - relativedelta(days=company.po_lead)
- else:
- date_planned = datetime.today() - relativedelta(days=company.po_lead)
- if delay:
- date_planned -= relativedelta(days=delay)
- return date_planned and date_planned.strftime('%Y-%m-%d %H:%M:%S') or False
-
- def _seller_details(self, cr, uid, requisition_line, supplier, context=None):
+ return self.write(cr, uid, ids, {'state': 'done'}, context=context)
+
+ def open_product_line(self, cr, uid, ids, context=None):
+ """ This opens product line view to view all lines from the different quotations, groupby default by product and partner to show comparaison
+ between supplier price
+ @return: the product line tree view
+ """
+ if context is None:
+ context = {}
+ res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'purchase_requisition', 'purchase_line_tree', context=context)
+ res['context'] = context
+ po_lines = self.browse(cr, uid, ids, context=context)[0].po_line_ids
+ res['context'] = {
+ 'search_default_groupby_product': True,
+ 'search_default_hide_cancelled': True,
+ }
+ res['domain'] = [('id', 'in', [line.id for line in po_lines])]
+ return res
+
+ def open_rfq(self, cr, uid, ids, context=None):
+ """ This opens rfq view to view all quotations associated to the call for bids
+ @return: the RFQ tree view
+ """
+ if context is None:
+ context = {}
+ res = self.pool.get('ir.actions.act_window').for_xml_id(cr, uid, 'purchase', 'purchase_rfq', context=context)
+ res['context'] = context
+ po_ids = [po.id for po in self.browse(cr, uid, ids, context=context)[0].purchase_ids]
+ res['domain'] = [('id', 'in', po_ids)]
+ return res
+
+ def _prepare_purchase_order(self, cr, uid, requisition, supplier, context=None):
+ supplier_pricelist = supplier.property_product_pricelist_purchase and supplier.property_product_pricelist_purchase.id or False
+ picking_type_in = self.pool.get("purchase.order")._get_picking_in(cr, uid, context=context)
+ return {
+ 'origin': requisition.name,
+ 'date_order': requisition.date_end or fields.date.context_today(self, cr, uid, context=context),
+ 'partner_id': supplier.id,
+ 'pricelist_id': supplier_pricelist,
+ 'location_id': requisition.picking_type_id.default_location_dest_id.id,
+ 'company_id': requisition.company_id.id,
+ 'fiscal_position': supplier.property_account_position and supplier.property_account_position.id or False,
+ 'requisition_id': requisition.id,
+ 'notes': requisition.description,
+ 'picking_type_id': picking_type_in,
+ }
+
+ def _prepare_purchase_order_line(self, cr, uid, requisition, requisition_line, purchase_id, supplier, context=None):
+ po_line_obj = self.pool.get('purchase.order.line')
product_uom = self.pool.get('product.uom')
- pricelist = self.pool.get('product.pricelist')
product = requisition_line.product_id
default_uom_po_id = product.uom_po_id.id
+ date_order = requisition.ordering_date or fields.date.context_today(self, cr, uid, context=context)
qty = product_uom._compute_qty(cr, uid, requisition_line.product_uom_id.id, requisition_line.product_qty, default_uom_po_id)
- seller_delay = 0.0
- seller_price = False
- seller_qty = False
- for product_supplier in product.seller_ids:
- if supplier.id == product_supplier.name and qty >= product_supplier.qty:
- seller_delay = product_supplier.delay
- seller_qty = product_supplier.qty
- supplier_pricelist = supplier.property_product_pricelist_purchase or False
- seller_price = pricelist.price_get(cr, uid, [supplier_pricelist.id], product.id, qty, supplier.id, {'uom': default_uom_po_id})[supplier_pricelist.id]
- if seller_qty:
- qty = max(qty,seller_qty)
- date_planned = self._planned_date(requisition_line.requisition_id, seller_delay)
- return seller_price, qty, default_uom_po_id, date_planned
+ supplier_pricelist = supplier.property_product_pricelist_purchase and supplier.property_product_pricelist_purchase.id or False
+ vals = po_line_obj.onchange_product_id(cr, uid, [], supplier_pricelist, product.id, qty, default_uom_po_id,
+ supplier.id, date_order=date_order, fiscal_position_id=supplier.property_account_position, date_planned=requisition_line.schedule_date,
+ name=False, price_unit=False, state='draft', context=context)['value']
+ vals.update({
+ 'order_id': purchase_id,
+ 'product_id': product.id,
+ 'account_analytic_id': requisition_line.account_analytic_id.id,
+ })
+ return vals
def make_purchase_order(self, cr, uid, ids, partner_id, context=None):
"""
proc_obj.write(cr, uid, proc_ids, {'purchase_id': po.id})
self.signal_purchase_cancel(cr, uid, [order.id])
po.requisition_id.tender_done(context=context)
+ if po.requisition_id and all(purchase_id.state in ['draft', 'cancel'] for purchase_id in po.requisition_id.purchase_ids if purchase_id.id != po.id):
+ procurement_ids = self.pool['procurement.order'].search(cr, uid, [('requisition_id', '=', po.requisition_id.id)], context=context)
+ for procurement in proc_obj.browse(cr, uid, procurement_ids, context=context):
+ procurement.move_id.write({'location_id': procurement.move_id.location_dest_id.id})
return res
+ def copy(self, cr, uid, id, default=None, context=None):
+ if context is None:
+ context = {}
+ if not context.get('force_requisition_id'):
+ default = default or {}
+ default.update({'requisition_id': False})
+ return super(purchase_order, self).copy(cr, uid, id, default=default, context=context)
+
+ def _prepare_order_line_move(self, cr, uid, order, order_line, picking_id, group_id, context=None):
+ stock_move_lines = super(purchase_order, self)._prepare_order_line_move(cr, uid, order, order_line, picking_id, group_id, context=context)
+ if order.requisition_id and order.requisition_id.procurement_id and order.requisition_id.procurement_id.move_dest_id:
+ for i in range(0, len(stock_move_lines)):
+ stock_move_lines[i]['move_dest_id'] = order.requisition_id.procurement_id.move_dest_id.id
+ return stock_move_lines
-class product_product(osv.osv):
- _inherit = 'product.product'
+
+class purchase_order_line(osv.osv):
+ _inherit = 'purchase.order.line'
_columns = {
- 'purchase_requisition': fields.boolean('Purchase Requisition', help="Check this box to generates purchase requisition instead of generating requests for quotation from procurement.")
+ 'quantity_bid': fields.float('Quantity Bid', digits_compute=dp.get_precision('Product Unit of Measure'), help="Technical field for not loosing the initial information about the quantity proposed in the bid"),
}
- _defaults = {
- 'purchase_requisition': False
+
+ def action_draft(self, cr, uid, ids, context=None):
+ self.write(cr, uid, ids, {'state': 'draft'}, context=context)
+
+ def action_confirm(self, cr, uid, ids, context=None):
+ super(purchase_order_line, self).action_confirm(cr, uid, ids, context=context)
+ for element in self.browse(cr, uid, ids, context=context):
+ if not element.quantity_bid:
+ self.write(cr, uid, ids, {'quantity_bid': element.product_qty}, context=context)
+ return True
+
+ def generate_po(self, cr, uid, tender_id, context=None):
+ #call generate_po from tender with active_id. Called from js widget
+ return self.pool.get('purchase.requisition').generate_po(cr, uid, [tender_id], context=context)
+
+
+class product_template(osv.osv):
+ _inherit = 'product.template'
+
+ _columns = {
+ 'purchase_requisition': fields.boolean('Call for Bids', help="Check this box to generate Call for Bids instead of generating requests for quotation from procurement.")
}