2012-05-14 4 views
2

В OpenERP последовательности можно вставить текущий год с веком в качестве суффикса или префикса следующим образом:формата последовательность в OpenERP

/%(year)s 

мне нужно, чтобы получить финансовый год суффикса в последовательности. Есть ли способ?

для например: PO/0001/2012-2013

+1

Привет @Pravith Вы найдете решение по вышеуказанному вопросу? Если вы найдете решение, отправьте свой ответ. Спасибо. s .. – codeimplementer

+0

если вы получаете ответ.пожалуйста, напишите здесь – Bala

ответ

1

Если вам необходимо произвести текущий год вы можете сделать это с модулем даты и времени, как так

import datetime 
print datetime.datetime.strftime(datetime.datetime.now(), '%Y') 

который даст вам «2012» , Вы можете узнать больше о модуле в datetime docs

EDIT: Что-то еще вдоль этих линий?

import datetime 

def get_fiscal_year(start_month=3): 
    now = datetime.datetime.now() 
    if now.month >= start_month: 
     return '%d-%d' % (now.year, now.year + 1) 
    return '%d-%d' % (now.year - 1, now.year) 
+0

нет сэр, у меня есть в текущем году мое требование - я хочу, чтобы финансовый год, например: 2012-2013, а в следующем финансовом году он должен автоматически изменяться до 2013-2014 гг. и т. д. –

+0

Попробуйте функцию, изложенную в редакции. –

+0

Но где я должен добавить этот код? –

1

Я не вижу никакого способа сделать это, используя только суффикс или префиксное поле последовательности. Однако вы, вероятно, могли бы это сделать, написав модуль, который расширяет класс ir_sequence. Текущий класс provides a dictionary со значениями, которые можно использовать в префиксе последовательности или суффиксе.

def _interpolation_dict(self): 
    t = time.localtime() # Actually, the server is always in UTC. 
    return { 
     'year': time.strftime('%Y', t), 
     'month': time.strftime('%m', t), 
     'day': time.strftime('%d', t), 
     'y': time.strftime('%y', t), 
     'doy': time.strftime('%j', t), 
     'woy': time.strftime('%W', t), 
     'weekday': time.strftime('%w', t), 
     'h24': time.strftime('%H', t), 
     'h12': time.strftime('%I', t), 
     'min': time.strftime('%M', t), 
     'sec': time.strftime('%S', t), 
    } 

Если вы переопределить, что с версией, которая выглядит вверх current fiscal year и добавляет еще одну запись, то, вероятно, что вы хотите.

Возможно, было бы разумно измерить производительность в некоторых местах, которые должны генерировать кучу порядковых номеров, поскольку поиск базы данных намного медленнее, чем проверка системного времени. Возможно, вам понадобится некоторое время кэшировать финансовый год.

2

При создании последовательности вы можете добавить эту функцию для возврата значения с помощью последовательности.

Вы можете попробовать эту функцию, чтобы найти финансовый год:

def finyear(self): 
    today=date.today() 
    months=today.month 
    if months<=3: 
     return '%d-%d'%(today.year-1,today.year) 
    return '%d-%d'%(today.year,today.year+1) 
0

предваряя финансовый год и сбросить код последовательности для каждого финансового года может быть сделано, как показано ниже. Ввести новый атрибут последовательности % (financial_year) s. Вот как это сделать. Наследовать ir_sequence и переопределить методы _interpolation_dict, а _next

добавил новый столбец finance_year_name. В этом столбце задается имя финансового года для каждого вызова _next и сбрасывается при изменении имени финансового года.

последовательность XML

<record id="seq_cust_invoice_no" model="ir.sequence"> 
    <field name="name">Customer Invoice No.</field> 
    <field name="code">cust_invoice_no</field> 
    <field name="prefix">%(fiscal_year)s/</field> 
      <field name="padding">4</field> 
      <field name="number_increment">1</field> 
     </record> 

код ниже:

класс ir_sequence (osv.osv): _inherit = 'ir.sequence'

_columns = { 
    'fiscal_year_name': fields.char('Created Fiscal year', size=64, help="Created Fiscal year"), 
} 

def _interpolation_dict(self, cr, uid, fy): 
    res = super(ir_sequence, self)._interpolation_dict()   
    res['fiscal_year'] = fy.name 
    return res 

def _next(self, cr, uid, seq_ids, context=None): 
    if not seq_ids: 
     return False 
    if context is None: 
     context = {} 
    company_id = self.pool.get('res.users').browse(cr, uid, uid).company_id.id 
    fiscal_year_id = self.pool.get('account.fiscalyear').search(cr, uid, [('state','=','draft'), ('company_id', '=', company_id)]) 
    fy = self.pool.get('account.fiscalyear').browse(cr, uid, fiscal_year_id)[0] 

    # Honoring the changes for ir_sequence.py override in accounts 
    sequence_ids = seq_ids 
    for seq in self.browse(cr, uid, seq_ids, context): 
     for line in seq.fiscal_ids: 
      if line.fiscalyear_id.id == context.get('fiscalyear_id'): 
       sequence_ids = [line.sequence_id.id] 
       break 

    force_company = context.get('force_company') 
    if not force_company: 
     force_company = self.pool.get('res.users').browse(cr, uid, uid).company_id.id 

    sequences = self.read(cr, uid, sequence_ids, ['name','company_id','implementation','number_next','prefix','suffix','padding', 'fiscal_year_name']) 
    preferred_sequences = [s for s in sequences if s['company_id'] and s['company_id'][0] == force_company ] 
    seq = preferred_sequences[0] if preferred_sequences else sequences[0] 
    if seq['implementation'] == 'standard': 
     if seq['prefix'] == '%(fiscal_year)s/': 
      if not seq['fiscal_year_name'] or fy.name != seq['fiscal_year_name']: 
       cr.execute("SELECT setval('ir_sequence_%03d', 1, true)" % seq['id']) 
       seq['number_next'] = cr.fetchone() 
      else: 
       cr.execute("SELECT nextval('ir_sequence_%03d')" % seq['id']) 
       seq['number_next'] = cr.fetchone() 
     else: 
      cr.execute("SELECT nextval('ir_sequence_%03d')" % seq['id']) 
      seq['number_next'] = cr.fetchone() 
    else: 
     cr.execute("SELECT number_next FROM ir_sequence WHERE id=%s FOR UPDATE NOWAIT", (seq['id'],)) 
     cr.execute("UPDATE ir_sequence SET number_next=number_next+number_increment WHERE id=%s ", (seq['id'],)) 
    d = self._interpolation_dict(cr, uid, fy) 
    try: 
     interpolated_prefix = self._interpolate(seq['prefix'], d) 
     interpolated_suffix = self._interpolate(seq['suffix'], d) 
    except ValueError: 
     raise osv.except_osv(_('Warning'), _('Invalid prefix or suffix for sequence \'%s\'') % (seq.get('name'))) 

    self.write(cr, uid, sequence_ids, {'fiscal_year_name': fy.name}, context=context) 

    return interpolated_prefix + '%%0%sd' % seq['padding'] % seq['number_next'] + interpolated_suffix 

ir_sequence()