diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 43ad6982a26..8e58f46de06 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -1123,6 +1123,8 @@ class procurement_order(osv.osv): return False return True + def check_product_requisition(self, cr, uid, ids, context=None): + return False def action_po_assign(self, cr, uid, ids, context=None): """ This is action which call from workflow to assign purchase order to procurements diff --git a/addons/purchase/purchase_workflow.xml b/addons/purchase/purchase_workflow.xml index 2b79f903f89..f844162ef64 100644 --- a/addons/purchase/purchase_workflow.xml +++ b/addons/purchase/purchase_workflow.xml @@ -230,7 +230,7 @@ - check_buy() and check_supplier_info() + check_buy() and check_supplier_info() and not check_product_requisition() diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index a5432c06343..bbae04b024b 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -43,6 +43,7 @@ keep track and order all your purchase orders. 'purchase_requisition_data.xml', 'purchase_requisition_view.xml', 'purchase_requisition_report.xml', + 'purchase_requisition_workflow.xml', 'security/ir.model.access.csv','purchase_requisition_sequence.xml' ], 'auto_install': False, diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index 97077f8b47e..3ebf0461863 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -56,11 +56,12 @@ class purchase_requisition(osv.osv): 'purchase_ids' : fields.one2many('purchase.order','requisition_id','Purchase Orders',states={'done': [('readonly', True)]}), 'po_line_ids': fields.function(_get_po_line, method=True, type='one2many', relation='purchase.order.line', string='Products by supplier'), 'line_ids' : fields.one2many('purchase.requisition.line','requisition_id','Products to Purchase',states={'done': [('readonly', True)]}), + 'move_dest_id': fields.many2one('stock.move', 'Reservation Destination', ondelete='set null'), 'warehouse_id': fields.many2one('stock.warehouse', 'Warehouse'), 'state': fields.selection([('draft','Draft Tender'),('in_progress','Sent to Suppliers'),('open','Choosing Lines'),('done','PO Created'),('cancel','Cancelled')], 'Status', track_visibility='onchange', required=True), 'multiple_rfq_per_supplier': fields.boolean('Multiple RFQ per supplier'), - 'account_analytic_id':fields.many2one('account.analytic.account', 'Analytic Account',), + 'account_analytic_id':fields.many2one('account.analytic.account', 'Analytic Account'), 'schedule_date': fields.date('Scheduled Date', select=True), } _defaults = { @@ -103,8 +104,13 @@ class purchase_requisition(osv.osv): 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'}) + wf_service = netsvc.LocalService("workflow") + for p_id in ids: + # Deleting the existing instance of workflow for PO + wf_service.trg_delete(uid, 'purchase.requisition', p_id, cr) + wf_service.trg_create(uid, 'purchase.requisition', p_id, cr) + return True def tender_done(self, cr, uid, ids, context=None): return self.write(cr, uid, ids, {'state':'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S')}, context=context) @@ -207,6 +213,7 @@ class purchase_requisition(osv.osv): 'product_uom': default_uom_po_id, 'price_unit': seller_price, 'date_planned': requisition_line.schedule_date or date_planned, + 'move_dest_id': requisition.move_dest_id.id, 'taxes_id': [(6, 0, taxes)], 'account_analytic_id':requisition_line.account_analytic_id.id, } @@ -298,7 +305,9 @@ class purchase_requisition(osv.osv): self.cancel_quotation(cr, uid, tender, context=context) #set tender to state done - self.tender_done(cr, uid, id, context=context) + wf_service = netsvc.LocalService("workflow") + wf_service.trg_validate(uid, 'purchase.requisition', tender.id, 'done', cr) + #self.tender_done(cr, uid, id, context=context) return True def trigger_validate_po(self, cr, uid, po_id, context=None): @@ -327,11 +336,11 @@ class purchase_requisition_line(osv.osv): 'product_uom_id': fields.many2one('product.uom', 'Product Unit of Measure'), 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure')), 'po_line_buy': fields.many2one('purchase.order.line', 'Purchase Order Line'), - 'requisition_id': fields.many2one('purchase.requisition','Purchase Requisition', ondelete='cascade'), + 'requisition_id': fields.many2one('purchase.requisition','Request for Tender', ondelete='cascade'), 'po_line_ids': fields.related('requisition_id', 'po_line_ids', string='PO lines', readonly=True, type="one2many"), 'company_id': fields.related('requisition_id','company_id',type='many2one',relation='res.company',string='Company', store=True, readonly=True), 'account_analytic_id':fields.many2one('account.analytic.account', 'Analytic Account',), - 'schedule_date': fields.date('Scheduled Date', select=True), + 'schedule_date': fields.date('Scheduled Date'), } def onchange_product_id(self, cr, uid, ids, product_id, product_uom_id, parent_analytic_account, analytic_account, parent_date, date, context=None): @@ -359,7 +368,7 @@ class purchase_order(osv.osv): _inherit = "purchase.order" _columns = { - 'requisition_id' : fields.many2one('purchase.requisition','Purchase Requisition'), + 'requisition_id' : fields.many2one('purchase.requisition','Request for Tender'), } def wkf_confirm_order(self, cr, uid, ids, context=None): @@ -414,7 +423,7 @@ class product_product(osv.osv): _inherit = 'product.product' _columns = { - 'purchase_requisition': fields.boolean('Purchase Requisition', help="Check this box to generates purchase requisition instead of generating requests for quotation from procurement.") + 'purchase_requisition': fields.boolean('Request for Tender', help="Check this box to generates requests for tender instead of generating requests for quotation from procurement.") } _defaults = { 'purchase_requisition': False @@ -441,6 +450,7 @@ class procurement_order(osv.osv): 'date_end': procurement.date_planned, 'warehouse_id':warehouse_id and warehouse_id[0] or False, 'company_id':procurement.company_id.id, + 'move_dest_id':procurement.move_id.id, 'line_ids': [(0,0,{ 'product_id': procurement.product_id.id, 'product_uom_id': procurement.product_uom.id, @@ -453,6 +463,12 @@ class procurement_order(osv.osv): res = super(procurement_order, self).make_po(cr, uid, ids, context=context) return res + def check_product_requisition(self, cr, uid, ids, context=None): + procurement = self.browse(cr, uid, ids, context=context)[0] + if procurement.product_id.purchase_requisition: + return True + return False + procurement_order() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/purchase_requisition/purchase_requisition_report.xml b/addons/purchase_requisition/purchase_requisition_report.xml index 97d510fe752..3a1ed498c4e 100644 --- a/addons/purchase_requisition/purchase_requisition_report.xml +++ b/addons/purchase_requisition/purchase_requisition_report.xml @@ -1,6 +1,6 @@ - + diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml index 29c6e471674..04211b75a45 100644 --- a/addons/purchase_requisition/purchase_requisition_view.xml +++ b/addons/purchase_requisition/purchase_requisition_view.xml @@ -28,14 +28,14 @@ purchase.requisition.form purchase.requisition -
-
-
@@ -125,7 +125,7 @@ purchase.requisition.tree purchase.requisition - + @@ -142,12 +142,12 @@ purchase.requisition.list.select purchase.requisition - - + + - - - + + + @@ -164,7 +164,7 @@ - Purchase Requisitions + Request for Tender ir.actions.act_window purchase.requisition form @@ -173,9 +173,9 @@

- Click to start a new purchase requisition process. + Click to start a new request for tender process.

- A purchase requisition is the step before a request for quotation. + A request for tender is the step before a request for quotation. In a purchase requisition (or purchase tender), you can record the products you need to buy and trigger the creation of RfQs to suppliers. After the negotiation, once you have reviewed all the diff --git a/addons/purchase_requisition/purchase_requisition_workflow.xml b/addons/purchase_requisition/purchase_requisition_workflow.xml new file mode 100644 index 00000000000..1da7eccc2b1 --- /dev/null +++ b/addons/purchase_requisition/purchase_requisition_workflow.xml @@ -0,0 +1,96 @@ + + + + + + Purchase Requisition Basic Workflow + purchase.requisition + True + + + + + True + draft + + + + sent + function + tender_in_progress() + + + + open + function + tender_open() + + + + cancel + function + True + tender_cancel() + + + + done + tender_done() + function + True + + + + + + sent_suppliers + + + + + open_bid + + + + + cancel_requisition + + + + + done + + + + + cancel_requisition + + + + + + buy_requisition + subflow + + action_po_assign() + + + + + + check_buy() and check_supplier_info() and check_product_requisition() + + + + + + subflow.done + + + + + + subflow.cancel + + + \ No newline at end of file diff --git a/addons/purchase_requisition/report/purchase_requisition.rml b/addons/purchase_requisition/report/purchase_requisition.rml index 1149112db0a..6e1eee134bf 100644 --- a/addons/purchase_requisition/report/purchase_requisition.rml +++ b/addons/purchase_requisition/report/purchase_requisition.rml @@ -1,6 +1,6 @@ - -