2010-03-04 09:03:42 +00:00
# -*- coding: utf-8 -*-
2006-12-07 13:41:40 +00:00
##############################################################################
2010-01-28 13:26:53 +00:00
#
2010-03-04 09:05:56 +00:00
# OpenERP, Open Source Management Solution
2010-12-08 14:17:07 +00:00
# Copyright (C) 2004-TODAY OpenERP S.A. <http://www.openerp.com>
2008-06-16 11:00:21 +00:00
#
2008-11-03 18:27:16 +00:00
# This program is free software: you can redistribute it and/or modify
2010-12-08 14:17:07 +00:00
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
2006-12-07 13:41:40 +00:00
#
2008-11-03 18:27:16 +00:00
# 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-12-08 14:17:07 +00:00
# GNU Affero General Public License for more details.
2006-12-07 13:41:40 +00:00
#
2010-12-08 14:17:07 +00:00
# You should have received a copy of the GNU Affero General Public License
2010-01-28 13:26:53 +00:00
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2006-12-07 13:41:40 +00:00
#
##############################################################################
import time
from osv import fields , osv
2009-08-18 12:04:02 +00:00
import pooler
2006-12-07 13:41:40 +00:00
class ir_sequence_type ( osv . osv ) :
2008-07-22 14:24:36 +00:00
_name = ' ir.sequence.type '
2010-12-10 22:42:58 +00:00
_order = ' name '
2008-07-22 14:24:36 +00:00
_columns = {
2010-08-23 08:33:55 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True ) ,
' code ' : fields . char ( ' Code ' , size = 32 , required = True ) ,
2008-07-22 14:24:36 +00:00
}
2006-12-07 13:41:40 +00:00
ir_sequence_type ( )
def _code_get ( self , cr , uid , context = { } ) :
2008-07-22 14:24:36 +00:00
cr . execute ( ' select code, name from ir_sequence_type ' )
return cr . fetchall ( )
2006-12-07 13:41:40 +00:00
class ir_sequence ( osv . osv ) :
2008-07-22 14:24:36 +00:00
_name = ' ir.sequence '
2010-12-10 22:42:58 +00:00
_order = ' name '
2008-07-22 14:24:36 +00:00
_columns = {
2010-08-23 07:22:26 +00:00
' name ' : fields . char ( ' Name ' , size = 64 , required = True ) ,
' code ' : fields . selection ( _code_get , ' Code ' , size = 64 , required = True ) ,
2008-07-22 14:24:36 +00:00
' active ' : fields . boolean ( ' Active ' ) ,
2010-08-23 07:28:54 +00:00
' prefix ' : fields . char ( ' Prefix ' , size = 64 , help = " Prefix value of the record for the sequence " ) ,
' suffix ' : fields . char ( ' Suffix ' , size = 64 , help = " Suffix value of the record for the sequence " ) ,
' number_next ' : fields . integer ( ' Next Number ' , required = True , help = " Next number of this sequence " ) ,
' number_increment ' : fields . integer ( ' Increment Number ' , required = True , help = " The next number of the sequence will be incremented by this number " ) ,
2010-04-18 20:07:32 +00:00
' padding ' : fields . integer ( ' Number padding ' , required = True , help = " OpenERP will automatically adds some ' 0 ' on the left of the ' Next Number ' to get the required padding size. " ) ,
2010-02-02 22:27:30 +00:00
' company_id ' : fields . many2one ( ' res.company ' , ' Company ' ) ,
2008-07-22 14:24:36 +00:00
}
_defaults = {
' active ' : lambda * a : True ,
2010-02-02 22:27:30 +00:00
' company_id ' : lambda s , cr , uid , c : s . pool . get ( ' res.company ' ) . _company_default_get ( cr , uid , ' ir.sequence ' , context = c ) ,
2008-07-22 14:24:36 +00:00
' number_increment ' : lambda * a : 1 ,
' number_next ' : lambda * a : 1 ,
' padding ' : lambda * a : 0 ,
}
2006-12-07 13:41:40 +00:00
2008-07-22 14:24:36 +00:00
def _process ( self , s ) :
2008-11-22 00:05:33 +00:00
return ( s or ' ' ) % {
2010-03-04 09:05:56 +00:00
' year ' : time . strftime ( ' % Y ' ) ,
' month ' : time . strftime ( ' % m ' ) ,
2008-11-22 00:05:33 +00:00
' day ' : time . strftime ( ' %d ' ) ,
' y ' : time . strftime ( ' % y ' ) ,
' doy ' : time . strftime ( ' % j ' ) ,
' woy ' : time . strftime ( ' % W ' ) ,
' weekday ' : time . strftime ( ' % w ' ) ,
' h24 ' : time . strftime ( ' % H ' ) ,
' h12 ' : time . strftime ( ' % I ' ) ,
' min ' : time . strftime ( ' % M ' ) ,
' sec ' : time . strftime ( ' % S ' ) ,
}
2006-12-07 13:41:40 +00:00
2010-01-28 19:22:41 +00:00
def get_id ( self , cr , uid , sequence_id , test = ' id ' , context = None ) :
2010-04-06 10:24:45 +00:00
assert test in ( ' code ' , ' id ' )
2010-11-30 11:09:40 +00:00
company_id = self . pool . get ( ' res.users ' ) . read ( cr , uid , uid , [ ' company_id ' ] , context = context ) [ ' company_id ' ] [ 0 ] or None
cr . execute ( ''' SELECT id, number_next, prefix, suffix, padding
FROM ir_sequence
WHERE % s = % % s
AND active = true
AND ( company_id = % % s or company_id is NULL )
ORDER BY company_id , id
FOR UPDATE NOWAIT ''' % test,
( sequence_id , company_id ) )
2010-04-06 10:24:45 +00:00
res = cr . dictfetchone ( )
if res :
2010-11-30 11:09:40 +00:00
cr . execute ( ' UPDATE ir_sequence SET number_next=number_next+number_increment WHERE id= %s AND active=true ' , ( res [ ' id ' ] , ) )
2010-04-06 10:24:45 +00:00
if res [ ' number_next ' ] :
return self . _process ( res [ ' prefix ' ] ) + ' %% 0 %s d ' % res [ ' padding ' ] % res [ ' number_next ' ] + self . _process ( res [ ' suffix ' ] )
else :
return self . _process ( res [ ' prefix ' ] ) + self . _process ( res [ ' suffix ' ] )
2008-07-22 14:24:36 +00:00
return False
2006-12-07 13:41:40 +00:00
2010-01-28 13:26:53 +00:00
def get ( self , cr , uid , code ) :
2010-01-28 19:22:41 +00:00
return self . get_id ( cr , uid , code , test = ' code ' )
2006-12-07 13:41:40 +00:00
ir_sequence ( )
2008-07-23 15:01:27 +00:00
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: