+
+
+
+
+
@@ -164,7 +222,7 @@
- Purchase Tenders
+ Purchase Agreements
ir.actions.act_window
purchase.requisition
form
@@ -173,13 +231,18 @@
- Click to start a new Call for Tenders process.
+ Click to start a new purchase agreement.
- A Call for Tenders is a procedure for generating competing offers from
- different bidders. In the call for tenders, you can record the
- products you need to buy and generate the creation of RfQs to
- vendors. Once the tenders have been registered, you can review and
- compare them and you can validate some and cancel others.
+ Example of purchase agreements include call for tenders and blanket orders.
+
+ In a call for tenders, you can record the products you need to buy
+ and generate the creation of RfQs to vendors. Once the tenders have
+ been registered, you can review and compare them and you can
+ validate some and cancel others.
+
+ For a blanket order, you can record an agreement for a specifc period
+ (e.g. a year) and you order products within this agreement, benefiting
+ from the negociated prices.
@@ -219,40 +282,5 @@
res_model="purchase.order"
src_model="purchase.requisition"/>
-
-
- purchase.order.line.tree.tender
- purchase.order.line
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Tender Lines
- purchase.order.line
- {"search_default_groupby_product" : True,}
- form
- tree_purchase_order_line_compare
-
-
-
-
diff --git a/addons/purchase_requisition/purchase_requisition_workflow.xml b/addons/purchase_requisition/purchase_requisition_workflow.xml
deleted file mode 100644
index fb2524562c1..00000000000
--- a/addons/purchase_requisition/purchase_requisition_workflow.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
- 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
-
-
-
diff --git a/addons/purchase_requisition/security/ir.model.access.csv b/addons/purchase_requisition/security/ir.model.access.csv
index 4c6b8d8cdde..f31808d0139 100644
--- a/addons/purchase_requisition/security/ir.model.access.csv
+++ b/addons/purchase_requisition/security/ir.model.access.csv
@@ -1,4 +1,6 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_purchase_requisition_type,purchase.requisition.type,model_purchase_requisition_type,purchase.group_purchase_user,1,0,0,0
+access_purchase_requisition_type_manager,purchase.requisition.type,model_purchase_requisition_type,purchase.group_purchase_manager,1,1,1,1
access_purchase_requisition,purchase.requisition,model_purchase_requisition,purchase.group_purchase_user,1,1,1,1
access_purchase_requisition_line_purchase_user,purchase.requisition.line,model_purchase_requisition_line,purchase.group_purchase_user,1,1,1,1
access_purchase_requisition_manager,purchase.requisition manager,model_purchase_requisition,purchase.group_purchase_manager,1,0,0,0
diff --git a/addons/purchase_requisition/static/src/js/web_addons.js b/addons/purchase_requisition/static/src/js/web_addons.js
deleted file mode 100644
index fd74006a850..00000000000
--- a/addons/purchase_requisition/static/src/js/web_addons.js
+++ /dev/null
@@ -1,38 +0,0 @@
-odoo.define('purchase_requisition.purchase_requisition', function (require) {
-"use strict";
-
-var core = require('web.core');
-var Model = require('web.DataModel');
-var ListView = require('web.ListView');
-
-var QWeb = core.qweb;
-var _t = core._t;
-
-
-var CompareListView = ListView.extend({
- render_buttons: function ($node) {
- if (!this.$buttons) {
- this.$buttons = $(QWeb.render("CompareListView.buttons", {'widget': this}));
-
- this.$buttons.find('.oe_generate_po').click(this.proxy('generate_purchase_order'));
-
- $node = $node || this.options.$buttons;
- if ($node) {
- this.$buttons.appendTo($node);
- } else {
- this.$('.oe_list_buttons').replaceWith(this.$buttons);
- }
- }
- },
-
- generate_purchase_order: function () {
- var self = this;
- new Model(self.dataset.model).call("generate_po",[self.dataset.context.tender_id,self.dataset.context]).then(function(result) {
- self.ViewManager.action_manager.history_back();
- });
- },
-});
-
-core.view_registry.add('tree_purchase_order_line_compare', CompareListView);
-
-});
diff --git a/addons/purchase_requisition/static/src/xml/purchase_requisition.xml b/addons/purchase_requisition/static/src/xml/purchase_requisition.xml
deleted file mode 100644
index 0706f2877fd..00000000000
--- a/addons/purchase_requisition/static/src/xml/purchase_requisition.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/addons/purchase_requisition/test/cancel_purchase_requisition.yml b/addons/purchase_requisition/test/cancel_purchase_requisition.yml
index 71111d89e0f..d0ebd43a7ec 100644
--- a/addons/purchase_requisition/test/cancel_purchase_requisition.yml
+++ b/addons/purchase_requisition/test/cancel_purchase_requisition.yml
@@ -7,7 +7,7 @@
I cancel requisition.
-
!python {model: purchase.requisition}: |
- self.tender_cancel(cr, uid, [ref("requisition1")])
+ self.action_cancel(cr, uid, [ref("requisition1")])
-
I check requisition after cancelled.
-
@@ -17,7 +17,7 @@
I reset requisition as "New".
-
!python {model: purchase.requisition}: |
- self.tender_reset(cr, uid, [ref('requisition1')])
+ self.action_draft(cr, uid, [ref('requisition1')])
-
I duplicate requisition.
-
diff --git a/addons/purchase_requisition/test/purchase_requisition.yml b/addons/purchase_requisition/test/purchase_requisition.yml
index ad8b5914a42..64accb7de5d 100644
--- a/addons/purchase_requisition/test/purchase_requisition.yml
+++ b/addons/purchase_requisition/test/purchase_requisition.yml
@@ -31,60 +31,3 @@
assert line.product_id.id == procurement.product_id.id, "Product is not correspond."
assert line.product_uom_id.id == procurement.product_uom.id, "UOM is not correspond."
assert float_compare(line.product_qty, procurement.product_qty, precision_digits=2) == 0, "Quantity is not correspond."
--
- I send the purchase order associated to the requisition.
--
- !python {model: purchase.requisition}: |
- po = self.pool.get('purchase.order')
- for element in self.browse(cr, uid, [ref("requisition1")], context=context):
- for purchase in element.purchase_ids:
- po.write(cr, uid, purchase.id, {'state': 'sent'}, context=context)
-
--
- Give access rights of Purchase Requisition User to open requisition
--
- !context
- uid: 'res_users_purchase_requisition_user'
--
- I open another requisition and set tender state to choose tendering line.
--
- !python {model: purchase.requisition}: |
- self.tender_in_progress(cr, uid, [ref("requisition1")], context=context)
- self.tender_open(cr, uid, [ref("requisition1")], context=context)
--
- Vendor send one RFQ so I create requisition request of that supplier.
--
- !python {model: purchase.requisition.partner}: |
- context.update({"active_model": "purchase.requisition","active_ids": [ref("requisition1")],"active_id": ref("requisition1")})
--
- !record {model: purchase.requisition.partner, id: requisition_partner_0}:
- partner_ids: [base.res_partner_12]
--
- !python {model: purchase.requisition.partner}: |
- context.update({"mail_create_nolog" : True })
- self.create_order(cr, uid, [ref("requisition_partner_0")], context=context)
--
- 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."
- for rfq in self.browse(cr, uid, purchase_ids, context=context):
- if rfq.partner_id.id == ref('base.res_partner_12'):
- break
- else:
- assert False, "No PO found for res_partner_12."
--
- I confirmed RFQ which has best price.
--
- !python {model: purchase.order}: |
- purchase = self.browse(cr, uid, ref('rfq2'), context=context)
- purchase.signal_workflow('purchase_confirm')
-
--
- I check status of requisition after confirmed best RFQ.
--
- !python {model: purchase.requisition}: |
- requisition = self.browse(cr, uid, ref('requisition1'), context=context)
- requisition.state == 'done', "Requisition should be closed."
diff --git a/addons/purchase_requisition/test/purchase_requisition_demo.yml b/addons/purchase_requisition/test/purchase_requisition_demo.yml
index 8265e6c72da..e7526895ba6 100644
--- a/addons/purchase_requisition/test/purchase_requisition_demo.yml
+++ b/addons/purchase_requisition/test/purchase_requisition_demo.yml
@@ -5,11 +5,30 @@
uid: 'res_users_purchase_requisition_user'
-
In order to test process of the purchase requisition ,I create requisition
--
+-
!record {model: purchase.requisition, id: requisition1}:
- exclusive: exclusive
line_ids:
- product_id: product.product_product_9
product_qty: 10.0
product_uom_id: product.product_uom_unit
-
+-
+ I create another requisition and set tender state to choose tendering line.
+-
+ !record {model: purchase.requisition, id: requisition2}:
+ line_ids:
+ - product_id: product.product_product_9
+ product_qty: 10.0
+ product_uom_id: product.product_uom_unit
+-
+ !python {model: purchase.requisition}: |
+ self.action_in_progress(cr, uid, [ref("requisition2")], context=context)
+ self.action_open(cr, uid, [ref("requisition2")], context=context)
+-
+ Vendor send one RFQ so I create a RfQ of that agreement.
+-
+ !record {model: purchase.order, id: po_requisition}:
+ partner_id: base.res_partner_1
+ requisition_id: purchase_requisition.requisition2
+-
+ !python {model: purchase.order, id: po_requisition}: |
+ assert len(self.order_line)==1, 'Purchase order should have one line'
diff --git a/addons/purchase_requisition/views/purchase_requisition.xml b/addons/purchase_requisition/views/purchase_requisition.xml
deleted file mode 100644
index c3619497f89..00000000000
--- a/addons/purchase_requisition/views/purchase_requisition.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/addons/purchase_requisition/views/report_purchaserequisition.xml b/addons/purchase_requisition/views/report_purchaserequisition.xml
index 940079b0cdc..1250b305a0e 100644
--- a/addons/purchase_requisition/views/report_purchaserequisition.xml
+++ b/addons/purchase_requisition/views/report_purchaserequisition.xml
@@ -21,8 +21,7 @@
Selection Type:
- Purchase Requisitions (exclusive)
- Multiple Requisitions
+ Multiple Requisitions
Source:
diff --git a/addons/purchase_requisition/wizard/__init__.py b/addons/purchase_requisition/wizard/__init__.py
deleted file mode 100644
index 533c9061d0b..00000000000
--- a/addons/purchase_requisition/wizard/__init__.py
+++ /dev/null
@@ -1,5 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-import purchase_requisition_partner
-import bid_line_qty
diff --git a/addons/purchase_requisition/wizard/bid_line_qty.py b/addons/purchase_requisition/wizard/bid_line_qty.py
deleted file mode 100644
index a564c2ab3df..00000000000
--- a/addons/purchase_requisition/wizard/bid_line_qty.py
+++ /dev/null
@@ -1,18 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from openerp.osv import fields, osv
-import openerp.addons.decimal_precision as dp
-
-class bid_line_qty(osv.osv_memory):
- _name = "bid.line.qty"
- _description = "Change Bid line quantity"
- _columns = {
- 'qty': fields.float('Quantity', digits_compute=dp.get_precision('Product Unit of Measure'), required=True),
- }
-
- def change_qty(self, cr, uid, ids, context=None):
- active_ids = context and context.get('active_ids', [])
- data = self.browse(cr, uid, ids, context=context)[0]
- self.pool.get('purchase.order.line').write(cr, uid, active_ids, {'quantity_tendered': data.qty})
- return {'type': 'ir.actions.act_window_close'}
diff --git a/addons/purchase_requisition/wizard/bid_line_qty_view.xml b/addons/purchase_requisition/wizard/bid_line_qty_view.xml
deleted file mode 100644
index 160b44964e1..00000000000
--- a/addons/purchase_requisition/wizard/bid_line_qty_view.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
- Quantity to Purchase
- bid.line.qty
-
-
-
-
-
-
- Bid Line Qty
- ir.actions.act_window
- bid.line.qty
- form
- form
- {'record_id' : active_id}
- new
-
-
-
diff --git a/addons/purchase_requisition/wizard/purchase_requisition_partner.py b/addons/purchase_requisition/wizard/purchase_requisition_partner.py
deleted file mode 100644
index 2fabb1fe31a..00000000000
--- a/addons/purchase_requisition/wizard/purchase_requisition_partner.py
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-# Part of Odoo. See LICENSE file for full copyright and licensing details.
-
-from openerp.osv import fields, osv
-from openerp.tools.translate import _
-from openerp.exceptions import UserError
-
-class purchase_requisition_partner(osv.osv_memory):
- _name = "purchase.requisition.partner"
- _description = "Purchase Requisition Partner"
- _columns = {
- 'partner_ids': fields.many2many('res.partner', 'purchase_requisition_supplier_rel', 'requisition_id', 'partner_id', string='Vendors', required=True, domain=[('supplier', '=', True)])
- }
-
- def view_init(self, cr, uid, fields_list, context=None):
- if context is None:
- context = {}
- res = super(purchase_requisition_partner, self).view_init(cr, uid, fields_list, context=context)
- record_id = context and context.get('active_id', False) or False
- tender = self.pool.get('purchase.requisition').browse(cr, uid, record_id, context=context)
- if not tender.line_ids:
- raise UserError(_('Define product(s) you want to include in the call for tenders.'))
- return res
-
- def create_order(self, cr, uid, ids, context=None):
- active_ids = context and context.get('active_ids', [])
- purchase_requisition = self.pool.get('purchase.requisition')
- for wizard in self.browse(cr, uid, ids, context=context):
- for partner_id in wizard.partner_ids:
- purchase_requisition.make_purchase_order(cr, uid, active_ids, partner_id.id, context=context)
- return {'type': 'ir.actions.act_window_close'}
diff --git a/addons/purchase_requisition/wizard/purchase_requisition_partner_view.xml b/addons/purchase_requisition/wizard/purchase_requisition_partner_view.xml
deleted file mode 100644
index a01a5f7d15d..00000000000
--- a/addons/purchase_requisition/wizard/purchase_requisition_partner_view.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
-
- Choose Vendor
- purchase.requisition.partner
-
-
-
-
-
-
- Choose Vendor
- ir.actions.act_window
- purchase.requisition.partner
- form
- form
- {'record_id' : active_id}
- new
-
-
-
-