2010-01-18 10:43:33 +00:00
# -*- encoding: utf-8 -*-
##############################################################################
#
2010-04-09 00:32:46 +00:00
# OpenERP, Open Source Management Solution
2010-08-05 11:23:26 +00:00
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>). All Rights Reserved
2010-01-18 10:43:33 +00:00
# $Id$
#
# This program is free software: you can redistribute it and/or modify
2010-10-28 06:54:18 +00:00
# it under the terms of the GNU Affero General Public License as published by
2010-01-18 10:43:33 +00:00
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2010-10-28 06:54:18 +00:00
# GNU Affero General Public License for more details.
2010-01-18 10:43:33 +00:00
#
2010-10-28 06:54:18 +00:00
# You should have received a copy of the GNU Affero General Public License
2010-01-18 10:43:33 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
2011-12-02 07:27:55 +00:00
from datetime import datetime
from dateutil . relativedelta import relativedelta
2010-06-23 11:53:20 +00:00
import time
2012-12-06 14:56:32 +00:00
from openerp import netsvc
2010-06-23 11:53:20 +00:00
2012-12-06 14:56:32 +00:00
from openerp . osv import fields , osv
from openerp . tools . translate import _
2012-12-17 15:23:03 +00:00
import openerp . addons . decimal_precision as dp
2010-01-18 10:43:33 +00:00
2010-04-09 07:18:17 +00:00
class purchase_requisition ( osv . osv ) :
_name = " purchase.requisition "
2010-05-19 18:32:32 +00:00
_description = " Purchase Requisition "
2012-08-22 15:31:45 +00:00
_inherit = [ ' mail.thread ' , ' ir.needaction_mixin ' ]
2013-05-29 09:51:50 +00:00
def _get_po_line ( self , cr , uid , ids , field_names , arg = None , context = None ) :
result = { }
if not ids : return result
for id in ids :
result . setdefault ( id , [ ] )
for element in self . browse ( cr , uid , ids , context = context ) :
for po in element . purchase_ids :
for po_line in po . order_line :
result [ po_line . order_id . requisition_id . id ] . append ( po_line . id )
return result
2010-01-18 10:43:33 +00:00
_columns = {
2010-04-09 07:18:17 +00:00
' name ' : fields . char ( ' Requisition Reference ' , size = 32 , required = True ) ,
2012-10-08 10:41:51 +00:00
' origin ' : fields . char ( ' Source Document ' , size = 32 ) ,
2010-04-09 07:47:07 +00:00
' date_start ' : fields . datetime ( ' Requisition Date ' ) ,
' date_end ' : fields . datetime ( ' Requisition Deadline ' ) ,
2010-01-18 10:43:33 +00:00
' user_id ' : fields . many2one ( ' res.users ' , ' Responsible ' ) ,
2010-09-17 12:36:57 +00:00
' exclusive ' : fields . selection ( [ ( ' exclusive ' , ' Purchase Requisition (exclusive) ' ) , ( ' multiple ' , ' Multiple Requisitions ' ) ] , ' Requisition Type ' , required = True , help = " Purchase Requisition (exclusive): On the confirmation of a purchase order, it cancels the remaining purchase order. \n Purchase Requisition(Multiple): It allows to have multiple purchase orders.On confirmation of a purchase order it does not cancel the remaining orders " " " ) ,
2010-01-18 10:43:33 +00:00
' description ' : fields . text ( ' Description ' ) ,
2010-04-23 07:24:58 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = True ) ,
2010-07-08 14:21:02 +00:00
' purchase_ids ' : fields . one2many ( ' purchase.order ' , ' requisition_id ' , ' Purchase Orders ' , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
2013-05-29 09:51:50 +00:00
' po_line_ids ' : fields . function ( _get_po_line , method = True , type = ' one2many ' , relation = ' purchase.order.line ' , string = ' Products by supplier ' ) ,
2010-06-21 13:59:11 +00:00
' line_ids ' : fields . one2many ( ' purchase.requisition.line ' , ' requisition_id ' , ' Products to Purchase ' , states = { ' done ' : [ ( ' readonly ' , True ) ] } ) ,
2010-08-25 06:24:52 +00:00
' warehouse_id ' : fields . many2one ( ' stock.warehouse ' , ' Warehouse ' ) ,
2013-05-31 12:24:24 +00:00
' state ' : fields . selection ( [ ( ' draft ' , ' Draft Tender ' ) , ( ' in_progress ' , ' Sent to Suppliers ' ) , ( ' open ' , ' Choosing Lines ' ) , ( ' done ' , ' PO Created ' ) , ( ' cancel ' , ' Cancelled ' ) ] ,
2013-05-31 07:38:56 +00:00
' Status ' , track_visibility = ' onchange ' , required = True ) ,
' multiple_rfq_per_supplier ' : fields . boolean ( ' Multiple RFQ per supplier ' ) ,
2013-05-31 12:24:24 +00:00
' account_analytic_id ' : fields . many2one ( ' account.analytic.account ' , ' Analytic Account ' , ) ,
2010-01-18 10:43:33 +00:00
}
_defaults = {
2012-06-27 14:48:36 +00:00
' date_start ' : lambda * args : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) ,
2010-06-23 11:53:20 +00:00
' state ' : ' draft ' ,
' exclusive ' : ' multiple ' ,
2010-07-01 06:59:57 +00:00
' company_id ' : lambda self , cr , uid , c : self . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' purchase.requisition ' , context = c ) ,
' user_id ' : lambda self , cr , uid , c : self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , c ) . id ,
2010-04-09 07:18:17 +00:00
' name ' : lambda obj , cr , uid , context : obj . pool . get ( ' ir.sequence ' ) . get ( cr , uid , ' purchase.order.requisition ' ) ,
2010-01-18 10:43:33 +00:00
}
2010-04-16 04:42:36 +00:00
2010-11-22 10:37:53 +00:00
def copy ( self , cr , uid , id , default = None , context = None ) :
2010-08-25 11:39:56 +00:00
if not default :
default = { }
default . update ( {
' state ' : ' draft ' ,
' purchase_ids ' : [ ] ,
' name ' : self . pool . get ( ' ir.sequence ' ) . get ( cr , uid , ' purchase.order.requisition ' ) ,
} )
return super ( purchase_requisition , self ) . copy ( cr , uid , id , default , context )
2012-06-04 13:26:53 +00:00
2010-06-23 11:53:20 +00:00
def tender_cancel ( self , cr , uid , ids , context = None ) :
2010-04-12 06:58:25 +00:00
purchase_order_obj = self . pool . get ( ' purchase.order ' )
2013-05-31 12:24:24 +00:00
#try to set all associated quotations to cancel state
2010-11-22 10:37:53 +00:00
for purchase in self . browse ( cr , uid , ids , context = context ) :
2010-04-12 06:58:25 +00:00
for purchase_id in purchase . purchase_ids :
2013-05-31 12:24:24 +00:00
purchase_order_obj . action_cancel ( cr , uid , [ purchase_id . id ] )
2012-12-18 17:03:06 +00:00
return self . write ( cr , uid , ids , { ' state ' : ' cancel ' } )
2010-07-01 06:59:57 +00:00
2010-06-23 11:53:20 +00:00
def tender_in_progress ( self , cr , uid , ids , context = None ) :
2013-05-31 12:24:24 +00:00
#check if all quotations are not in a draft state before going to that state
for purchase in self . browse ( cr , uid , ids , context = context ) :
for purchase_id in purchase . purchase_ids :
if purchase_id . state == ' draft ' :
raise osv . except_osv ( _ ( ' Warning! ' ) , _ ( ' You still have some quotation(s) in draft state. ' ) )
2012-12-18 17:03:06 +00:00
return self . write ( cr , uid , ids , { ' state ' : ' in_progress ' } , context = context )
2010-07-01 06:59:57 +00:00
2013-05-29 09:51:50 +00:00
def tender_open ( self , cr , uid , ids , context = None ) :
return self . write ( cr , uid , ids , { ' state ' : ' open ' } , context = context )
2010-06-23 11:53:20 +00:00
def tender_reset ( self , cr , uid , ids , context = None ) :
2012-12-18 17:03:06 +00:00
return self . write ( cr , uid , ids , { ' state ' : ' draft ' } )
2010-07-01 06:59:57 +00:00
2010-06-23 11:53:20 +00:00
def tender_done ( self , cr , uid , ids , context = None ) :
2012-12-18 17:03:06 +00:00
return self . write ( cr , uid , ids , { ' state ' : ' done ' , ' date_end ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) } , context = context )
2012-06-04 13:26:53 +00:00
2011-12-02 07:27:55 +00:00
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
2013-05-29 09:51:50 +00:00
def open_product_line ( self , cr , uid , ids , context = None ) :
""" This opens product line view to view all lines from the different quotations, groupby default by product and partner to show comparaison
between supplier price
@return : the product line tree view
"""
if context is None :
context = { }
res = self . pool . get ( ' ir.actions.act_window ' ) . for_xml_id ( cr , uid , ' purchase_requisition ' , ' purchase_line_tree ' , context = context )
res [ ' context ' ] = context
po_ids_browse = self . browse ( cr , uid , ids , context = context ) [ 0 ] . po_line_ids
po_ids = [ ]
for po in po_ids_browse :
po_ids . append ( po . id )
res [ ' context ' ] . update ( {
' search_default_groupby_product ' : True ,
} )
res [ ' domain ' ] = [ ( ' id ' , ' in ' , po_ids ) ]
return res
2013-06-03 12:59:00 +00:00
def _prepare_purchase_order ( self , cr , uid , requisition , supplier , context = None ) :
location_id = requisition . warehouse_id . lot_input_id . id
2013-06-04 08:46:45 +00:00
supplier_pricelist = supplier . property_product_pricelist_purchase or False
2013-06-03 12:59:00 +00:00
return {
' origin ' : requisition . name ,
' partner_id ' : supplier . 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 ,
}
2013-06-04 08:59:56 +00:00
def _prepare_purchase_order_line ( self , cr , uid , requisition , requisition_line , purchase_id , supplier , context = None ) :
fiscal_position = self . pool . get ( ' account.fiscal.position ' )
2013-06-03 12:59:00 +00:00
product = requisition_line . product_id
seller_price , qty , default_uom_po_id , date_planned = self . _seller_details ( cr , uid , requisition_line , supplier , context = context )
taxes_ids = product . supplier_taxes_id
taxes = fiscal_position . map_tax ( cr , uid , supplier . property_account_position , taxes_ids )
return {
' 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 ,
' taxes_id ' : [ ( 6 , 0 , taxes ) ] ,
' account_analytic_id ' : requisition . account_analytic_id . id ,
}
2011-12-02 07:27:55 +00:00
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 ' )
supplier = res_partner . browse ( cr , uid , partner_id , context = context )
res = { }
for requisition in self . browse ( cr , uid , ids , context = context ) :
2013-05-31 07:38:56 +00:00
if not requisition . multiple_rfq_per_supplier and supplier . id in filter ( lambda x : x , [ rfq . state < > ' cancel ' and rfq . partner_id . id or None for rfq in requisition . purchase_ids ] ) :
2012-08-07 11:34:14 +00:00
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. ' ) % rfq . state )
2013-06-03 12:59:00 +00:00
purchase_id = purchase_order . create ( cr , uid , self . _prepare_purchase_order ( cr , uid , requisition , supplier , context = context ) , context = context )
2011-12-02 07:27:55 +00:00
res [ requisition . id ] = purchase_id
for line in requisition . line_ids :
2013-06-04 08:59:56 +00:00
purchase_order_line . create ( cr , uid , self . _prepare_purchase_order_line ( cr , uid , requisition , line , purchase_id , supplier , context = context ) , context = context )
2011-12-02 07:27:55 +00:00
return res
2013-05-31 07:38:56 +00:00
def check_valid_quotation ( self , cr , uid , quotation , context = None ) :
"""
Check if a quotation has all his order lines bid in order to confirm it if its the case
return True if all order line have been selected during bidding process , else return False
args : ' quotation ' must be a browse record
"""
for line in quotation . order_line :
if line . state != ' confirmed ' or line . product_qty != line . quantity_bid :
return False
return True
2013-05-29 09:51:50 +00:00
def generate_po ( self , cr , uid , id , context = None ) :
"""
Generate all purchase order based on selected lines , should only be called on one tender at a time
"""
2013-05-29 12:28:33 +00:00
po = self . pool . get ( ' purchase.order ' )
poline = self . pool . get ( ' purchase.order.line ' )
2013-05-29 09:51:50 +00:00
id_per_supplier = { }
2013-05-29 12:28:33 +00:00
tender = self . browse ( cr , uid , id , context = context ) [ 0 ]
2013-05-29 15:43:05 +00:00
if tender . state == ' done ' :
raise osv . except_osv ( _ ( ' Warning! ' ) , _ ( ' You have already generate the purchase order(s). ' ) )
2013-05-31 07:38:56 +00:00
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 osv . except_osv ( _ ( ' Warning! ' ) , _ ( ' 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
2013-06-04 13:27:39 +00:00
self . trigger_validate_po ( cr , uid , quotation . id , context = context )
2013-05-31 07:38:56 +00:00
#get other confirmed lines per supplier
2013-05-29 12:28:33 +00:00
for po_line in tender . po_line_ids :
2013-05-29 15:43:05 +00:00
#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 ' , ' cancel ' ] :
2013-05-29 09:51:50 +00:00
partner = po_line . partner_id . id
if id_per_supplier . get ( partner ) :
id_per_supplier [ partner ] . append ( po_line . id )
else :
2013-05-29 12:28:33 +00:00
id_per_supplier [ partner ] = [ po_line ]
2013-05-29 09:51:50 +00:00
2013-05-29 15:43:05 +00:00
#generate po based on supplier and cancel all previous RFQ
2013-05-29 12:28:33 +00:00
for supplier , product_line in id_per_supplier . items ( ) :
#copy a quotation for this supplier and change order_line then validate it
2013-05-29 15:43:05 +00:00
quotation_id = po . search ( cr , uid , [ ( ' requisition_id ' , ' = ' , tender . id ) , ( ' partner_id ' , ' = ' , supplier ) ] , limit = 1 ) [ 0 ]
new_po = po . copy ( cr , uid , quotation_id , default = { ' order_line ' : [ ] } , context = context )
#duplicate po_line and change product_qty if needed and associate them to newly created PO
for line in product_line :
poline . copy ( cr , uid , line . id , default = { ' product_qty ' : line . quantity_bid , ' order_id ' : new_po } , context = context )
#set previous confirmed line to draft
poline . action_draft ( cr , uid , line . id , context = context )
2013-05-29 12:28:33 +00:00
#use workflow to set new PO state to confirm
2013-06-04 13:27:39 +00:00
self . trigger_validate_po ( cr , uid , new_po , context = context )
2013-05-29 15:43:05 +00:00
#cancel other orders
2013-06-04 13:27:39 +00:00
self . cancel_quotation ( cr , uid , tender , context = context )
2013-05-31 07:38:56 +00:00
#set tender to state done
self . tender_done ( cr , uid , id , context = context )
return True
2013-06-04 13:27:39 +00:00
def trigger_validate_po ( self , cr , uid , po_id , context = None ) :
wf_service = netsvc . LocalService ( " workflow " )
wf_service . trg_validate ( uid , ' purchase.order ' , po_id , ' purchase_confirm ' , cr )
def cancel_quotation ( self , cr , uid , tender , context = None ) :
#cancel other orders
wf_service = netsvc . LocalService ( " workflow " )
for quotation in tender . purchase_ids :
if quotation . state in [ ' draft ' , ' sent ' , ' bid ' ] :
wf_service . trg_validate ( uid , ' purchase.order ' , quotation . id , ' purchase_cancel ' , cr )
return True
2013-05-29 15:43:05 +00:00
2010-01-18 10:43:33 +00:00
2010-04-09 07:18:17 +00:00
class purchase_requisition_line ( osv . osv ) :
2010-07-01 06:59:57 +00:00
2010-04-09 07:18:17 +00:00
_name = " purchase.requisition.line "
_description = " Purchase Requisition Line "
2010-04-09 00:32:46 +00:00
_rec_name = ' product_id '
2010-07-01 06:59:57 +00:00
2010-04-09 00:32:46 +00:00
_columns = {
2010-05-04 12:54:03 +00:00
' product_id ' : fields . many2one ( ' product.product ' , ' Product ' ) ,
2012-04-25 12:09:08 +00:00
' product_uom_id ' : fields . many2one ( ' product.uom ' , ' Product Unit of Measure ' ) ,
' product_qty ' : fields . float ( ' Quantity ' , digits_compute = dp . get_precision ( ' Product Unit of Measure ' ) ) ,
2013-05-29 09:51:50 +00:00
' po_line_buy ' : fields . many2one ( ' purchase.order.line ' , ' Purchase Order Line ' ) ,
' requisition_id ' : fields . many2one ( ' purchase.requisition ' , ' Purchase Requisition ' , ondelete = ' cascade ' ) ,
' po_line_ids ' : fields . related ( ' requisition_id ' , ' po_line_ids ' , string = ' PO lines ' , readonly = True , type = " one2many " ) ,
2011-12-02 07:27:55 +00:00
' company_id ' : fields . related ( ' requisition_id ' , ' company_id ' , type = ' many2one ' , relation = ' res.company ' , string = ' Company ' , store = True , readonly = True ) ,
2010-04-09 00:32:46 +00:00
}
2010-04-12 10:23:28 +00:00
2012-03-05 18:40:03 +00:00
def onchange_product_id ( self , cr , uid , ids , product_id , product_uom_id , context = None ) :
2010-04-09 13:57:28 +00:00
""" Changes UoM and name if product_id changes.
@param name : Name of the field
@param product_id : Changed product_id
@return : Dictionary of changed values
"""
2010-05-20 11:10:36 +00:00
value = { ' product_uom_id ' : ' ' }
2010-04-09 13:57:28 +00:00
if product_id :
2010-11-23 11:31:52 +00:00
prod = self . pool . get ( ' product.product ' ) . browse ( cr , uid , product_id , context = context )
2010-06-21 13:59:11 +00:00
value = { ' product_uom_id ' : prod . uom_id . id , ' product_qty ' : 1.0 }
2010-04-09 13:57:28 +00:00
return { ' value ' : value }
2010-05-05 12:48:59 +00:00
2010-04-23 07:24:58 +00:00
_defaults = {
2010-07-01 06:59:57 +00:00
' company_id ' : lambda self , cr , uid , c : self . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' purchase.requisition.line ' , context = c ) ,
2010-08-13 12:20:05 +00:00
}
2010-04-09 07:18:17 +00:00
purchase_requisition_line ( )
2010-04-09 00:32:46 +00:00
2010-01-18 10:43:33 +00:00
class purchase_order ( osv . osv ) :
_inherit = " purchase.order "
2013-05-31 07:38:56 +00:00
def _belong_to_bid_group ( self , cr , uid , ids , field_names , arg = None , context = None ) :
belong = False
group_bid_id = self . pool . get ( ' ir.model.data ' ) . get_object_reference ( cr , uid , ' purchase ' , ' group_advance_bidding ' ) [ 1 ]
user = self . pool . get ( ' res.users ' ) . browse ( cr , uid , uid , context = context )
for group in user . groups_id :
if group . id == group_bid_id :
belong = True
result = { }
if not ids : return result
for id in ids :
result . setdefault ( id , belong )
return result
2010-01-18 10:43:33 +00:00
_columns = {
2013-05-31 07:38:56 +00:00
' requisition_id ' : fields . many2one ( ' purchase.requisition ' , ' Purchase Requisition ' ) ,
' advance_bidding_group ' : fields . function ( _belong_to_bid_group , method = True , type = ' boolean ' , string = " Belong to advance bidding group " ) ,
2010-01-18 10:43:33 +00:00
}
2012-06-04 13:26:53 +00:00
2010-11-22 10:37:53 +00:00
def wkf_confirm_order ( self , cr , uid , ids , context = None ) :
res = super ( purchase_order , self ) . wkf_confirm_order ( cr , uid , ids , context = context )
2011-03-08 14:52:52 +00:00
proc_obj = self . pool . get ( ' procurement.order ' )
2010-11-22 10:37:53 +00:00
for po in self . browse ( cr , uid , ids , context = context ) :
2010-04-09 07:47:07 +00:00
if po . requisition_id and ( po . requisition_id . exclusive == ' exclusive ' ) :
2010-04-09 07:18:17 +00:00
for order in po . requisition_id . purchase_ids :
2012-06-27 14:48:36 +00:00
if order . id != po . id :
2010-07-09 11:35:54 +00:00
proc_ids = proc_obj . search ( cr , uid , [ ( ' purchase_id ' , ' = ' , order . id ) ] )
if proc_ids and po . state == ' confirmed ' :
2011-02-25 11:40:03 +00:00
proc_obj . write ( cr , uid , proc_ids , { ' purchase_id ' : po . id } )
2010-01-18 10:43:33 +00:00
wf_service = netsvc . LocalService ( " workflow " )
wf_service . trg_validate ( uid , ' purchase.order ' , order . id , ' purchase_cancel ' , cr )
2011-12-02 05:15:06 +00:00
po . requisition_id . tender_done ( context = context )
2010-01-18 10:43:33 +00:00
return res
2010-04-09 00:32:46 +00:00
2010-04-23 07:24:58 +00:00
purchase_order ( )
2013-05-29 09:51:50 +00:00
class purchase_order_line ( osv . osv ) :
_inherit = ' purchase.order.line '
_columns = {
' quantity_bid ' : fields . float ( ' Quantity Bid ' , digits_compute = dp . get_precision ( ' Product Unit of Measure ' ) ) ,
}
def action_draft ( self , cr , uid , ids , context = None ) :
self . write ( cr , uid , ids , { ' state ' : ' draft ' } , context = context )
def action_confirm ( self , cr , uid , ids , context = None ) :
super ( purchase_order_line , self ) . action_confirm ( cr , uid , ids , context = context )
for element in self . browse ( cr , uid , ids , context = context ) :
if not element . quantity_bid :
self . write ( cr , uid , ids , { ' quantity_bid ' : element . product_qty } , context = context )
return True
2013-05-31 07:38:56 +00:00
def generate_po ( self , cr , uid , active_id , context = None ) :
#call generate_po from tender with active_id
self . pool . get ( ' purchase.requisition ' ) . generate_po ( cr , uid , [ active_id ] , context = context )
2013-05-31 12:24:24 +00:00
return True
2013-05-31 07:38:56 +00:00
2013-05-29 15:43:05 +00:00
2010-04-09 00:32:46 +00:00
class product_product ( osv . osv ) :
_inherit = ' product.product '
2010-07-01 06:59:57 +00:00
2010-04-09 00:32:46 +00:00
_columns = {
2012-06-25 12:08:24 +00:00
' purchase_requisition ' : fields . boolean ( ' Purchase Requisition ' , help = " Check this box to generates purchase requisition instead of generating requests for quotation from procurement. " )
2010-04-09 00:32:46 +00:00
}
_defaults = {
2010-06-23 11:53:20 +00:00
' purchase_requisition ' : False
2010-04-09 00:32:46 +00:00
}
product_product ( )
2010-05-27 12:47:06 +00:00
class procurement_order ( osv . osv ) :
2010-07-01 06:59:57 +00:00
2010-05-27 12:47:06 +00:00
_inherit = ' procurement.order '
2010-07-09 09:26:48 +00:00
_columns = {
' requisition_id ' : fields . many2one ( ' purchase.requisition ' , ' Latest Requisition ' )
}
2010-07-01 06:59:57 +00:00
def make_po ( self , cr , uid , ids , context = None ) :
2012-06-21 06:00:34 +00:00
res = { }
2012-06-19 13:33:00 +00:00
requisition_obj = self . pool . get ( ' purchase.requisition ' )
2012-06-21 06:00:34 +00:00
warehouse_obj = self . pool . get ( ' stock.warehouse ' )
2012-06-19 13:33:00 +00:00
procurement = self . browse ( cr , uid , ids , context = context ) [ 0 ]
if procurement . product_id . purchase_requisition :
2012-06-21 06:36:20 +00:00
warehouse_id = warehouse_obj . search ( cr , uid , [ ( ' company_id ' , ' = ' , procurement . company_id . id or company . id ) ] , context = context )
2012-06-21 06:00:34 +00:00
res [ procurement . id ] = requisition_obj . create ( cr , uid ,
{
2011-10-13 13:07:31 +00:00
' origin ' : procurement . origin ,
2010-04-09 07:47:07 +00:00
' date_end ' : procurement . date_planned ,
2012-06-21 06:00:34 +00:00
' warehouse_id ' : warehouse_id and warehouse_id [ 0 ] or False ,
2010-08-25 11:59:37 +00:00
' company_id ' : procurement . company_id . id ,
2010-04-21 07:56:40 +00:00
' line_ids ' : [ ( 0 , 0 , {
2010-04-09 00:32:46 +00:00
' product_id ' : procurement . product_id . id ,
' product_uom_id ' : procurement . product_uom . id ,
' product_qty ' : procurement . product_qty
2012-06-21 06:00:34 +00:00
} ) ] ,
2010-04-09 00:32:46 +00:00
} )
2012-06-21 06:00:34 +00:00
self . write ( cr , uid , [ procurement . id ] , { ' state ' : ' running ' , ' requisition_id ' : res [ procurement . id ] } , context = context )
else :
res = super ( procurement_order , self ) . make_po ( cr , uid , ids , context = context )
2010-04-09 07:47:07 +00:00
return res
2010-07-01 06:59:57 +00:00
2010-05-27 12:47:06 +00:00
procurement_order ( )
2010-06-23 11:53:20 +00:00
2010-08-24 12:37:11 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: