From 7608df909638b725682db88969787ea09433dfea Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Thu, 20 Oct 2011 11:52:48 +0530 Subject: [PATCH 02/16] [Move]purchase_requisition: Move purchase_requisition.yml in to process folder bzr revid: dbr@tinyerp.com-20111020062248-tg7pkrdvh026jvzm --- .../test/{ => process}/purchase_requisition.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename addons/purchase_requisition/test/{ => process}/purchase_requisition.yml (100%) diff --git a/addons/purchase_requisition/test/purchase_requisition.yml b/addons/purchase_requisition/test/process/purchase_requisition.yml similarity index 100% rename from addons/purchase_requisition/test/purchase_requisition.yml rename to addons/purchase_requisition/test/process/purchase_requisition.yml From 29c0a92ac50eff2e7eb9f374aba0206e0f4dd43e Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Fri, 21 Oct 2011 17:59:41 +0530 Subject: [PATCH 03/16] [IMP]purchase_requisition: try to improve the code on the bases of data bzr revid: dbr@tinyerp.com-20111021122941-dlro6heqzpmwitub --- addons/purchase/purchase_demo.xml | 16 +- addons/purchase_requisition/__openerp__.py | 4 +- .../purchase_requisition_view.xml | 4 +- .../test/process/purchase_requisition.yml | 207 +++--------------- 4 files changed, 45 insertions(+), 186 deletions(-) diff --git a/addons/purchase/purchase_demo.xml b/addons/purchase/purchase_demo.xml index 6aa98f8cf6c..958a1557b4e 100644 --- a/addons/purchase/purchase_demo.xml +++ b/addons/purchase/purchase_demo.xml @@ -161,9 +161,19 @@ 10 - + + [HDD3] HDD Seagate 7200.8 80GB + + + 70 + 10 + + + + + [HDD2] HDD Seagate 7200.8 120GB @@ -172,7 +182,7 @@ - + [RAM] DDR 256MB PC400 @@ -182,7 +192,7 @@ - + [RAM512] DDR 512MB PC400 diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index d1ec2b1c260..ebdb598c081 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -43,8 +43,8 @@ This new object will regroup and will allow you to easily keep track and order a "security/ir.model.access.csv","purchase_requisition_sequence.xml" ], "active": False, - "test":['test/purchase_requisition_report.yml', - 'test/purchase_requisition_test.yml', + "test":[#'test/purchase_requisition_report.yml', + 'test/process/purchase_requisition.yml', ], "installable": True, "certificate" : "001023264099823179629", diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml index 06ee94c3941..3b0cfeb7f77 100644 --- a/addons/purchase_requisition/purchase_requisition_view.xml +++ b/addons/purchase_requisition/purchase_requisition_view.xml @@ -21,7 +21,7 @@ purchase.order - + @@ -34,7 +34,7 @@ purchase.order - + diff --git a/addons/purchase_requisition/test/process/purchase_requisition.yml b/addons/purchase_requisition/test/process/purchase_requisition.yml index fb5fa774fc3..df6d4089e54 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition.yml @@ -1,189 +1,38 @@ - - - In order to test the purchase requisition module, I will do a sale order -> purchase_requisition -> - purchase flow and I will buy the required products at two different suppliers. + In order to test the purchase requisition module, I have to add a boolean field in product, + If I checked it then it's requisition create. - - I start by creating a new product 'Laptop ACER', which is purchased at Asustek, in MTO, - with the generation of purchase requisitions. + I start by Checking the product, Product must have requisition field checked. + and Product supply method is buy and the procure method is make to order. - - !record {model: product.product, id: product_product_laptopacer0}: - categ_id: product.product_category_3 - cost_method: standard - mes_type: fixed - name: Laptop ACER - procure_method: make_to_order - purchase_requisition: 1 - seller_ids: - - delay: 1 - name: base.res_partner_asus - qty: 5.0 - min_qty: 1.0 - supply_method: buy - type: product - uom_id: product.product_uom_unit - uom_po_id: product.product_uom_unit - volume: 0.0 - warranty: 0.0 - weight: 0.0 - weight_net: 0.0 - list_price: 100.0 + !record {model: product.product, id: product.product_product_hdd3}: + supply_method: 'buy' + purchase_requisition: True - - Then I sell 5 Laptop ACER to the customer Agrolait, sale order TEST/TENDER/0001. + I create the procurement order. - - !record {model: sale.order, id: sale_order_testtender0}: - date_order: !eval time.strftime('%Y-%m-%d') - invoice_quantity: order - name: TEST/TENDER/0001 - order_line: - - name: Laptop ACER - price_unit: 100.0 - product_uom: product.product_uom_unit - product_uom_qty: 5.0 - state: draft - delay: 7.0 - product_id: product_product_laptopacer0 - product_uos_qty: 5.0 - th_weight: 0.0 - type: make_to_order - order_policy: manual - partner_id: base.res_partner_agrolait - partner_invoice_id: base.res_partner_address_8 - partner_order_id: base.res_partner_address_8 - partner_shipping_id: base.res_partner_address_8 - picking_policy: direct - pricelist_id: product.list0 - shop_id: sale.shop + !python {model: make.procurement}: | + import time + product = self.pool.get('product.product').browse(cr, uid,[ref('product.product_product_hdd3')]) + #product_uom = product.product_uom + fields = { + 'qty': 5.0, + 'product_id': product, + #'uom_id': product_uom, + #'warehouse_id': stock.warehouse0, + 'date_planned': time.strftime('%Y-%m-%d') + } + a = self.default_get(cr, uid, fields, context) + req_id = self.make_procurement(cr, uid, [ref('product.product_product_hdd3')], context) - - I confirm the sale order. -- - !workflow {model: sale.order, action: order_confirm, ref: sale_order_testtender0} -- - I launch the scheduler to compute all procurements, and specify all requisitions orders. -- - !python {model: procurement.order.compute.all}: | - proc_obj = self.pool.get('procurement.order') - proc_obj._procure_confirm(cr,uid) -- - On the purchase requisition, I create a new purchase order for the supplier 'DistriPC' by clicking on - the button 'New RfQ'. This opens a window to ask me the supplier and I set DistriPC . -- - !record {model: purchase.requisition.partner, id: purchase_requisition_partner_0}: - partner_address_id: base.res_partner_address_7 - partner_id: base.res_partner_4 -- - I create a new purchase order. -- - !python {model: purchase.requisition.partner}: | - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid, [('origin','=','Laptop ACER')]) - self.create_order(cr, uid, [ref("purchase_requisition_partner_0")], {"lang": - 'en_US', "active_model": "purchase.requisition", "tz": False, "record_id": - 1, "active_ids": ids, "active_id": ids[0], }) - -- - I check that I have two purchase orders on the purchase requisition. -- - !python {model: purchase.order}: | - from tools.translate import _ - order_ids =self.search(cr, uid, [('origin','=','TEST/TENDER/0001')]) - ids=len(order_ids) - assert(ids == 2), _('Purchase Order not Created') - -- - I set the purchase requisition as 'Not Exclusive'. -- - !python {model: purchase.requisition}: | - ids =self.search(cr, uid, [('origin','=','Laptop ACER')]) - self.write(cr,uid,ids[0],{'exclusive': 'multiple' }) -- - I change the quantities so that the purchase order for DistriPC includes 3 pieces and the - purchase order for Asustek includes 2 pieces. + I create the procurement order from the selected purchase order. - !python {model: purchase.order}: | - line_obj=self.pool.get('purchase.order.line') - partner_obj=self.pool.get('res.partner') - requistion_obj=self.pool.get('purchase.requisition') - requistion_ids =requistion_obj.search(cr, uid, [('origin','=','Laptop ACER')]) - partner_id1=partner_obj.search(cr,uid,[('name','=','ASUStek')])[0] - partner_id2=partner_obj.search(cr,uid,[('name','=','Distrib PC')])[0] - purchase_id1= self.search(cr, uid, [('partner_id','=',partner_id1),('requisition_id','in',requistion_ids)]) - purchase_id2= self.search(cr, uid, [('partner_id','=',partner_id2),('requisition_id','in',requistion_ids)]) - order_line1=self.browse(cr, uid, purchase_id1, context)[0].order_line[0].id - order_line2=self.browse(cr, uid, purchase_id2, context)[0].order_line[0].id - line_obj.write(cr, uid, order_line1, {'product_qty':2}) - line_obj.write(cr, uid, order_line2, {'product_qty':3}) + req_id = self.pool.get('procurement.order').action_po_assign(cr, uid, [ref('purchase.order_purchase6')], context) + self.wkf_confirm_order(cr, uid, [req_id], context) - - I confirm and validate both purchase orders. + I create the purchase requisition for the selected product. - - !python {model: purchase.order}: | - order_ids= self.search(cr, uid, []) - import netsvc - wf_service = netsvc.LocalService("workflow") - for id in order_ids: - wf_service.trg_validate(uid, 'purchase.order',id,'purchase_confirm', cr) - wf_service.trg_validate(uid, 'purchase.order',id,'purchase_approve', cr) -- - I check that the delivery order of the customer is in state 'Waiting Goods'. -- - !python {model: stock.picking }: | - from tools.translate import _ - picking_id = self.search(cr, uid, [('origin','=','TEST/TENDER/0001')]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - assert (pick.state =='confirmed'),_('Picking is not in confirm state.') - assert (pick.move_lines[0].state == 'waiting'), _('Stock Move is not Waiting state.') - -- - I receive the order of the supplier Asustek from the Incoming Products menu. -- - !python {model: stock.picking }: | - import time - partner_obj=self.pool.get('res.partner') - order_obj=self.pool.get('purchase.order') - partner_id=partner_obj.search(cr,uid,[('name','=','ASUStek')])[0] - picking_id = self.search(cr, uid, [('address_id.partner_id','=',partner_id),('type','=','in')]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - move =pick.move_lines[0] - partial_datas = { - 'partner_id': pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, picking_id,partial_datas) -- - I receive the order of the supplier DistriPC from the Incoming Shipments menu. -- - !python {model: stock.picking }: | - import time - partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','Distrib PC')])[0] - picking_id = self.search(cr, uid, [('address_id.partner_id','=',partner_id),('type','=','in')]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - move =pick.move_lines[0] - partial_datas = { - 'partner_id':pick.address_id.partner_id.id, - 'address_id': pick.address_id.id, - 'delivery_date' : time.strftime('%Y-%m-%d'), - } - partial_datas['move%s'%(move.id)]= { - 'product_id': move.product_id.id, - 'product_qty': move.product_qty, - 'product_uom': move.product_uom.id, - } - self.do_partial(cr, uid, picking_id,partial_datas) -- - I check that the delivery order of the customer is in the state Available. -- - !python {model: stock.picking }: | - from tools.translate import _ - picking_id = self.search(cr, uid, [('origin','=','TEST/TENDER/0001'),('type','=','out')]) - if picking_id: - pick=self.browse(cr,uid,picking_id[0]) - assert(pick.state == 'assigned'), _('Picking is not in available state') - + !python {model: purchase.requisition}: | + self.browse(cr, uid, [context.get('requisition_id')], context) + From 86caf711dd971f063d090f4810f2b26e8756068a Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 31 Oct 2011 14:18:58 +0530 Subject: [PATCH 04/16] [IMP]puchase_requisition:Improve the test case for create procurement order from product bzr revid: dbr@tinyerp.com-20111031084858-e26x17iufxwbzrtu --- .../test/process/purchase_requisition.yml | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/addons/purchase_requisition/test/process/purchase_requisition.yml b/addons/purchase_requisition/test/process/purchase_requisition.yml index df6d4089e54..b3c1aeb0982 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition.yml @@ -9,21 +9,25 @@ supply_method: 'buy' purchase_requisition: True - - I create the procurement order. + I create the procurement order for the product. - - !python {model: make.procurement}: | + !python {model: product.product}: | import time - product = self.pool.get('product.product').browse(cr, uid,[ref('product.product_product_hdd3')]) - #product_uom = product.product_uom - fields = { - 'qty': 5.0, - 'product_id': product, - #'uom_id': product_uom, - #'warehouse_id': stock.warehouse0, - 'date_planned': time.strftime('%Y-%m-%d') - } - a = self.default_get(cr, uid, fields, context) - req_id = self.make_procurement(cr, uid, [ref('product.product_product_hdd3')], context) + procurement = self.pool.get('make.procurement') + product = self.browse(cr, uid,[ref('product.product_product_hdd3')]) + context = {'active_model': 'product.product','active_ids': [product[0].id],'active_id': product[0].id} + default_data = procurement.default_get(cr, uid, ['uom_id', 'warehouse_id', 'date_planned', 'product_id', 'qty'], context) + vals = {'uom_id': product[0].uom_id.id,'warehouse_id': ref('stock.stock_warehouse_shop0'),'qty': default_data.get('qty'),'date_planned': default_data.get('date_planned')} + ids = procurement.create(cr, uid, vals, context) + req_id = procurement.make_procurement(cr, uid, [ids], context) + proc_order = self.pool.get('procurement.order') + order = proc_order.browse(cr, uid, [req_id.get('res_id')]) + assert order[0].state == "confirmed", "Procurement Order should be in Confirmed state" + assert order[0].product_id == product[0],"Product is not correspond in procurement order" + assert order[0].product_qty == default_data.get('qty'),"Product's quantity is not correspond in procurement order" + assert order[0].product_uom == product[0].uom_id,"Product's UOM is not correspond in procurement order" + + - I create the procurement order from the selected purchase order. - From adc05bc4d6559cdd52482f3e435f0a9d6191ef6c Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 31 Oct 2011 15:27:40 +0530 Subject: [PATCH 05/16] [IMP]puchase_requisition: Improve code for create requisition bzr revid: dbr@tinyerp.com-20111031095740-t42sdppozvhwhfqs --- .../test/process/purchase_requisition.yml | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/addons/purchase_requisition/test/process/purchase_requisition.yml b/addons/purchase_requisition/test/process/purchase_requisition.yml index b3c1aeb0982..42c66f308d4 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition.yml @@ -9,34 +9,34 @@ supply_method: 'buy' purchase_requisition: True - - I create the procurement order for the product. + I create the procurement order for the product and after run the procurement create purchase requisition. - !python {model: product.product}: | import time - procurement = self.pool.get('make.procurement') - product = self.browse(cr, uid,[ref('product.product_product_hdd3')]) - context = {'active_model': 'product.product','active_ids': [product[0].id],'active_id': product[0].id} - default_data = procurement.default_get(cr, uid, ['uom_id', 'warehouse_id', 'date_planned', 'product_id', 'qty'], context) - vals = {'uom_id': product[0].uom_id.id,'warehouse_id': ref('stock.stock_warehouse_shop0'),'qty': default_data.get('qty'),'date_planned': default_data.get('date_planned')} - ids = procurement.create(cr, uid, vals, context) - req_id = procurement.make_procurement(cr, uid, [ids], context) + import netsvc + mk_proc = self.pool.get('make.procurement') proc_order = self.pool.get('procurement.order') + pur_req = self.pool.get('purchase.requisition') + context = {'active_model': 'product.product','active_ids': [ref('product.product_product_hdd3')],'active_id': ref('product.product_product_hdd3')} + default_data = mk_proc.default_get(cr, uid, ['uom_id', 'warehouse_id', 'date_planned', 'product_id', 'qty'], context) + vals = {'uom_id': ref('product.product_uom_unit'),'warehouse_id': ref('stock.stock_warehouse_shop0'),'qty': default_data.get('qty'),'date_planned': default_data.get('date_planned')} + ids = mk_proc.create(cr, uid, vals, context) + req_id = mk_proc.make_procurement(cr, uid, [ids], context) order = proc_order.browse(cr, uid, [req_id.get('res_id')]) assert order[0].state == "confirmed", "Procurement Order should be in Confirmed state" - assert order[0].product_id == product[0],"Product is not correspond in procurement order" + assert order[0].product_id.id == ref('product.product_product_hdd3'),"Product is not correspond in procurement order" assert order[0].product_qty == default_data.get('qty'),"Product's quantity is not correspond in procurement order" - assert order[0].product_uom == product[0].uom_id,"Product's UOM is not correspond in procurement order" - - -- - I create the procurement order from the selected purchase order. -- - !python {model: purchase.order}: | - req_id = self.pool.get('procurement.order').action_po_assign(cr, uid, [ref('purchase.order_purchase6')], context) - self.wkf_confirm_order(cr, uid, [req_id], context) -- - I create the purchase requisition for the selected product. -- - !python {model: purchase.requisition}: | - self.browse(cr, uid, [context.get('requisition_id')], context) - + assert order[0].product_uom.id == ref('product.product_uom_unit'),"Product's UOM is not correspond in procurement order" + wf_service = netsvc.LocalService("workflow") + for proc in order: + wf_service.trg_validate(uid, 'procurement.order',proc.id,'button_check', cr) + proc_ids = proc_order.search(cr, uid, [('id','=',req_id.get('res_id')),('state','in',['running'])]) + proc_id = proc_order.browse(cr, uid, proc_ids) + assert proc_id[0].state == 'running',"Product's UOM is not correspond in procurement order" + if proc_id[0].requisition_id: + pur_req_rec = pur_req.browse(cr, uid, [proc_id[0].requisition_id.id]) + assert pur_req_rec[0].state == 'draft',"Product's UOM is not correspond in procurement order" + for record in pur_req_rec[0].line_ids: + assert record.product_id.id == ref('product.product_product_hdd3'),"Product's UOM is not correspond in procurement order" + assert record.product_qty == default_data.get('qty'),"Product's UOM is not correspond in procurement order" + assert record.product_uom_id.id == ref('product.product_uom_unit'),"Product's UOM is not correspond in procurement order" From a8ee7baa2d95261435d266798cee2196bde4d617 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 31 Oct 2011 17:22:25 +0530 Subject: [PATCH 06/16] [IMP,ADD,MOVE]puchase_requisition: Improve the code in purchase_requisition.yml file Create new ui folder Move purchase_requisition_exclusive.yml to onchange_events.yml Improve code for onchange_events.yml bzr revid: dbr@tinyerp.com-20111031115225-1yy9jsz3iee2gmlw --- addons/purchase_requisition/__openerp__.py | 3 +- .../test/process/purchase_requisition.yml | 21 ++-- .../test/purchase_requisition_exclusive.yml | 113 ------------------ .../test/ui/onchange_events.yml | 23 ++++ 4 files changed, 38 insertions(+), 122 deletions(-) delete mode 100644 addons/purchase_requisition/test/purchase_requisition_exclusive.yml create mode 100644 addons/purchase_requisition/test/ui/onchange_events.yml diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index ebdb598c081..e655a574e42 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -43,8 +43,9 @@ This new object will regroup and will allow you to easily keep track and order a "security/ir.model.access.csv","purchase_requisition_sequence.xml" ], "active": False, - "test":[#'test/purchase_requisition_report.yml', + "test":[ 'test/process/purchase_requisition.yml', + 'test/ui/onchange_events.yml', ], "installable": True, "certificate" : "001023264099823179629", diff --git a/addons/purchase_requisition/test/process/purchase_requisition.yml b/addons/purchase_requisition/test/process/purchase_requisition.yml index 42c66f308d4..3be7e2a9ea9 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition.yml @@ -1,6 +1,6 @@ - - In order to test the purchase requisition module, I have to add a boolean field in product, - If I checked it then it's requisition create. + In order to test the purchase requisition module, I have to checked a boolean field 'purchase requisition' in product, + If I checked it then it's requisition will be create. - I start by Checking the product, Product must have requisition field checked. and Product supply method is buy and the procure method is make to order. @@ -9,7 +9,7 @@ supply_method: 'buy' purchase_requisition: True - - I create the procurement order for the product and after run the procurement create purchase requisition. + I create the procurement order for the product and after run that procurement for create purchase requisition. - !python {model: product.product}: | import time @@ -17,6 +17,7 @@ mk_proc = self.pool.get('make.procurement') proc_order = self.pool.get('procurement.order') pur_req = self.pool.get('purchase.requisition') + pur_order = self.pool.get('purchase.order') context = {'active_model': 'product.product','active_ids': [ref('product.product_product_hdd3')],'active_id': ref('product.product_product_hdd3')} default_data = mk_proc.default_get(cr, uid, ['uom_id', 'warehouse_id', 'date_planned', 'product_id', 'qty'], context) vals = {'uom_id': ref('product.product_uom_unit'),'warehouse_id': ref('stock.stock_warehouse_shop0'),'qty': default_data.get('qty'),'date_planned': default_data.get('date_planned')} @@ -32,11 +33,15 @@ wf_service.trg_validate(uid, 'procurement.order',proc.id,'button_check', cr) proc_ids = proc_order.search(cr, uid, [('id','=',req_id.get('res_id')),('state','in',['running'])]) proc_id = proc_order.browse(cr, uid, proc_ids) - assert proc_id[0].state == 'running',"Product's UOM is not correspond in procurement order" + assert proc_id[0].state == 'running',"Generated Procurement should be in Running state" if proc_id[0].requisition_id: + po_id = pur_order.search(cr, uid, [('requisition_id','=',proc_id[0].requisition_id.id)]) + po_req = pur_order.browse(cr, uid, po_id)[0].requisition_id pur_req_rec = pur_req.browse(cr, uid, [proc_id[0].requisition_id.id]) - assert pur_req_rec[0].state == 'draft',"Product's UOM is not correspond in procurement order" + assert po_req == proc_id[0].requisition_id,"Created Requisition is not properly linked in purchase order" + assert pur_req_rec[0].state == 'draft',"Created Requisition should be in draft state" for record in pur_req_rec[0].line_ids: - assert record.product_id.id == ref('product.product_product_hdd3'),"Product's UOM is not correspond in procurement order" - assert record.product_qty == default_data.get('qty'),"Product's UOM is not correspond in procurement order" - assert record.product_uom_id.id == ref('product.product_uom_unit'),"Product's UOM is not correspond in procurement order" + assert record.product_id.id == ref('product.product_product_hdd3'),"Requisition Product is not correspond" + assert record.product_qty == default_data.get('qty'),"Requisition Product's quantity is not correspond" + assert record.product_uom_id.id == ref('product.product_uom_unit'),"Requisition Product's UOM is not correspond" + diff --git a/addons/purchase_requisition/test/purchase_requisition_exclusive.yml b/addons/purchase_requisition/test/purchase_requisition_exclusive.yml deleted file mode 100644 index 1ab9bca9493..00000000000 --- a/addons/purchase_requisition/test/purchase_requisition_exclusive.yml +++ /dev/null @@ -1,113 +0,0 @@ -- - In order to test the purchase requisition module, I will do a sale order -> purchase_requisition -> - purchase flow and I will buy the required products at two different suppliers. -- - I start by creating a new product 'Laptop ACER', which is purchased at Asustek, in MTO, - with the generation of purchase requisitions. -- - !record {model: product.product, id: product_product_laptopacer1}: - categ_id: product.product_category_3 - cost_method: standard - list_price: 1000.0 - mes_type: fixed - name: Laptop ACER1 - procure_method: make_to_order - purchase_requisition: 1 - seller_ids: - - delay: 1 - name: base.res_partner_asus - qty: 5.0 - min_qty: 1.0 - supply_method: buy - type: product - uom_id: product.product_uom_unit - uom_po_id: product.product_uom_unit -- - Then I sell 5 Laptop ACER to the customer Agrolait, sale order TEST/TENDER/0002 -- - !record {model: sale.order, id: sale_order_testtender1}: - date_order: !eval time.strftime('%Y-%m-%d') - invoice_quantity: order - name: TEST/TENDER/0002 - order_line: - - name: Laptop ACER1 - price_unit: 1000.0 - product_uom: product.product_uom_unit - product_uom_qty: 5.0 - state: draft - 'delay': 7.0 - 'product_id': product_product_laptopacer1 - 'type': make_to_order - order_policy: manual - partner_id: base.res_partner_agrolait - partner_invoice_id: base.res_partner_address_8 - partner_order_id: base.res_partner_address_8 - partner_shipping_id: base.res_partner_address_8 - picking_policy: direct - pricelist_id: product.list0 - shop_id: sale.shop -- - I confirm sale order. -- - !workflow {model: sale.order, action: order_confirm, ref: sale_order_testtender1} -- - I launch the scheduler to compute all procurements, and planify all requisitions orders. -- - !python {model: procurement.order.compute.all}: | - proc_obj = self.pool.get('procurement.order') - proc_obj._procure_confirm(cr,uid) -- - I should find a purchase requisition with the origin 'TEST/TENDER/0002', that includes a request for - 5 Laptop ACER, and a purchase order on the default supplier for this product. -- - !python {model: purchase.requisition}: | - requisition_ids =self.search(cr, uid, [('origin','=','Laptop ACER1')]) - ids=len(requisition_ids) - assert len(requisition_ids), "Purchase requisition hasn't Created" -- - On the purchase requisition, I create a new purchase order for the supplier 'DistriPC' by clicking on - the button 'New Request for Quotation'. This opens a window to ask me the supplier and I set DistriPC . -- - I Create purchase.requisition.partner . -- - !record {model: purchase.requisition.partner, id: purchase_requisition_partner_0}: - partner_address_id: base.res_partner_address_7 - partner_id: base.res_partner_4 -- - I create a new purchase order for the supplier 'DistriPC'. -- - !python {model: purchase.requisition.partner}: | - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid, [('origin','=','Laptop ACER1')]) - self.create_order(cr, uid, [ref("purchase_requisition_partner_0")], {"lang": - 'en_US', "active_model": "purchase.requisition", "tz": False, "record_id": - 1, "active_ids": ids, "active_id": ids[0], }) -- - I set the purchase requisition as 'Exclusive' -- - !python {model: purchase.requisition}: | - ids =self.search(cr, uid, [('origin','=','Laptop ACER1')]) - self.write(cr,uid,ids[0],{'exclusive': 'exclusive' }) -- - I confirm and validate the Request for Quotation of ASUStek. -- - !python {model: purchase.order}: | - partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','ASUStek')])[0] - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid, [('origin','=','Laptop ACER1')]) - purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)])[0] - import netsvc - wf_service = netsvc.LocalService("workflow") - if purchase_id: - wf_service.trg_validate(uid, 'purchase.order',purchase_id,'purchase_confirm', cr) - wf_service.trg_validate(uid, 'purchase.order',purchase_id,'purchase_approve', cr) -- - I check that Request for Quotation of DistriPC is cancelled. -- - !python {model: purchase.order}: | - partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','Distrib PC')])[0] - req_obj = self.pool.get('purchase.requisition') - ids =req_obj.search(cr, uid, [('origin','=','Laptop ACER1')]) - purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','in',ids)])[0] - state=self.browse(cr,uid,purchase_id).state - assert (state=='cancel') diff --git a/addons/purchase_requisition/test/ui/onchange_events.yml b/addons/purchase_requisition/test/ui/onchange_events.yml new file mode 100644 index 00000000000..683edbc6aeb --- /dev/null +++ b/addons/purchase_requisition/test/ui/onchange_events.yml @@ -0,0 +1,23 @@ +- + In order to test the onchange events of purchase requisition. +- + I call onchange event to change the product of purchase requisition line. +- + !python {model: purchase.requisition.line}: | + self.onchange_product_id(cr, uid, [ref('order_purchase_requisition1')],ref('product.product_product_hdd2'), ref('product.product_uom_unit')) +- + I change state of requisition in "In progress". +- + !python {model: purchase.requisition}: | + self.tender_in_progress(cr, uid, ref('order_purchase_requisition1')) +- + I change state of requisition as "done". +- + !python {model: purchase.requisition}: | + self.tender_done(cr, uid, ref('order_purchase_requisition1')) +- + I reset the state of requisition as "New". +- + !python {model: purchase.requisition}: | + self.tender_reset(cr, uid, ref('order_purchase_requisition1')) + From b13ddc11a75f70a4a7dad313d13de68a5eb76e73 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 31 Oct 2011 18:11:05 +0530 Subject: [PATCH 07/16] [ADD,MOVE,IMP]purchase_requisition: [ADD]cancel_purchase_requisition.yml [ADD]duplicate_requisition.yml [MOVE]purchase_requisition_test.yml => test/ui/delete_requisition.yml [IMP]delete_requisition.yml [IMP]set the propare sequence in __openerp__.py bzr revid: dbr@tinyerp.com-20111031124105-x0rp6cg5e98lsjrp --- addons/purchase_requisition/__openerp__.py | 3 + .../process/cancel_purchase_requisition.yml | 8 + .../test/purchase_requisition_test.yml | 166 ------------------ .../test/ui/delete_requisition.yml | 27 +++ .../test/ui/duplicate_requisition.yml | 8 + .../{ => ui}/purchase_requisition_report.yml | 0 6 files changed, 46 insertions(+), 166 deletions(-) create mode 100644 addons/purchase_requisition/test/process/cancel_purchase_requisition.yml delete mode 100755 addons/purchase_requisition/test/purchase_requisition_test.yml create mode 100755 addons/purchase_requisition/test/ui/delete_requisition.yml create mode 100644 addons/purchase_requisition/test/ui/duplicate_requisition.yml rename addons/purchase_requisition/test/{ => ui}/purchase_requisition_report.yml (100%) diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index e655a574e42..bbe2551a14e 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -45,7 +45,10 @@ This new object will regroup and will allow you to easily keep track and order a "active": False, "test":[ 'test/process/purchase_requisition.yml', + 'test/process/cancel_purchase_requisition.yml', 'test/ui/onchange_events.yml', + 'test/ui/purchase_requisition_report.yml', + 'test/ui/delete_requisition.yml', ], "installable": True, "certificate" : "001023264099823179629", diff --git a/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml b/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml new file mode 100644 index 00000000000..cb85b32d044 --- /dev/null +++ b/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml @@ -0,0 +1,8 @@ +- + In order to test the cancel purchase requisition order. +- + I try to cancel purchase requisition order. +- + !python {model: purchase.requisition}: | + self.tender_cancel(cr, uid, [ref("order_purchase_requisition1")]) + diff --git a/addons/purchase_requisition/test/purchase_requisition_test.yml b/addons/purchase_requisition/test/purchase_requisition_test.yml deleted file mode 100755 index 403eaca04fc..00000000000 --- a/addons/purchase_requisition/test/purchase_requisition_test.yml +++ /dev/null @@ -1,166 +0,0 @@ -- - In order to test the purchase requisition flow,I start by creating a new product 'MOB1' -- - !record {model: product.product, id: product_product_mob1}: - name: MOB1 - categ_id: product.product_category_3 - cost_method: standard - mes_type: fixed - price_margin: 2.0 - procure_method: make_to_stock - property_stock_inventory: stock.location_inventory - property_stock_procurement: stock.location_procurement - property_stock_production: stock.location_production - standard_price: 2000.0 - supply_method: buy - type: product - uom_id: product.product_uom_unit - uom_po_id: product.product_uom_unit - volume: 0.0 - warranty: 0.0 - weight: 0.0 - weight_net: 0.0 -- - I create purchase requisition for MOB1 for 1 quantity. -- - !record {model: purchase.requisition, id: purchase_requisition_te0}: - company_id: base.main_company - exclusive: multiple - line_ids: - - company_id: base.main_company - product_id: product_product_mob1 - product_qty: 10.0 - product_uom_id: product.product_uom_unit - name: TE00009 -- - Initially purchase requisition is in draft state. -- - !assert {model: purchase.requisition, id: purchase_requisition_te0}: - - state == 'draft' -- - Copy purchase requisition which is in draft state than confirm and Done it. -- - !python {model: purchase.requisition}: | - copy_id = self.copy(cr, uid, ref("purchase_requisition_te0")) - self.tender_cancel(cr, uid, [copy_id], context=None) - self.tender_reset(cr, uid, [copy_id], context=None) - self.tender_in_progress(cr, uid, [copy_id], context=None) - self.tender_done(cr, uid, [copy_id], context=None) -- - I confirm the purchase requisition for MOB1. -- - !python {model: purchase.requisition}: | - self.tender_in_progress(cr, uid, [ref("purchase_requisition_te0")]) -- - I check that the purchase requisition which was initially in the draft state has transmit to In Progress after confirm it. -- - !assert {model: purchase.requisition, id: purchase_requisition_te0}: - - state == 'in_progress' -- - In order to create a purchase order for 'Axelor', i click on the wizard 'Request a Quotation' and create record for wizard. -- - !record {model: purchase.requisition.partner, id: purchase_requisition_partner_0}: - partner_address_id: base.res_partner_address_3000 - partner_id: base.res_partner_desertic_hispafuentes -- - I click on 'Create Quotation' for creating PO. -- - !python {model: purchase.requisition.partner}: | - self.create_order(cr, uid, [ref("purchase_requisition_partner_0")], {"active_model": "purchase.requisition", - "active_ids": [ref("purchase_requisition_te0")],"active_id": ref("purchase_requisition_te0"), }) -- - I confirm the purchase order of Axelor. -- - !python {model: purchase.order}: | - purchase_id= self.search(cr, uid, [('requisition_id','=',ref("purchase_requisition_te0"))]) - import netsvc - wf_service = netsvc.LocalService("workflow") - if purchase_id: - wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_confirm', cr) - wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_approve', cr) -- - I check that Quotation of Axelor is Approved. -- - !python {model: purchase.order}: | - purchase_id= self.search(cr, uid, [('requisition_id','=',ref("purchase_requisition_te0"))])[0] - state=self.browse(cr,uid,purchase_id).state - assert (state=='approved') -- - I click on Done button -- - !python {model: purchase.requisition}: | - self.tender_done(cr, uid, [ref("purchase_requisition_te0")],) -- - I check that after click on Done button state is in done. -- - !assert {model: purchase.requisition, id: purchase_requisition_te0}: - - state == 'done' -- - In order to test the purchase requisition flow for Requisition Type is exclusive -- - I create purchase requisition for Requisition Type is exclusive -- - !record {model: purchase.requisition, id: purchase_requisition_ex1}: - company_id: base.main_company - exclusive: exclusive - line_ids: - - company_id: base.main_company - product_id: product_product_mob1 - product_qty: 10.0 - product_uom_id: product.product_uom_unit - name: TE000010 -- - I Create a First Purchase Order for the supplier 'Distrib PC'. -- - !record {model: purchase.requisition.partner, id: purchase_requisition_partner_1}: - partner_address_id: base.res_partner_address_7 - partner_id: base.res_partner_4 -- - I create Quotations For supplier 'Distrib PC'. -- - !python {model: purchase.requisition.partner}: | - self.create_order(cr, uid, [ref("purchase_requisition_partner_1")], {"active_model": "purchase.requisition", - "active_ids": [ref("purchase_requisition_ex1")],"active_id": ref("purchase_requisition_ex1"), }) -- - I Create a Second Purchase Order for the supplier ASUStek. -- - !record {model: purchase.requisition.partner, id: purchase_requisition_partner_2}: - partner_address_id: base.res_partner_address_tang - partner_id: base.res_partner_asus -- - I create Quotations For supplier 'ASUStek'. -- - !python {model: purchase.requisition.partner}: | - self.create_order(cr, uid, [ref("purchase_requisition_partner_2")], {"active_model": "purchase.requisition", - "active_ids": [ref("purchase_requisition_ex1")],"active_id": ref("purchase_requisition_ex1"), }) -- - I check that Initially purchase requisition is draft state. -- - !assert {model: purchase.requisition, id: purchase_requisition_ex1}: - - state == 'draft' -- - I confirm the Second purchase order of ASUStek, than check that Quotation is Approved. -- - !python {model: purchase.order}: | - purchase_id= self.search(cr, uid, [('partner_id','=',ref("base.res_partner_asus")),('requisition_id','=',ref("purchase_requisition_ex1"))]) - import netsvc - wf_service = netsvc.LocalService("workflow") - if purchase_id: - wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_confirm', cr) - wf_service.trg_validate(uid, 'purchase.order',purchase_id[0],'purchase_approve', cr) - state=self.browse(cr,uid,purchase_id[0]).state - assert (state=='approved') - -- - I check that Quotation of Distrib PC is cancelled. -- - !python {model: purchase.order}: | - partner_id=self.pool.get('res.partner').search(cr,uid,[('name','=','Distrib PC')])[0] - purchase_id= self.search(cr, uid, [('partner_id','=',partner_id),('requisition_id','=',ref("purchase_requisition_ex1"))])[0] - state=self.browse(cr,uid,purchase_id).state - assert (state=='cancel') -- - I check that Purchase Requisition is Done. -- - !assert {model: purchase.requisition, id: purchase_requisition_ex1}: - - state == 'done' diff --git a/addons/purchase_requisition/test/ui/delete_requisition.yml b/addons/purchase_requisition/test/ui/delete_requisition.yml new file mode 100755 index 00000000000..f3ca08674f4 --- /dev/null +++ b/addons/purchase_requisition/test/ui/delete_requisition.yml @@ -0,0 +1,27 @@ +- + In order to test the duplicate order and check duplicate details. +- + I duplicate order. +- + !python {model: purchase.requisition}: | + context.update({'active_id':ref('order_purchase_requisition1')}) + self.copy(cr, uid, ref('order_purchase_requisition1'), context) +- + In order to test to delete process on purchase requisition order. +- + I delete draft purchase requisition order. +- + !python {model: purchase.order}: | + self.unlink(cr, uid, [ref("order_purchase_requisition1")]) +- + Now I try to cancel purchase requisition order. +- + !python {model: purchase.requisition}: | + self.tender_cancel(cr, uid, [ref("order_purchase_requisition1")]) +- + I delete cancelled purchase requisition order. +- + !python {model: purchase.order}: | + self.unlink(cr, uid, [ref("order_purchase_requisition1")]) + + diff --git a/addons/purchase_requisition/test/ui/duplicate_requisition.yml b/addons/purchase_requisition/test/ui/duplicate_requisition.yml new file mode 100644 index 00000000000..742500d865d --- /dev/null +++ b/addons/purchase_requisition/test/ui/duplicate_requisition.yml @@ -0,0 +1,8 @@ +- + In order to test the duplicate order and check duplicate details. +- + I duplicate order. +- + !python {model: purchase.requisition}: | + context.update({'active_id':ref('order_purchase_requisition1')}) + self.copy(cr, uid, ref('order_purchase_requisition1'), context) diff --git a/addons/purchase_requisition/test/purchase_requisition_report.yml b/addons/purchase_requisition/test/ui/purchase_requisition_report.yml similarity index 100% rename from addons/purchase_requisition/test/purchase_requisition_report.yml rename to addons/purchase_requisition/test/ui/purchase_requisition_report.yml From a8b7872502ce9f73ebf4741d3d51152b1ffa19f7 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 31 Oct 2011 18:17:28 +0530 Subject: [PATCH 08/16] [IMP]purchase_requisition: remove the extra code bzr revid: dbr@tinyerp.com-20111031124728-pmrrp4bq5h1iwps5 --- .../purchase_requisition/test/ui/delete_requisition.yml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/addons/purchase_requisition/test/ui/delete_requisition.yml b/addons/purchase_requisition/test/ui/delete_requisition.yml index f3ca08674f4..c077784a73e 100755 --- a/addons/purchase_requisition/test/ui/delete_requisition.yml +++ b/addons/purchase_requisition/test/ui/delete_requisition.yml @@ -1,11 +1,3 @@ -- - In order to test the duplicate order and check duplicate details. -- - I duplicate order. -- - !python {model: purchase.requisition}: | - context.update({'active_id':ref('order_purchase_requisition1')}) - self.copy(cr, uid, ref('order_purchase_requisition1'), context) - In order to test to delete process on purchase requisition order. - From f45e2468bc96a191d82fc1b081e8388c531af1e0 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Wed, 2 Nov 2011 13:05:52 +0530 Subject: [PATCH 09/16] [ADD,IMP] purchase_requisition: [ADD]Add New file for define the main flow of exclusive requisition "purchase_requisition_exclusive.yml" [IMP]Improve the demo data for exclisive code improvement [IMP]Add one new file in __openerp__.py bzr revid: dbr@tinyerp.com-20111102073552-yruxrxuvb9qji3pg --- addons/purchase_requisition/__openerp__.py | 1 + .../purchase_requisition_demo.xml | 42 ++++++++++++++++++- .../purchase_requisition_exclusive.yml | 38 +++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index bbe2551a14e..bf21d7f3232 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -45,6 +45,7 @@ This new object will regroup and will allow you to easily keep track and order a "active": False, "test":[ 'test/process/purchase_requisition.yml', + 'test/process/purchase_requisition_exclusive.yml', 'test/process/cancel_purchase_requisition.yml', 'test/ui/onchange_events.yml', 'test/ui/purchase_requisition_report.yml', diff --git a/addons/purchase_requisition/purchase_requisition_demo.xml b/addons/purchase_requisition/purchase_requisition_demo.xml index deb25fe9e14..728d5fbdffd 100644 --- a/addons/purchase_requisition/purchase_requisition_demo.xml +++ b/addons/purchase_requisition/purchase_requisition_demo.xml @@ -10,7 +10,7 @@ - multiple + exclusive @@ -24,6 +24,46 @@ 5 + + + + + + + + + + + + + + + + + + + + + + + + [CPU1] Processor AMD Athlon XP 1800+ + + + 60 + 3 + + + + + + [CPU3] Processor AMD Athlon XP 2200+ + + + 50 + 13 + + diff --git a/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml new file mode 100644 index 00000000000..d3bb3a5e97e --- /dev/null +++ b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml @@ -0,0 +1,38 @@ +- + Create two PO on based of one tender, + than confirm any one PO the second PO automatically goes in to cancel state. + order_purchase_requisition1 +- + In order to test the exclusive type requisition, I have to create two differ purchase order in one requisition [Tender] +- + I start by Checking the product, Product must have requisition field checked. +- + !record {model: product.product, id: product.product_product_cpu1}: + purchase_requisition: True +- + Checking requisition field for another product. +- + !record {model: product.product, id: product.product_product_cpu3}: + purchase_requisition: True +- + Now check that purchase order's product must have requisition field checked. +- + !python {model: purchase.order}: | + import netsvc + wf_service = netsvc.LocalService("workflow") + pur_order = self.pool.get('purchase.order') + ids = pur_order.search(cr, uid, [('requisition_id','=',ref('order_purchase_requisition1'))]) + po_id = pur_order.browse(cr, uid, ids) + for po in po_id: + for line in po.order_line: + if line.product_id.purchase_requisition == False: + assert line.product_id.purchase_requisition == True, "Purchase Order's product must have requisition field checked" + po_confirm = po_id[0].id + wf_service.trg_validate(uid, 'purchase.order',po_confirm,'purchase_confirm', cr) + assert po_id[0].state == 'approved',"After confirm a purchase order it should be in confirm state" + assert po_id[1].state == 'cancel',"After confirmed a purchase order form the this requisition the second purchase order should be automatically goes in to cancelled state" + + + + + From e90122bb113a6404df6a9efa11c0b5648146f84f Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Wed, 2 Nov 2011 13:08:20 +0530 Subject: [PATCH 10/16] [IMP]purchase_requisition: Remove extra statements bzr revid: dbr@tinyerp.com-20111102073820-kn5zvxgsxpkjmi7i --- .../test/process/purchase_requisition_exclusive.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml index d3bb3a5e97e..d68c12c6366 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml @@ -1,7 +1,3 @@ -- - Create two PO on based of one tender, - than confirm any one PO the second PO automatically goes in to cancel state. - order_purchase_requisition1 - In order to test the exclusive type requisition, I have to create two differ purchase order in one requisition [Tender] - From 85d601efb3333b5d4c0a2c9e841ed3b7930d09e1 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Wed, 2 Nov 2011 15:58:09 +0530 Subject: [PATCH 11/16] [ADD,IMP] purchase_requisition: [ADD]purchase_requisition/test/ui/requisiton2request_quotation.yml [IMP]add new file in __openerp__.py [IMP]Improve code of onchange_events.yml bzr revid: dbr@tinyerp.com-20111102102809-c3cjgz7a331sdawr --- addons/purchase_requisition/__openerp__.py | 3 ++- .../purchase_requisition_exclusive.yml | 4 ---- .../test/ui/onchange_events.yml | 7 +++++- .../test/ui/requisiton2request_quotation.yml | 23 +++++++++++++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 addons/purchase_requisition/test/ui/requisiton2request_quotation.yml diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index bf21d7f3232..426e8a770fc 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -45,7 +45,8 @@ This new object will regroup and will allow you to easily keep track and order a "active": False, "test":[ 'test/process/purchase_requisition.yml', - 'test/process/purchase_requisition_exclusive.yml', + 'test/process/purchase_requisition_exclusive.yml', + 'test/ui/requisiton2request_quotation.yml', 'test/process/cancel_purchase_requisition.yml', 'test/ui/onchange_events.yml', 'test/ui/purchase_requisition_report.yml', diff --git a/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml index d68c12c6366..8a9116de0d3 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml @@ -28,7 +28,3 @@ assert po_id[0].state == 'approved',"After confirm a purchase order it should be in confirm state" assert po_id[1].state == 'cancel',"After confirmed a purchase order form the this requisition the second purchase order should be automatically goes in to cancelled state" - - - - diff --git a/addons/purchase_requisition/test/ui/onchange_events.yml b/addons/purchase_requisition/test/ui/onchange_events.yml index 683edbc6aeb..901c50ca1c9 100644 --- a/addons/purchase_requisition/test/ui/onchange_events.yml +++ b/addons/purchase_requisition/test/ui/onchange_events.yml @@ -20,4 +20,9 @@ - !python {model: purchase.requisition}: | self.tender_reset(cr, uid, ref('order_purchase_requisition1')) - +- + I call onchange event to change the partner of purchase requisition. +- + !python {model: purchase.requisition.partner}: | + self.onchange_partner_id(cr, uid, ref('order_purchase_requisition1'), ref('base.res_partner_desertic_hispafuentes')) + diff --git a/addons/purchase_requisition/test/ui/requisiton2request_quotation.yml b/addons/purchase_requisition/test/ui/requisiton2request_quotation.yml new file mode 100644 index 00000000000..6c0ce5eee0a --- /dev/null +++ b/addons/purchase_requisition/test/ui/requisiton2request_quotation.yml @@ -0,0 +1,23 @@ +- + In order to create a Quotatoion, I click on the wizard 'Request a Quotation' and create record from wizard. +- + !record {model: purchase.requisition.partner, id: purchase_requisition_partner_0}: + partner_address_id: base.res_partner_address_3000 + partner_id: base.res_partner_desertic_hispafuentes +- + I click on 'Create Quotation' for creating PO. +- + !python {model: purchase.requisition.partner}: | + self.create_order(cr, uid, [ref("purchase_requisition_partner_0")], {"active_model": "purchase.requisition", + "active_ids": [ref("order_purchase_requisition1")],"active_id": ref("order_purchase_requisition1"), }) +- + I check that the purchase order is created. +- + !python {model: purchase.order}: | + purchase_ids= self.search(cr, uid, [('requisition_id','=',ref("order_purchase_requisition1"))]) + assert purchase_ids, "Purchase Order is not created from this wizard" + rfq = self.browse(cr, uid, purchase_ids[0]) + assert rfq.state == 'draft',"Purchase Order should be in draft state" + assert rfq.partner_address_id.id == ref('base.res_partner_address_3000'),"Purchase Order Partner address is not correspond" + assert rfq.partner_id.id == ref('base.res_partner_desertic_hispafuentes'),"Purchase Order Partner is not correspond" + From 7b800b5f03c9e1bd86884979b60cb5f7348af6bd Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Wed, 2 Nov 2011 16:15:31 +0530 Subject: [PATCH 12/16] [IMP] purchase_requisition: Improve the code for cancel_purchase_requisition.yml file bzr revid: dbr@tinyerp.com-20111102104531-itiutuktds163710 --- .../process/cancel_purchase_requisition.yml | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml b/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml index cb85b32d044..eeae4689fbc 100644 --- a/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml +++ b/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml @@ -5,4 +5,63 @@ - !python {model: purchase.requisition}: | self.tender_cancel(cr, uid, [ref("order_purchase_requisition1")]) - +- + I check that purchase requisition order is cancelled. +- + !assert {model: purchase.requisition, id: order_purchase_requisition1}: + - state == 'cancel' +- + I change state of requisition in "In progress". +- + !python {model: purchase.requisition}: | + self.tender_in_progress(cr, uid, ref('order_purchase_requisition1')) +- + I check that purchase requisition order is "In progress". +- + !assert {model: purchase.requisition, id: order_purchase_requisition1}: + - state == 'in_progress' +- + I try to cancel "In progress" purchase requisition order. +- + !python {model: purchase.requisition}: | + self.tender_cancel(cr, uid, [ref("order_purchase_requisition1")]) +- + I check that purchase requisition order is cancelled. +- + !assert {model: purchase.requisition, id: order_purchase_requisition1}: + - state == 'cancel' +- + I reset the state of requisition as "New". +- + !python {model: purchase.requisition}: | + self.tender_reset(cr, uid, ref('order_purchase_requisition1')) +- + I check that purchase requisition order is New. +- + !assert {model: purchase.requisition, id: order_purchase_requisition1}: + - state == 'draft' +- + I change state of requisition as "done". +- + !python {model: purchase.requisition}: | + self.tender_done(cr, uid, ref('order_purchase_requisition1')) +- + I check that purchase requisition order is Done. +- + !assert {model: purchase.requisition, id: order_purchase_requisition1}: + - state == 'done' +- + I try to cancel 'Done' purchase requisition order. +- + !python {model: purchase.requisition}: | + self.tender_cancel(cr, uid, [ref("order_purchase_requisition1")]) +- + I check that purchase requisition order is cancelled. +- + !assert {model: purchase.requisition, id: order_purchase_requisition1}: + - state == 'cancel' +- + I reset the state of requisition as "New". +- + !python {model: purchase.requisition}: | + self.tender_reset(cr, uid, ref('order_purchase_requisition1')) From c7363ab6a2fe17b2df3486ec251d16f5a628d607 Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 28 Nov 2011 11:43:07 +0530 Subject: [PATCH 13/16] [IMP]purchase_requisition: Improve the test case's statements bzr revid: dbr@tinyerp.com-20111128061307-8c7452lyvsin0qcn --- .../test/process/cancel_purchase_requisition.yml | 14 ++++++++++---- .../test/process/purchase_requisition.yml | 9 +++------ .../process/purchase_requisition_exclusive.yml | 12 ++++++++---- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml b/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml index eeae4689fbc..b065dfcff08 100644 --- a/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml +++ b/addons/purchase_requisition/test/process/cancel_purchase_requisition.yml @@ -1,7 +1,7 @@ - - In order to test the cancel purchase requisition order. + In order to test the cancel flow of purchase requisition order. - - I try to cancel purchase requisition order. + I cancel the "New" purchase requisition order. - !python {model: purchase.requisition}: | self.tender_cancel(cr, uid, [ref("order_purchase_requisition1")]) @@ -10,6 +10,11 @@ - !assert {model: purchase.requisition, id: order_purchase_requisition1}: - state == 'cancel' +- + I reset the state of requisition as "New". +- + !python {model: purchase.requisition}: | + self.tender_reset(cr, uid, ref('order_purchase_requisition1')) - I change state of requisition in "In progress". - @@ -51,7 +56,7 @@ !assert {model: purchase.requisition, id: order_purchase_requisition1}: - state == 'done' - - I try to cancel 'Done' purchase requisition order. + I try to cancel "Done" purchase requisition order. - !python {model: purchase.requisition}: | self.tender_cancel(cr, uid, [ref("order_purchase_requisition1")]) @@ -64,4 +69,5 @@ I reset the state of requisition as "New". - !python {model: purchase.requisition}: | - self.tender_reset(cr, uid, ref('order_purchase_requisition1')) + self.tender_reset(cr, uid, ref('order_purchase_requisition1')) + diff --git a/addons/purchase_requisition/test/process/purchase_requisition.yml b/addons/purchase_requisition/test/process/purchase_requisition.yml index 3be7e2a9ea9..d1c6fe8eb84 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition.yml @@ -1,18 +1,15 @@ - - In order to test the purchase requisition module, I have to checked a boolean field 'purchase requisition' in product, - If I checked it then it's requisition will be create. + In order to test the purchase requisition module, I have to checked product's boolean field 'purchase requisition'. - I start by Checking the product, Product must have requisition field checked. - and Product supply method is buy and the procure method is make to order. - !record {model: product.product, id: product.product_product_hdd3}: - supply_method: 'buy' purchase_requisition: True - - I create the procurement order for the product and after run that procurement for create purchase requisition. + I create the product's procurement order and run that procurement. + After Run the procurement I check created purchase requisition [Tender]. - !python {model: product.product}: | - import time import netsvc mk_proc = self.pool.get('make.procurement') proc_order = self.pool.get('procurement.order') diff --git a/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml index 8a9116de0d3..e5f7f61a5fd 100644 --- a/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml +++ b/addons/purchase_requisition/test/process/purchase_requisition_exclusive.yml @@ -1,17 +1,21 @@ - - In order to test the exclusive type requisition, I have to create two differ purchase order in one requisition [Tender] + In order to test the exclusive type requisition, I have to create two differ purchase order of one requisition [Tender] - - I start by Checking the product, Product must have requisition field checked. + I select purchase requisition of '[CPU1] Processor AMD Athlon XP 1800+' and '[CPU3] Processor AMD Athlon XP 2200+'. + So, those products must have requisition field checked. +- + I start by Checking requisition field for '[CPU1] Processor AMD Athlon XP 1800+' product. - !record {model: product.product, id: product.product_product_cpu1}: purchase_requisition: True - - Checking requisition field for another product. + Checked requisition field for '[CPU3] Processor AMD Athlon XP 2200+' product. - !record {model: product.product, id: product.product_product_cpu3}: purchase_requisition: True - - Now check that purchase order's product must have requisition field checked. + I search the purchase orders which have exclusive purchase requisition 'TE00001' and confirm any one of them. + Then check the remaining purchase orders goes in to cancel state. - !python {model: purchase.order}: | import netsvc From b281d832197aaa73edc6ffd986c5a81ef723d6fa Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 28 Nov 2011 11:54:22 +0530 Subject: [PATCH 14/16] [IMP,REMOVE]purchase_requisition: Remove onchange_events.yml Improve the requisition2request_quotation.yml and __openerp__.py bzr revid: dbr@tinyerp.com-20111128062422-1l7jopbjkwajc3dc --- addons/purchase_requisition/__openerp__.py | 1 - .../test/ui/onchange_events.yml | 28 ------------------- .../test/ui/requisiton2request_quotation.yml | 6 ++-- 3 files changed, 3 insertions(+), 32 deletions(-) delete mode 100644 addons/purchase_requisition/test/ui/onchange_events.yml diff --git a/addons/purchase_requisition/__openerp__.py b/addons/purchase_requisition/__openerp__.py index 426e8a770fc..67c916aefae 100644 --- a/addons/purchase_requisition/__openerp__.py +++ b/addons/purchase_requisition/__openerp__.py @@ -48,7 +48,6 @@ This new object will regroup and will allow you to easily keep track and order a 'test/process/purchase_requisition_exclusive.yml', 'test/ui/requisiton2request_quotation.yml', 'test/process/cancel_purchase_requisition.yml', - 'test/ui/onchange_events.yml', 'test/ui/purchase_requisition_report.yml', 'test/ui/delete_requisition.yml', ], diff --git a/addons/purchase_requisition/test/ui/onchange_events.yml b/addons/purchase_requisition/test/ui/onchange_events.yml deleted file mode 100644 index 901c50ca1c9..00000000000 --- a/addons/purchase_requisition/test/ui/onchange_events.yml +++ /dev/null @@ -1,28 +0,0 @@ -- - In order to test the onchange events of purchase requisition. -- - I call onchange event to change the product of purchase requisition line. -- - !python {model: purchase.requisition.line}: | - self.onchange_product_id(cr, uid, [ref('order_purchase_requisition1')],ref('product.product_product_hdd2'), ref('product.product_uom_unit')) -- - I change state of requisition in "In progress". -- - !python {model: purchase.requisition}: | - self.tender_in_progress(cr, uid, ref('order_purchase_requisition1')) -- - I change state of requisition as "done". -- - !python {model: purchase.requisition}: | - self.tender_done(cr, uid, ref('order_purchase_requisition1')) -- - I reset the state of requisition as "New". -- - !python {model: purchase.requisition}: | - self.tender_reset(cr, uid, ref('order_purchase_requisition1')) -- - I call onchange event to change the partner of purchase requisition. -- - !python {model: purchase.requisition.partner}: | - self.onchange_partner_id(cr, uid, ref('order_purchase_requisition1'), ref('base.res_partner_desertic_hispafuentes')) - diff --git a/addons/purchase_requisition/test/ui/requisiton2request_quotation.yml b/addons/purchase_requisition/test/ui/requisiton2request_quotation.yml index 6c0ce5eee0a..722ab6df591 100644 --- a/addons/purchase_requisition/test/ui/requisiton2request_quotation.yml +++ b/addons/purchase_requisition/test/ui/requisiton2request_quotation.yml @@ -5,13 +5,13 @@ partner_address_id: base.res_partner_address_3000 partner_id: base.res_partner_desertic_hispafuentes - - I click on 'Create Quotation' for creating PO. + I click on 'Create Quotation' for creating a Quatation. - !python {model: purchase.requisition.partner}: | self.create_order(cr, uid, [ref("purchase_requisition_partner_0")], {"active_model": "purchase.requisition", "active_ids": [ref("order_purchase_requisition1")],"active_id": ref("order_purchase_requisition1"), }) - - I check that the purchase order is created. + I check that the purchase order created. - !python {model: purchase.order}: | purchase_ids= self.search(cr, uid, [('requisition_id','=',ref("order_purchase_requisition1"))]) @@ -20,4 +20,4 @@ assert rfq.state == 'draft',"Purchase Order should be in draft state" assert rfq.partner_address_id.id == ref('base.res_partner_address_3000'),"Purchase Order Partner address is not correspond" assert rfq.partner_id.id == ref('base.res_partner_desertic_hispafuentes'),"Purchase Order Partner is not correspond" - + From 54d2f76703983cf2ed11e260723f606d9a4234fb Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 28 Nov 2011 12:39:51 +0530 Subject: [PATCH 15/16] [REMOVE]purchase_requisition: remove duplicate_requisition.yml bzr revid: dbr@tinyerp.com-20111128070951-1pogxrrc3921tv24 --- .../test/ui/duplicate_requisition.yml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 addons/purchase_requisition/test/ui/duplicate_requisition.yml diff --git a/addons/purchase_requisition/test/ui/duplicate_requisition.yml b/addons/purchase_requisition/test/ui/duplicate_requisition.yml deleted file mode 100644 index 742500d865d..00000000000 --- a/addons/purchase_requisition/test/ui/duplicate_requisition.yml +++ /dev/null @@ -1,8 +0,0 @@ -- - In order to test the duplicate order and check duplicate details. -- - I duplicate order. -- - !python {model: purchase.requisition}: | - context.update({'active_id':ref('order_purchase_requisition1')}) - self.copy(cr, uid, ref('order_purchase_requisition1'), context) From 6ced5c16c1b269f3820588156c0ba197c55e498e Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Fri, 2 Dec 2011 12:57:55 +0530 Subject: [PATCH 16/16] [REF] purchase_requisition: purchase_requisition/wizard/purchase_requisition_partner.py * [REF] In create_order() method, move stuff of creating purchase order into 'purchase.requisition' object. purchase_requisition/purchase_requisition.py * [ADD] introduce new method: make_purchase_order() - to create new RFQ of specified supplier with plannned date, price bzr revid: hmo@tinyerp.com-20111202072755-e3ura2cmnh78utet --- .../purchase_requisition.py | 88 ++++++++++++++++- .../test/purchase_requisition.yml | 9 +- .../wizard/purchase_requisition_partner.py | 95 +------------------ 3 files changed, 95 insertions(+), 97 deletions(-) diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py index 8570f4ba7bb..cc0956b8755 100644 --- a/addons/purchase_requisition/purchase_requisition.py +++ b/addons/purchase_requisition/purchase_requisition.py @@ -19,7 +19,8 @@ # along with this program. If not, see . # ############################################################################## - +from datetime import datetime +from dateutil.relativedelta import relativedelta import time import netsvc @@ -83,6 +84,89 @@ class purchase_requisition(osv.osv): self.write(cr, uid, ids, {'state':'done', 'date_end':time.strftime('%Y-%m-%d %H:%M:%S')}, context=context) return True + 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): + product_uom = self.pool.get('product.uom') + pricelist = self.pool.get('product.pricelist') + supplier_info = self.pool.get("product.supplierinfo") + product = requisition_line.product_id + default_uom_po_id = product.uom_po_id.id + 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, False, {'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 + + def make_purchase_order(self, cr, uid, ids, partner_id, context=None): + """ + Create New RFQ for Supplier + """ + if context is None: + context = {} + assert partner_id, 'Supplier should be specified' + purchase_order = self.pool.get('purchase.order') + purchase_order_line = self.pool.get('purchase.order.line') + res_partner = self.pool.get('res.partner') + fiscal_position = self.pool.get('account.fiscal.position') + supplier = res_partner.browse(cr, uid, partner_id, context=context) + delivery_address_id = res_partner.address_get(cr, uid, [supplier.id], ['delivery'])['delivery'] + supplier_pricelist = supplier.property_product_pricelist_purchase or False + res = {} + for requisition in self.browse(cr, uid, ids, context=context): + if supplier.id in filter(lambda x: x, [rfq.state <> 'cancel' and rfq.partner_id.id or None for rfq in requisition.purchase_ids]): + raise osv.except_osv(_('Warning'), _('You have already one %s purchase order for this partner, you must cancel this purchase order to create a new quotation.') % supp_record.state) + location_id = requisition.warehouse_id.lot_input_id.id + purchase_id = purchase_order.create(cr, uid, { + 'origin': requisition.name, + 'partner_id': supplier.id, + 'partner_address_id': delivery_address_id, + 'pricelist_id': supplier_pricelist.id, + 'location_id': location_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, + 'warehouse_id':requisition.warehouse_id.id , + }) + res[requisition.id] = purchase_id + for line in requisition.line_ids: + product = line.product_id + seller_price, qty, default_uom_po_id, date_planned = self._seller_details(cr, uid, line, supplier, context=context) + taxes_ids = product.supplier_taxes_id + taxes = fiscal_position.map_tax(cr, uid, supplier.property_account_position, taxes_ids) + purchase_order_line.create(cr, uid, { + 'order_id': purchase_id, + 'name': product.partner_ref, + 'product_qty': qty, + 'product_id': product.id, + 'product_uom': default_uom_po_id, + 'price_unit': seller_price, + 'date_planned': date_planned, + 'notes': product.description_purchase, + 'taxes_id': [(6, 0, taxes)], + }, context=context) + + return res + purchase_requisition() class purchase_requisition_line(osv.osv): @@ -96,7 +180,7 @@ class purchase_requisition_line(osv.osv): 'product_uom_id': fields.many2one('product.uom', 'Product UoM'), 'product_qty': fields.float('Quantity', digits_compute=dp.get_precision('Product UoM')), 'requisition_id' : fields.many2one('purchase.requisition','Purchase Requisition', ondelete='cascade'), - 'company_id': fields.many2one('res.company', 'Company', required=True), + 'company_id': fields.related('requisition_id','company_id',type='many2one',relation='res.company',string='Company', store=True, readonly=True), } def onchange_product_id(self, cr, uid, ids, product_id,product_uom_id, context=None): diff --git a/addons/purchase_requisition/test/purchase_requisition.yml b/addons/purchase_requisition/test/purchase_requisition.yml index a2f9d5851d1..a2e5b743965 100644 --- a/addons/purchase_requisition/test/purchase_requisition.yml +++ b/addons/purchase_requisition/test/purchase_requisition.yml @@ -50,6 +50,7 @@ I check that the RFQ details which created for supplier. - !python {model: purchase.order}: | + purchase_requisition = self.pool.get("purchase.requisition") purchase_ids = self.search(cr, uid, [('requisition_id','=',ref("requisition1"))]) assert purchase_ids, "RFQ is not created." rfq = self.browse(cr, uid, purchase_ids[0], context=context) @@ -60,10 +61,10 @@ for rfq_line in rfq.order_line: for line in requisition.line_ids: if rfq_line.product_id.id == line.product_id.id: - product = line.product_id - uom_id = line.product_uom_id.id or False - assert rfq_line.product_qty == line.product_qty, "Quantity is not correspond." - assert rfq_line.product_uom.id == uom_id, "UOM is not correspond." + seller_price, qty, default_uom_po_id, date_planned = purchase_requisition._seller_details(cr, uid, line, supplier, context=context) + assert rfq_line.product_qty == qty, "Quantity is not correspond." + assert rfq_line.product_uom.id == default_uom_po_id, "UOM is not correspond." + assert rfq_line.price_unit == seller_price, "Unit Price is not correspond." - I confirmed RFQ which has best price. - diff --git a/addons/purchase_requisition/wizard/purchase_requisition_partner.py b/addons/purchase_requisition/wizard/purchase_requisition_partner.py index 3a758fc46a9..043ed749f4b 100644 --- a/addons/purchase_requisition/wizard/purchase_requisition_partner.py +++ b/addons/purchase_requisition/wizard/purchase_requisition_partner.py @@ -20,8 +20,6 @@ ############################################################################## import time -from datetime import datetime -from dateutil.relativedelta import relativedelta from osv import fields, osv from osv.orm import browse_record, browse_null from tools.translate import _ @@ -42,7 +40,7 @@ class purchase_requisition_partner(osv.osv_memory): tender = self.pool.get('purchase.requisition').browse(cr, uid, record_id, context=context) if not tender.line_ids: raise osv.except_osv(_('Error!'), _('No Product in Tender')) - True + return res def onchange_partner_id(self, cr, uid, ids, partner_id): if not partner_id: @@ -52,94 +50,9 @@ class purchase_requisition_partner(osv.osv_memory): return {'value':{'partner_address_id': addr['default']}} def create_order(self, cr, uid, ids, context=None): - """ - To Create a purchase orders . - - @param self: The object pointer. - @param cr: A database cursor - @param uid: ID of the user currently logged in - @param ids: the ID or list of IDs - @param context: A standard dictionary - @return: {} - - """ - if context is None: - context = {} - record_ids = context and context.get('active_ids', False) - if record_ids: - data = self.browse(cr, uid, ids,context=context)[0] - company = self.pool.get('res.users').browse(cr, uid, uid, context).company_id - order_obj = self.pool.get('purchase.order') - order_line_obj = self.pool.get('purchase.order.line') - partner_obj = self.pool.get('res.partner') - tender_line_obj = self.pool.get('purchase.requisition.line') - pricelist_obj = self.pool.get('product.pricelist') - prod_obj = self.pool.get('product.product') - tender_obj = self.pool.get('purchase.requisition') - acc_pos_obj = self.pool.get('account.fiscal.position') - partner_id = data.partner_id.id - supplier_data = data.partner_id - address_id = partner_obj.address_get(cr, uid, [partner_id], ['delivery'])['delivery'] - list_line=[] - purchase_order_line={} - for tender in tender_obj.browse(cr, uid, record_ids, context=context): - for supp_record in tender.purchase_ids: - if supp_record.partner_id.id == partner_id and supp_record.state <> 'cancel': - raise osv.except_osv(_('Warning'), _('You have already one %s purchase order for this partner, you must cancel this purchase order to create a new quotation.') % supp_record.state) - for line in tender.line_ids: - partner_list = sorted([(partner.sequence, partner) for partner in line.product_id.seller_ids if partner]) - partner_rec = partner_list and partner_list[0] and partner_list[0][1] or False - uom_id = line.product_id.uom_po_id and line.product_id.uom_po_id.id or False - - if tender.date_start: - newdate = datetime.strptime(tender.date_start, '%Y-%m-%d %H:%M:%S') - relativedelta(days=company.po_lead) - else: - newdate = datetime.today() - relativedelta(days=company.po_lead) - delay = partner_rec and partner_rec.delay or 0.0 - if delay: - newdate -= relativedelta(days=delay) - - partner = partner_rec and partner_rec.name or supplier_data - pricelist_id = partner.property_product_pricelist_purchase and partner.property_product_pricelist_purchase.id or False - price = pricelist_obj.price_get(cr, uid, [pricelist_id], line.product_id.id, line.product_qty, False, {'uom': uom_id})[pricelist_id] - product = prod_obj.browse(cr, uid, line.product_id.id, context=context) - location_id = self.pool.get('stock.warehouse').read(cr, uid, [tender.warehouse_id.id], ['lot_input_id'])[0]['lot_input_id'][0] - - purchase_order_line= { - 'name': product.partner_ref, - 'product_qty': line.product_qty, - 'product_id': line.product_id.id, - 'product_uom': uom_id, - 'price_unit': price, - 'date_planned': newdate.strftime('%Y-%m-%d %H:%M:%S'), - 'notes': product.description_purchase, - } - taxes_ids = line.product_id.product_tmpl_id.supplier_taxes_id - taxes = acc_pos_obj.map_tax(cr, uid, partner.property_account_position, taxes_ids) - purchase_order_line.update({ - 'taxes_id': [(6,0,taxes)] - }) - list_line.append(purchase_order_line) - purchase_id = order_obj.create(cr, uid, { - 'origin': tender.purchase_ids and tender.purchase_ids[0].origin or tender.name, - 'partner_id': partner_id, - 'partner_address_id': address_id, - 'pricelist_id': pricelist_id, - 'location_id': tender.purchase_ids and tender.purchase_ids[0].location_id.id or line.product_id.product_tmpl_id.property_stock_production.id, - 'company_id': tender.company_id.id, - 'fiscal_position': partner.property_account_position and partner.property_account_position.id or False, - 'requisition_id':tender.id, - 'notes':tender.description, - 'warehouse_id':tender.warehouse_id.id and tender.warehouse_id.id , - 'location_id':location_id, - 'company_id':tender.company_id.id, - }) - order_ids=[] - for order_line in list_line: - order_line.update({ - 'order_id': purchase_id - }) - order_line_obj.create(cr,uid,order_line) + active_ids = context and context.get('active_ids', []) + data = self.browse(cr, uid, ids, context=context)[0] + self.pool.get('purchase.requisition').make_purchase_order(cr, uid, active_ids, data.partner_id.id, context=context) return {'type': 'ir.actions.act_window_close'} purchase_requisition_partner()