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/>.
#
##############################################################################
2010-06-23 11:53:20 +00:00
import time
2010-08-24 12:37:11 +00:00
import netsvc
2010-06-23 11:53:20 +00:00
2010-01-18 10:43:33 +00:00
from osv import fields , osv
2010-06-14 11:09:51 +00:00
from tools . translate import _
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 "
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 ) ,
2010-04-09 07:47:07 +00:00
' origin ' : fields . char ( ' Origin ' , size = 32 ) ,
' 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 ) ] } ) ,
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 ' ) ,
2010-04-21 10:10:09 +00:00
' state ' : fields . selection ( [ ( ' draft ' , ' Draft ' ) , ( ' in_progress ' , ' In Progress ' ) , ( ' cancel ' , ' Cancelled ' ) , ( ' done ' , ' Done ' ) ] , ' State ' , required = True )
2010-01-18 10:43:33 +00:00
}
_defaults = {
2010-06-23 11:53:20 +00:00
' date_start ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) ,
' 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 )
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 ' )
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 :
if str ( purchase_id . state ) in ( ' draft ' , ' wait ' ) :
2010-04-23 07:24:58 +00:00
purchase_order_obj . action_cancel ( cr , uid , [ purchase_id . id ] )
2010-04-09 13:57:28 +00:00
self . write ( cr , uid , ids , { ' state ' : ' cancel ' } )
2010-04-23 07:24:58 +00:00
return True
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 ) :
2010-04-21 09:19:35 +00:00
self . write ( cr , uid , ids , { ' state ' : ' in_progress ' } , context = context )
2010-04-23 07:24:58 +00:00
return True
2010-07-01 06:59:57 +00:00
2010-06-23 11:53:20 +00:00
def tender_reset ( self , cr , uid , ids , context = None ) :
2010-04-09 13:57:28 +00:00
self . write ( cr , uid , ids , { ' state ' : ' draft ' } )
2010-04-23 07:24:58 +00:00
return True
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 ) :
2010-04-21 09:19:35 +00:00
self . write ( cr , uid , ids , { ' state ' : ' done ' , ' date_end ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) } , context = context )
2010-04-23 07:24:58 +00:00
return True
2010-04-09 07:18:17 +00:00
purchase_requisition ( )
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 ' ) ,
2010-04-09 00:32:46 +00:00
' product_uom_id ' : fields . many2one ( ' product.uom ' , ' Product UoM ' ) ,
2010-04-12 06:12:17 +00:00
' product_qty ' : fields . float ( ' Quantity ' , digits = ( 16 , 2 ) ) ,
2010-04-16 06:17:50 +00:00
' requisition_id ' : fields . many2one ( ' purchase.requisition ' , ' Purchase Requisition ' , ondelete = ' cascade ' ) ,
2010-04-12 05:15:29 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' , required = True ) ,
2010-04-09 07:18:17 +00:00
' requisition_id ' : fields . many2one ( ' purchase.requisition ' , ' Purchase Requisition ' , ondelete = ' cascade ' )
2010-04-09 00:32:46 +00:00
}
2010-04-12 10:23:28 +00:00
2010-06-23 11:53:20 +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-22 10:37:53 +00:00
prod = self . pool . get ( ' product.product ' ) . browse ( cr , uid , [ product_id ] , context = context ) [ 0 ]
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 "
_columns = {
2010-04-09 07:18:17 +00:00
' requisition_id ' : fields . many2one ( ' purchase.requisition ' , ' Purchase Requisition ' )
2010-01-18 10:43:33 +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 )
2010-07-09 11:35:54 +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 :
2010-01-18 10:43:33 +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 ' :
proc_obj . wirte ( 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 )
2010-04-28 07:28:52 +00:00
self . pool . get ( ' purchase.requisition ' ) . write ( cr , uid , [ po . requisition_id . id ] , { ' state ' : ' done ' , ' date_end ' : time . strftime ( ' % Y- % m- %d % H: % M: % S ' ) } )
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 ( )
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 = {
2010-04-09 07:18:17 +00:00
' purchase_requisition ' : fields . boolean ( ' Purchase Requisition ' , help = " Check this box so that requisitions generates purchase requisitions instead of directly requests for quotations. " )
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 ) :
sequence_obj = self . pool . get ( ' ir.sequence ' )
res = super ( procurement_order , self ) . make_po ( cr , uid , ids , context = context )
for proc_id , po_id in res . items ( ) :
2010-11-22 10:37:53 +00:00
procurement = self . browse ( cr , uid , proc_id , context = context )
2010-07-09 09:26:48 +00:00
requisition_id = False
2010-04-09 07:18:17 +00:00
if procurement . product_id . purchase_requisition :
2010-07-09 09:26:48 +00:00
requisition_id = self . pool . get ( ' purchase.requisition ' ) . create ( cr , uid , {
2010-04-21 09:19:35 +00:00
' name ' : sequence_obj . get ( cr , uid , ' purchase.order.requisition ' ) ,
2010-04-09 07:47:07 +00:00
' origin ' : procurement . name ,
' date_end ' : procurement . date_planned ,
2010-08-25 11:59:37 +00:00
' warehouse_id ' : procurement . purchase_id and procurement . purchase_id . warehouse_id . id ,
' 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
} ) ] ,
' purchase_ids ' : [ ( 6 , 0 , [ po_id ] ) ]
} )
2010-08-13 12:20:05 +00:00
self . write ( cr , uid , proc_id , { ' requisition_id ' : requisition_id } )
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: