diff --git a/addons/purchase_requisition/purchase_requisition.py b/addons/purchase_requisition/purchase_requisition.py
index 40a8540cf9b..cdbe175f2fe 100644
--- a/addons/purchase_requisition/purchase_requisition.py
+++ b/addons/purchase_requisition/purchase_requisition.py
@@ -1,7 +1,9 @@
# -*- encoding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from datetime import datetime
from openerp.osv import fields, osv
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
from openerp.tools.translate import _
import openerp.addons.decimal_precision as dp
from openerp.exceptions import UserError
@@ -61,7 +63,7 @@ class purchase_requisition(osv.osv):
# try to set all associated quotations to cancel state
for tender in self.browse(cr, uid, ids, context=context):
for purchase_order in tender.purchase_ids:
- purchase_order_obj.action_cancel(cr, uid, [purchase_order.id], context=context)
+ purchase_order_obj.button_cancel(cr, uid, [purchase_order.id], context=context)
purchase_order_obj.message_post(cr, uid, [purchase_order.id], body=_('Cancelled by the tender associated to this quotation.'), context=context)
return self.write(cr, uid, ids, {'state': 'cancel'})
@@ -120,9 +122,8 @@ class purchase_requisition(osv.osv):
'date_order': requisition.date_end or fields.datetime.now(),
'partner_id': supplier.id,
'currency_id': requisition.company_id and requisition.company_id.currency_id.id,
- 'location_id': requisition.procurement_id and requisition.procurement_id.location_id.id or requisition.picking_type_id.default_location_dest_id.id,
'company_id': requisition.company_id.id,
- 'fiscal_position_id': supplier.property_account_position_id and supplier.property_account_position_id.id or False,
+ 'fiscal_position_id': self.pool.get('account.fiscal.position').get_fiscal_position(cr, uid, supplier.id, context=context),
'requisition_id': requisition.id,
'notes': requisition.description,
'picking_type_id': requisition.picking_type_id.id
@@ -131,6 +132,7 @@ class purchase_requisition(osv.osv):
def _prepare_purchase_order_line(self, cr, uid, requisition, requisition_line, purchase_id, supplier, context=None):
if context is None:
context = {}
+ po_obj = self.pool.get('purchase.order')
po_line_obj = self.pool.get('purchase.order.line')
product_uom = self.pool.get('product.uom')
product = requisition_line.product_id
@@ -139,18 +141,34 @@ class purchase_requisition(osv.osv):
ctx['tz'] = requisition.user_id.tz
date_order = requisition.ordering_date and fields.date.date_to_datetime(self, cr, uid, requisition.ordering_date, context=ctx) or fields.datetime.now()
qty = product_uom._compute_qty(cr, uid, requisition_line.product_uom_id.id, requisition_line.product_qty, default_uom_po_id)
- vals = po_line_obj.onchange_product_id(
- cr, uid, [], product.id, qty, default_uom_po_id,
- supplier.id, date_order=date_order,
- fiscal_position_id=supplier.property_account_position_id.id,
- date_planned=requisition_line.schedule_date,
- name=False, price_unit=False, state='draft', context=context)['value']
- vals.update({
+
+ taxes = product.supplier_taxes_id
+ fpos = supplier.property_account_position_id.id
+ taxes_id = fpos.map_tax(taxes) if fpos else []
+
+ po = po_obj.browse(cr, uid, [purchase_id], context=context)
+ res = po_line_obj._get_name_price_quantity_date(cr, uid,
+ requisition_line.product_id,
+ supplier,
+ date_order,
+ qty,
+ product.uom_po_id,
+ po.currency_id,
+ order_id=po,
+ context=context)
+
+ vals = {
+ 'name': res['name'],
'order_id': purchase_id,
+ 'product_qty': res['quantity'],
'product_id': product.id,
+ 'product_uom': default_uom_po_id,
+ 'price_unit': res['price_unit'],
+ 'date_planned': res['date_planned'],
+ 'taxes_id': [(6, 0, taxes_id)],
'account_analytic_id': requisition_line.account_analytic_id.id,
- 'taxes_id': [(6, 0, vals.get('taxes_id', []))],
- })
+ }
+
return vals
def make_purchase_order(self, cr, uid, ids, partner_id, context=None):
@@ -183,7 +201,7 @@ class purchase_requisition(osv.osv):
args : 'quotation' must be a browse record
"""
for line in quotation.order_line:
- if line.state != 'confirmed' or line.product_qty != line.quantity_tendered:
+ if line.product_qty != line.quantity_tendered:
return False
return True
@@ -219,25 +237,25 @@ class purchase_requisition(osv.osv):
if tender.state == 'done':
raise UserError(_('You have already generate the purchase order(s).'))
- confirm = False
- #check that we have at least confirm one line
- for po_line in tender.po_line_ids:
- if po_line.state == 'confirmed':
- confirm = True
- break
- if not confirm:
- raise UserError(_('You have no line selected for buying.'))
+ # confirm = False
+ # #check that we have at least confirm one line
+ # for po_line in tender.po_line_ids:
+ # if po_line.state == 'confirmed':
+ # confirm = True
+ # break
+ # if not confirm:
+ # raise UserError(_('You have no line selected for buying.'))
#check for complete RFQ
for quotation in tender.purchase_ids:
if (self.check_valid_quotation(cr, uid, quotation, context=context)):
- #use workflow to set PO state to confirm
- po.signal_workflow(cr, uid, [quotation.id], 'purchase_confirm')
+ #Set PO state to confirm
+ po.button_confirm(cr, uid, [quotation.id], context=context)
#get other confirmed lines per supplier
for po_line in tender.po_line_ids:
#only take into account confirmed line that does not belong to already confirmed purchase order
- if po_line.state == 'confirmed' and po_line.order_id.state in ['draft', 'sent', 'bid']:
+ if po_line.order_id.state in ['draft', 'sent', 'to approve']:
if id_per_supplier.get(po_line.partner_id.id):
id_per_supplier[po_line.partner_id.id].append(po_line)
else:
@@ -255,7 +273,7 @@ class purchase_requisition(osv.osv):
vals = self._prepare_po_line_from_tender(cr, uid, tender, line, new_po, context=context)
poline.copy(cr, uid, line.id, default=vals, context=context)
#use workflow to set new PO state to confirm
- po.signal_workflow(cr, uid, [new_po], 'purchase_confirm')
+ po.button_confirm(cr, uid, [new_po], context=context)
#cancel other orders
self.cancel_unconfirmed_quotations(cr, uid, tender, context=context)
@@ -268,8 +286,8 @@ class purchase_requisition(osv.osv):
#cancel other orders
po = self.pool.get('purchase.order')
for quotation in tender.purchase_ids:
- if quotation.state in ['draft', 'sent', 'bid']:
- self.pool.get('purchase.order').signal_workflow(cr, uid, [quotation.id], 'purchase_cancel')
+ if quotation.state in ['draft', 'sent', 'to approve']:
+ self.pool.get('purchase.order').button_cancel(cr, uid, [quotation.id], context=context)
po.message_post(cr, uid, [quotation.id], body=_('Cancelled by the call for tenders associated to this request for quotation.'), context=context)
return True
@@ -316,8 +334,8 @@ class purchase_order(osv.osv):
'requisition_id': fields.many2one('purchase.requisition', 'Call for Tenders', copy=False),
}
- def wkf_confirm_order(self, cr, uid, ids, context=None):
- res = super(purchase_order, self).wkf_confirm_order(cr, uid, ids, context=context)
+ def button_confirm(self, cr, uid, ids, context=None):
+ res = super(purchase_order, self).button_confirm(cr, uid, ids, context=context)
proc_obj = self.pool.get('procurement.order')
for po in self.browse(cr, uid, ids, context=context):
if po.requisition_id and (po.requisition_id.exclusive == 'exclusive'):
@@ -326,17 +344,13 @@ class purchase_order(osv.osv):
proc_ids = proc_obj.search(cr, uid, [('purchase_id', '=', order.id)])
if proc_ids and po.state == 'confirmed':
proc_obj.write(cr, uid, proc_ids, {'purchase_id': po.id})
- order.signal_workflow('purchase_cancel')
+ order.button_cancel()
po.requisition_id.tender_done(context=context)
+ for element in po.order_line:
+ if not element.quantity_tendered:
+ element.write({'quantity_tendered': element.product_qty})
return res
- def _prepare_order_line_move(self, cr, uid, order, order_line, picking_id, group_id, context=None):
- stock_move_lines = super(purchase_order, self)._prepare_order_line_move(cr, uid, order, order_line, picking_id, group_id, context=context)
- if order.requisition_id and order.requisition_id.procurement_id and order.requisition_id.procurement_id.move_dest_id:
- for i in range(0, len(stock_move_lines)):
- stock_move_lines[i]['move_dest_id'] = order.requisition_id.procurement_id.move_dest_id.id
- return stock_move_lines
-
class purchase_order_line(osv.osv):
_inherit = 'purchase.order.line'
@@ -345,16 +359,6 @@ class purchase_order_line(osv.osv):
'quantity_tendered': fields.float('Quantity Tendered', digits_compute=dp.get_precision('Product Unit of Measure'), help="Technical field for not loosing the initial information about the quantity proposed in the tender", oldname='quantity_bid'),
}
- def action_draft(self, cr, uid, ids, context=None):
- self.write(cr, uid, ids, {'state': 'draft'}, context=context)
-
- def action_confirm(self, cr, uid, ids, context=None):
- super(purchase_order_line, self).action_confirm(cr, uid, ids, context=context)
- for element in self.browse(cr, uid, ids, context=context):
- if not element.quantity_tendered:
- self.write(cr, uid, ids, {'quantity_tendered': element.product_qty}, context=context)
- return True
-
def generate_po(self, cr, uid, tender_id, context=None):
#call generate_po from tender with active_id. Called from js widget
return self.pool.get('purchase.requisition').generate_po(cr, uid, [tender_id], context=context)
@@ -387,9 +391,8 @@ class procurement_order(osv.osv):
requisition_obj = self.pool.get('purchase.requisition')
warehouse_obj = self.pool.get('stock.warehouse')
req_ids = []
- res = {}
+ res = []
for procurement in self.browse(cr, uid, ids, context=context):
- res[procurement.id] = False
if procurement.product_id.purchase_requisition == 'tenders':
warehouse_id = warehouse_obj.search(cr, uid, [('company_id', '=', procurement.company_id.id)], context=context)
requisition_id = requisition_obj.create(cr, uid, {
@@ -406,18 +409,9 @@ class procurement_order(osv.osv):
})],
})
self.message_post(cr, uid, [procurement.id], body=_("Purchase Requisition created"), context=context)
- self.write(cr, uid, [procurement.id], {'requisition_id': requisition_id}, context=context)
+ procurement.write({'requisition_id': requisition_id})
req_ids += [procurement.id]
- res[procurement.id] = True
set_others = set(ids) - set(req_ids)
if set_others:
- res.update(super(procurement_order, self).make_po(cr, uid, list(set_others), context=context))
+ res += super(procurement_order, self).make_po(cr, uid, list(set_others), context=context)
return res
-
- def _check(self, cr, uid, procurement, context=None):
- if procurement.rule_id and procurement.rule_id.action == 'buy' and procurement.product_id.purchase_requisition == 'tenders':
- if procurement.requisition_id.state == 'done':
- if any([purchase.shipped for purchase in procurement.requisition_id.purchase_ids]):
- return True
- return False
- return super(procurement_order, self)._check(cr, uid, procurement, context=context)
diff --git a/addons/purchase_requisition/purchase_requisition_demo.xml b/addons/purchase_requisition/purchase_requisition_demo.xml
index 1e8f456390a..0d12518c5a0 100644
--- a/addons/purchase_requisition/purchase_requisition_demo.xml
+++ b/addons/purchase_requisition/purchase_requisition_demo.xml
@@ -28,7 +28,6 @@
-
@@ -44,7 +43,6 @@
-
diff --git a/addons/purchase_requisition/purchase_requisition_view.xml b/addons/purchase_requisition/purchase_requisition_view.xml
index 2c33e7fab82..f11315f5ce0 100644
--- a/addons/purchase_requisition/purchase_requisition_view.xml
+++ b/addons/purchase_requisition/purchase_requisition_view.xml
@@ -99,14 +99,14 @@
-
-
+
+
-
-
-
-
+
+
+
+
@@ -234,11 +234,12 @@
-
-
-
-
-
+
+
+
+
diff --git a/addons/purchase_requisition/test/cancel_purchase_requisition.yml b/addons/purchase_requisition/test/cancel_purchase_requisition.yml
index a865cb0548a..71111d89e0f 100644
--- a/addons/purchase_requisition/test/cancel_purchase_requisition.yml
+++ b/addons/purchase_requisition/test/cancel_purchase_requisition.yml
@@ -23,9 +23,3 @@
-
!python {model: purchase.requisition}: |
self.copy(cr, uid, ref('requisition1'))
--
- I delete requisition.
--
- !python {model: purchase.order}: |
- self.unlink(cr, uid, [ref("requisition1")])
-