~unifield-team/unifield-wm/us-826

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# -*- coding: utf-8 -*-
##############################################################################
#
#    OpenERP, Open Source Management Solution
#    Copyright (C) 2011 MSF, TeMPO consulting
#
#    This program is free software: you can redistribute it and/or modify
#    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.
#
#    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
#    GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################

from osv import fields, osv
from tools.translate import _
import logging

class account_period_closing_level(osv.osv):
    _inherit = "account.period"
    
    # To avoid issues with existing OpenERP code (account move line for example),
    # the state are:
    #  - 'created' for Draft
    #  - 'draft' for Open
    #  - 'done' for HQ-Closed
    def _get_state(self, cursor, user_id, context=None):
        return (('created','Draft'), \
                ('draft', 'Open'), \
                ('field-closed', 'Field-Closed'), \
                ('mission-closed', 'Mission-Closed'), \
                ('done', 'HQ-Closed'))
    
    def action_set_state(self, cr, uid, ids, context):
        # check if unposted move lines are linked to this period
        move_line_obj = self.pool.get('account.move.line')
        move_lines = move_line_obj.search(cr, uid, [('period_id', 'in', ids)])
        for move_line in move_line_obj.browse(cr, uid, move_lines):
            if move_line.state != 'valid':
                raise osv.except_osv(_('Error !'), _('You cannot close a period containing unbalanced move lines!'))
        
        # otherwise, change the period's and journal period's states
        if context['state']:
            state = context['state']
            if state == 'done':
                journal_state = 'done'
            else:
                journal_state = 'draft'
            for id in ids:
                cr.execute('update account_journal_period set state=%s where period_id=%s', (journal_state, id))
                cr.execute('update account_period set state=%s where id=%s', (state, id))
        return True

    _columns = {
        'special': fields.boolean('Opening/Closing Period', size=12,
            help="These periods can overlap.", readonly=True),
        'state': fields.selection(_get_state, 'State', readonly=True,
            help='HQ opens a monthly period. After validation, it will be closed by the different levels.'),
    }
   
    def create(self, cr, uid, vals, context={}):
        if not context:
            context = {}

        if context.get('update_mode') in ['init', 'update'] and 'state' not in vals:
            logging.getLogger('init').info('Loading default draft state for account.period')
            vals['state'] = 'draft'

        return super(account_period_closing_level, self).create(cr, uid, vals, context=context)

    _defaults = {
        'state': 'created'
    }

account_period_closing_level()

# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: