Launchpad automatic translations update.
[odoo/odoo.git] / addons / account_analytic_plans / account_analytic_plans.py
index 3ecaa2a..b25f699 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
 #
 #    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/>.     
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
 ##############################################################################
-from lxml import etree
 
-from mx import DateTime
-from mx.DateTime import now
 import time
+from lxml import etree
 
-import netsvc
-from osv import fields, osv, orm
-import ir
-
+from osv import fields, osv
 import tools
 from tools.translate import _
 
 class one2many_mod2(fields.one2many):
     def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None):
-        if not context:
+        if context is None:
             context = {}
         res = {}
         for id in ids:
             res[id] = []
         ids2 = None
         if 'journal_id' in context:
-            journal = obj.pool.get('account.journal').browse(cr, user, context['journal_id'], context)
-            pnum = int(name[7]) - 1
+            journal = obj.pool.get('account.journal').browse(cr, user, context['journal_id'], context=context)
+            pnum = int(name[7]) -1
             plan = journal.plan_id
             if plan and len(plan.plan_ids) > pnum:
                 acc_id = plan.plan_ids[pnum].root_analytic_id.id
-                ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id, 'in', ids), ('analytic_account_id', 'child_of', [acc_id])], limit=self._limit)
+                ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id,'in',ids),('analytic_account_id','child_of',[acc_id])], limit=self._limit)
         if ids2 is None:
-            ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id, 'in', ids)], limit=self._limit)
+            ids2 = obj.pool.get(self._obj).search(cr, user, [(self._fields_id,'in',ids)], limit=self._limit)
         for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'):
-            res[r[self._fields_id]].append(r['id'])
+            res[r[self._fields_id]].append( r['id'] )
         return res
 
 class account_analytic_plan(osv.osv):
     _name = "account.analytic.plan"
-    _description = "Analytic Plans"
+    _description = "Analytic Plan"
     _columns = {
-        'name': fields.char('Analytic Plan', size=64, required=True, select=True,),
+        'name': fields.char('Analytic Plan', size=64, required=True, select=True),
         'plan_ids': fields.one2many('account.analytic.plan.line', 'plan_id', 'Analytic Plans'),
     }
+
 account_analytic_plan()
 
 class account_analytic_plan_line(osv.osv):
     _name = "account.analytic.plan.line"
-    _description = "Analytic Plan Lines"
+    _description = "Analytic Plan Line"
+    _order = "sequence, id"
     _columns = {
-        'plan_id':fields.many2one('account.analytic.plan', 'Analytic Plan'),
+        'plan_id': fields.many2one('account.analytic.plan','Analytic Plan'),
         'name': fields.char('Plan Name', size=64, required=True, select=True),
-        'sequence':fields.integer('Sequence'),
-        'root_analytic_id': fields.many2one('account.analytic.account', 'Root Account', help="Root account of this plan.", required=True),
+        'sequence': fields.integer('Sequence'),
+        'root_analytic_id': fields.many2one('account.analytic.account', 'Root Account', help="Root account of this plan.", required=False),
         'min_required': fields.float('Minimum Allowed (%)'),
         'max_required': fields.float('Maximum Allowed (%)'),
     }
     _defaults = {
-        'min_required': lambda * args: 100.0,
-        'max_required': lambda * args: 100.0,
+        'min_required': 100.0,
+        'max_required': 100.0,
     }
-    _order = "sequence,id"
+
 account_analytic_plan_line()
 
 class account_analytic_plan_instance(osv.osv):
-    _name = 'account.analytic.plan.instance'
-    _description = 'Analytic Plan Instance'
+    _name = "account.analytic.plan.instance"
+    _description = "Analytic Plan Instance"
     _columns = {
-        'name':fields.char('Analytic Distribution', size=64),
-        'code':fields.char('Distribution Code', size=16),
-        'journal_id': fields.many2one('account.analytic.journal', 'Analytic Journal', required=True),
-        'account_ids':fields.one2many('account.analytic.plan.instance.line', 'plan_id', 'Account Id'),
-        'account1_ids':one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account1 Id'),
-        'account2_ids':one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account2 Id'),
-        'account3_ids':one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account3 Id'),
-        'account4_ids':one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account4 Id'),
-        'account5_ids':one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account5 Id'),
-        'account6_ids':one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account6 Id'),
-        'plan_id':fields.many2one('account.analytic.plan', "Model's Plan"),
+        'name': fields.char('Analytic Distribution', size=64),
+        'code': fields.char('Distribution Code', size=16),
+        'journal_id': fields.many2one('account.analytic.journal', 'Analytic Journal' ),
+        'account_ids': fields.one2many('account.analytic.plan.instance.line', 'plan_id', 'Account Id'),
+        'account1_ids': one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account1 Id'),
+        'account2_ids': one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account2 Id'),
+        'account3_ids': one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account3 Id'),
+        'account4_ids': one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account4 Id'),
+        'account5_ids': one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account5 Id'),
+        'account6_ids': one2many_mod2('account.analytic.plan.instance.line', 'plan_id', 'Account6 Id'),
+        'plan_id': fields.many2one('account.analytic.plan', "Model's Plan"),
     }
+
+    def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
+        if context is None:
+            context = {}
+        journal_obj = self.pool.get('account.journal')
+        if context.get('journal_id', False):
+            journal = journal_obj.browse(cr, user, [context['journal_id']], context=context)[0]
+            analytic_journal = journal.analytic_journal_id and journal.analytic_journal_id.id or False
+            args.append('|')
+            args.append(('journal_id', '=', analytic_journal))
+            args.append(('journal_id', '=', False))
+        res = super(account_analytic_plan_instance, self).search(cr, user, args, offset=offset, limit=limit, order=order,
+                                                                 context=context, count=count)
+        return res
+
     def copy(self, cr, uid, id, default=None, context=None):
         if not default:
             default = {}
-            default.update({'account1_ids':False, 'account2_ids':False, 'account3_ids':False,
+        default.update({'account1_ids':False, 'account2_ids':False, 'account3_ids':False,
                 'account4_ids':False, 'account5_ids':False, 'account6_ids':False})
-        return super(account_analytic_plan_instance, self).copy(cr, uid, id, default, context)
+        return super(account_analytic_plan_instance, self).copy(cr, uid, id, default, context=context)
 
-    def _default_journal(self, cr, uid, context={}):
+    def _default_journal(self, cr, uid, context=None):
+        if context is None:
+            context = {}
+        journal_obj = self.pool.get('account.journal')
         if context.has_key('journal_id') and context['journal_id']:
-            journal = self.pool.get('account.journal').browse(cr, uid, context['journal_id'])
+            journal = journal_obj.browse(cr, uid, context['journal_id'], context=context)
             if journal.analytic_journal_id:
                 return journal.analytic_journal_id.id
         return False
 
     _defaults = {
-        'plan_id': lambda * args: False,
+        'plan_id': False,
         'journal_id': _default_journal,
     }
-    def name_get(self, cr, uid, ids, context={}):
+    def name_get(self, cr, uid, ids, context=None):
         res = []
-        for inst in self.browse(cr, uid, ids, context):
+        for inst in self.browse(cr, uid, ids, context=context):
             name = inst.name or '/'
             if name and inst.code:
-                name = name + ' (' + inst.code + ')'
+                name=name+' ('+inst.code+')'
             res.append((inst.id, name))
         return res
 
@@ -133,34 +148,37 @@ class account_analytic_plan_instance(osv.osv):
         return self.name_get(cr, uid, ids, context or {})
 
     def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
-        wiz_id = self.pool.get('ir.actions.wizard').search(cr, uid, [("wiz_name", "=", "create.model")])
-        res = super(account_analytic_plan_instance, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
-
-        if (res['type'] == 'form'):
+        if context is None:
+            context = {}
+        wiz_id = self.pool.get('ir.actions.act_window').search(cr, uid, [("name","=","analytic.plan.create.model.action")], context=context)
+        res = super(account_analytic_plan_instance,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
+        journal_obj = self.pool.get('account.journal')
+        analytic_plan_obj = self.pool.get('account.analytic.plan')
+        if (res['type']=='form'):
             plan_id = False
             if context.get('journal_id', False):
-                plan_id = self.pool.get('account.journal').browse(cr, uid, int(context['journal_id']), context).plan_id
+                plan_id = journal_obj.browse(cr, uid, int(context['journal_id']), context=context).plan_id
             elif context.get('plan_id', False):
-                plan_id = self.pool.get('account.analytic.plan').browse(cr, uid, int(context['plan_id']), context)
+                plan_id = analytic_plan_obj.browse(cr, uid, int(context['plan_id']), context=context)
 
             if plan_id:
-                i = 1
+                i=1
                 res['arch'] = """<form string="%s">
     <field name="name"/>
     <field name="code"/>
     <field name="journal_id"/>
     <button name="%d" string="Save This Distribution as a Model" type="action" colspan="2"/>
-    """ % (tools.to_xml(plan_id.name), wiz_id[0])
+    """% (tools.to_xml(plan_id.name), wiz_id[0])
                 for line in plan_id.plan_ids:
-                    res['arch'] += """
-                    <field name="account%d_ids" string="%s" colspan="4">
+                    res['arch']+="""
+                    <field name="account%d_ids" string="%s" nolabel="1" colspan="4">
                     <tree string="%s" editable="bottom">
                         <field name="rate"/>
-                        <field name="analytic_account_id" domain="[('parent_id','child_of',[%d])]"/>
+                        <field name="analytic_account_id" domain="[('parent_id','child_of',[%d])]" groups="base.group_extended"/>
                     </tree>
                 </field>
-                <newline/>""" % (i, tools.to_xml(line.name), tools.to_xml(line.name), line.root_analytic_id and line.root_analytic_id.id or 0)
-                    i += 1
+                <newline/>"""%(i,tools.to_xml(line.name),tools.to_xml(line.name),line.root_analytic_id and line.root_analytic_id.id or 0)
+                    i+=1
                 res['arch'] += "</form>"
                 doc = etree.fromstring(res['arch'].encode('utf8'))
                 xarch, xfields = self._view_look_dom_arch(cr, uid, doc, view_id, context=context)
@@ -171,61 +189,71 @@ class account_analytic_plan_instance(osv.osv):
             return res
 
     def create(self, cr, uid, vals, context=None):
+        journal_obj = self.pool.get('account.journal')
+        ana_plan_instance_obj = self.pool.get('account.analytic.plan.instance')
+        acct_anal_acct = self.pool.get('account.analytic.account')
+        acct_anal_plan_line_obj = self.pool.get('account.analytic.plan.line')
         if context and 'journal_id' in context:
-            journal = self.pool.get('account.journal').browse(cr, uid, context['journal_id'])
+            journal = journal_obj.browse(cr, uid, context['journal_id'], context=context)
 
-            pids = self.pool.get('account.analytic.plan.instance').search(cr, uid, [('name', '=', vals['name']), ('code', '=', vals['code']), ('plan_id', '<>', False)])
+            pids = ana_plan_instance_obj.search(cr, uid, [('name','=',vals['name']), ('code','=',vals['code']), ('plan_id','<>',False)], context=context)
             if pids:
                 raise osv.except_osv(_('Error'), _('A model having this name and code already exists !'))
 
-            res = self.pool.get('account.analytic.plan.line').search(cr, uid, [('plan_id', '=', journal.plan_id.id)])
+            res = acct_anal_plan_line_obj.search(cr, uid, [('plan_id','=',journal.plan_id.id)], context=context)
             for i in res:
                 total_per_plan = 0
-                item = self.pool.get('account.analytic.plan.line').browse(cr, uid, i)
-                temp_list = ['account1_ids', 'account2_ids', 'account3_ids', 'account4_ids', 'account5_ids', 'account6_ids']
+                item = acct_anal_plan_line_obj.browse(cr, uid, i, context=context)
+                temp_list = ['account1_ids','account2_ids','account3_ids','account4_ids','account5_ids','account6_ids']
                 for l in temp_list:
                     if vals.has_key(l):
                         for tempo in vals[l]:
-                            if self.pool.get('account.analytic.account').search(cr, uid, [('parent_id', 'child_of', [item.root_analytic_id.id]), ('id', '=', tempo[2]['analytic_account_id'])]):
+                            if acct_anal_acct.search(cr, uid, [('parent_id', 'child_of', [item.root_analytic_id.id]), ('id', '=', tempo[2]['analytic_account_id'])], context=context):
                                 total_per_plan += tempo[2]['rate']
                 if total_per_plan < item.min_required or total_per_plan > item.max_required:
-                    raise osv.except_osv(_('Value Error') , _('The Total Should be Between %s and %s') % (str(item.min_required), str(item.max_required)))
+                    raise osv.except_osv(_('Value Error'),_('The Total Should be Between %s and %s') % (str(item.min_required), str(item.max_required)))
 
-        return super(account_analytic_plan_instance, self).create(cr, uid, vals, context)
+        return super(account_analytic_plan_instance, self).create(cr, uid, vals, context=context)
 
-    def write(self, cr, uid, ids, vals, context={}, check=True, update_check=True):
-        this = self.browse(cr, uid, ids[0])
+    def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True):
+        if context is None:
+            context = {}
+        this = self.browse(cr, uid, ids[0], context=context)
+        invoice_line_obj = self.pool.get('account.invoice.line')
         if this.plan_id and not vals.has_key('plan_id'):
             #this instance is a model, so we have to create a new plan instance instead of modifying it
             #copy the existing model
-            temp_id = self.copy(cr, uid, this.id, None, context)
+            temp_id = self.copy(cr, uid, this.id, None, context=context)
             #get the list of the invoice line that were linked to the model
-            list = self.pool.get('account.invoice.line').search(cr, uid, [('analytics_id', '=', this.id)])
+            lists = invoice_line_obj.search(cr, uid, [('analytics_id','=',this.id)], context=context)
             #make them link to the copy
-            self.pool.get('account.invoice.line').write(cr, uid, list, {'analytics_id':temp_id}, context)
+            invoice_line_obj.write(cr, uid, lists, {'analytics_id':temp_id}, context=context)
 
             #and finally modify the old model to be not a model anymore
             vals['plan_id'] = False
             if not vals.has_key('name'):
-                vals['name'] = this.name and (str(this.name) + '*') or "*"
+                vals['name'] = this.name and (str(this.name)+'*') or "*"
             if not vals.has_key('code'):
-                vals['code'] = this.code and (str(this.code) + '*') or "*"
-        return super(account_analytic_plan_instance, self).write(cr, uid, ids, vals, context)
+                vals['code'] = this.code and (str(this.code)+'*') or "*"
+        return super(account_analytic_plan_instance, self).write(cr, uid, ids, vals, context=context)
 
 account_analytic_plan_instance()
 
 class account_analytic_plan_instance_line(osv.osv):
-    _name = 'account.analytic.plan.instance.line'
-    _description = 'Analytic Instance Line'
+    _name = "account.analytic.plan.instance.line"
+    _description = "Analytic Instance Line"
     _columns = {
-        'plan_id':fields.many2one('account.analytic.plan.instance', 'Plan Id'),
-        'analytic_account_id':fields.many2one('account.analytic.account', 'Analytic Account', required=True),
-        'rate':fields.float('Rate (%)', required=True),
+        'plan_id': fields.many2one('account.analytic.plan.instance', 'Plan Id'),
+        'analytic_account_id': fields.many2one('account.analytic.account', 'Analytic Account', required=True, domain=[('type','<>','view')]),
+        'rate': fields.float('Rate (%)', required=True),
     }
-    def name_get(self, cr, uid, ids, context={}):
-        if not len(ids):
+    _defaults = {
+        'rate': 100.0
+    }
+    def name_get(self, cr, uid, ids, context=None):
+        if not ids:
             return []
-        reads = self.read(cr, uid, ids, ['analytic_account_id'], context)
+        reads = self.read(cr, uid, ids, ['analytic_account_id'], context=context)
         res = []
         for record in reads:
             res.append((record['id'], record['analytic_account_id']))
@@ -234,42 +262,44 @@ class account_analytic_plan_instance_line(osv.osv):
 account_analytic_plan_instance_line()
 
 class account_journal(osv.osv):
-    _inherit = 'account.journal'
-    _name = 'account.journal'
+    _inherit = "account.journal"
+    _name = "account.journal"
     _columns = {
-        'plan_id':fields.many2one('account.analytic.plan', 'Analytic Plans'),
+        'plan_id': fields.many2one('account.analytic.plan', 'Analytic Plans'),
     }
+
 account_journal()
 
 class account_invoice_line(osv.osv):
-    _inherit = 'account.invoice.line'
-    _name = 'account.invoice.line'
+    _inherit = "account.invoice.line"
+    _name = "account.invoice.line"
     _columns = {
-        'analytics_id':fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
+        'analytics_id': fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
     }
 
     def create(self, cr, uid, vals, context=None):
         if 'analytics_id' in vals and isinstance(vals['analytics_id'], tuple):
             vals['analytics_id'] = vals['analytics_id'][0]
-        return super(account_invoice_line, self).create(cr, uid, vals, context)
+        return super(account_invoice_line, self).create(cr, uid, vals, context=context)
 
     def move_line_get_item(self, cr, uid, line, context=None):
-        res = super(account_invoice_line, self).move_line_get_item(cr, uid, line, context={})
+        res = super(account_invoice_line, self).move_line_get_item(cr, uid, line, context=context)
         res ['analytics_id'] = line.analytics_id and line.analytics_id.id or False
         return res
 
-    def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, context=None):
-        res_prod = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, context)
-        rec = self.pool.get('account.analytic.default').account_get(cr, uid, product, partner_id, uid, time.strftime('%Y-%m-%d'), context)
+    def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None):
+        res_prod = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, currency_id, context=context)
+        rec = self.pool.get('account.analytic.default').account_get(cr, uid, product, partner_id, uid, time.strftime('%Y-%m-%d'), context=context)
         if rec and rec.analytics_id:
-            res_prod['value'].update({'analytics_id':rec.analytics_id.id})
+            res_prod['value'].update({'analytics_id': rec.analytics_id.id})
         return res_prod
+
 account_invoice_line()
 
 class account_move_line(osv.osv):
 
-    _inherit = 'account.move.line'
-    _name = 'account.move.line'
+    _inherit = "account.move.line"
+    _name = "account.move.line"
     _columns = {
         'analytics_id':fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
     }
@@ -280,17 +310,23 @@ class account_move_line(osv.osv):
             del(data['analytics_id'])
         return data
 
-    def create_analytic_lines(self, cr, uid, ids, context={}):
-        super(account_move_line, self).create_analytic_lines(cr, uid, ids, context)
-        for line in self.browse(cr, uid, ids, context):
+    def create_analytic_lines(self, cr, uid, ids, context=None):
+        if context is None:
+            context = {}
+        super(account_move_line, self).create_analytic_lines(cr, uid, ids, context=context)
+        analytic_line_obj = self.pool.get('account.analytic.line')
+        for line in self.browse(cr, uid, ids, context=context):
            if line.analytics_id:
-               toremove = self.pool.get('account.analytic.line').search(cr, uid, [('move_id', '=', line.id)], context=context)
+               if not line.journal_id.analytic_journal_id:
+                   raise osv.except_osv(_('No Analytic Journal !'),_("You have to define an analytic journal on the '%s' journal!") % (line.journal_id.name,))
+
+               toremove = analytic_line_obj.search(cr, uid, [('move_id','=',line.id)], context=context)
                if toremove:
-                    line.unlink(cr, uid, toremove, context=context)
+                    analytic_line_obj.unlink(cr, uid, toremove, context=context)
                for line2 in line.analytics_id.account_ids:
                    val = (line.credit or  0.0) - (line.debit or 0.0)
-                   amt = val * (line2.rate / 100)
-                   al_vals = {
+                   amt=val * (line2.rate/100)
+                   al_vals={
                        'name': line.name,
                        'date': line.date,
                        'account_id': line2.analytic_account_id.id,
@@ -300,54 +336,61 @@ class account_move_line(osv.osv):
                        'amount': amt,
                        'general_account_id': line.account_id.id,
                        'move_id': line.id,
-                       'journal_id': line.analytics_id.journal_id.id,
+                       'journal_id': line.journal_id.analytic_journal_id.id,
                        'ref': line.ref,
                    }
-                   ali_id = self.pool.get('account.analytic.line').create(cr, uid, al_vals)
+                   analytic_line_obj.create(cr, uid, al_vals, context=context)
         return True
 
+    def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
+        if context is None:
+            context = {}
+        result = super(osv.osv, self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
+        return result
+
 account_move_line()
 
 class account_invoice(osv.osv):
     _name = "account.invoice"
     _inherit = "account.invoice"
 
-    def line_get_convert(self, cr, uid, x, part, date, context={}):
-        res = super(account_invoice, self).line_get_convert(cr, uid, x, part, date, context)
+    def line_get_convert(self, cr, uid, x, part, date, context=None):
+        res=super(account_invoice,self).line_get_convert(cr, uid, x, part, date, context=context)
         res['analytics_id'] = x.get('analytics_id', False)
         return res
 
     def _get_analytic_lines(self, cr, uid, id):
         inv = self.browse(cr, uid, [id])[0]
         cur_obj = self.pool.get('res.currency')
-
+        invoice_line_obj = self.pool.get('account.invoice.line')
+        acct_ins_obj = self.pool.get('account.analytic.plan.instance')
         company_currency = inv.company_id.currency_id.id
         if inv.type in ('out_invoice', 'in_refund'):
             sign = 1
         else:
             sign = -1
 
-        iml = self.pool.get('account.invoice.line').move_line_get(cr, uid, inv.id)
+        iml = invoice_line_obj.move_line_get(cr, uid, inv.id)
 
         for il in iml:
-            if il['analytics_id']:
+            if il.get('analytics_id', False):
 
                 if inv.type in ('in_invoice', 'in_refund'):
                     ref = inv.reference
                 else:
                     ref = self._convert_ref(cr, uid, inv.number)
-                obj_move_line = self.pool.get('account.analytic.plan.instance').browse(cr, uid, il['analytics_id'])
+                obj_move_line = acct_ins_obj.browse(cr, uid, il['analytics_id'])
                 amount_calc = cur_obj.compute(cr, uid, inv.currency_id.id, company_currency, il['price'], context={'date': inv.date_invoice}) * sign
                 qty = il['quantity']
                 il['analytic_lines'] = []
                 for line2 in obj_move_line.account_ids:
-                    amt = amount_calc * (line2.rate / 100)
-                    qtty = qty * (line2.rate / 100)
+                    amt = amount_calc * (line2.rate/100)
+                    qtty = qty* (line2.rate/100)
                     al_vals = {
                         'name': il['name'],
                         'date': inv['date_invoice'],
-                        'unit_amount':qtty,
-                        'product_id':il['product_id'],
+                        'unit_amount': qtty,
+                        'product_id': il['product_id'],
                         'account_id': line2.analytic_account_id.id,
                         'amount': amt,
                         'product_uom_id': il['uos_id'],
@@ -368,31 +411,68 @@ class account_analytic_plan(osv.osv):
 account_analytic_plan()
 
 class analytic_default(osv.osv):
-    _inherit = 'account.analytic.default'
+    _inherit = "account.analytic.default"
     _columns = {
         'analytics_id': fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
     }
+
 analytic_default()
 
 class sale_order_line(osv.osv):
-    _inherit = 'sale.order.line'
+    _inherit = "sale.order.line"
 
     # Method overridden to set the analytic account by default on criterion match
-    def invoice_line_create(self, cr, uid, ids, context={}):
-        create_ids = super(sale_order_line, self).invoice_line_create(cr, uid, ids, context)
+    def invoice_line_create(self, cr, uid, ids, context=None):
+        create_ids = super(sale_order_line,self).invoice_line_create(cr, uid, ids, context=context)
+        inv_line_obj = self.pool.get('account.invoice.line')
+        acct_anal_def_obj = self.pool.get('account.analytic.default')
         if ids:
-            sale_line_obj = self.browse(cr, uid, ids[0], context)
-            pool_inv_line = self.pool.get('account.invoice.line')
-
-            for line in pool_inv_line.browse(cr, uid, create_ids, context):
-                rec = self.pool.get('account.analytic.default').account_get(cr, uid, line.product_id.id, sale_line_obj.order_id.partner_id.id, uid, time.strftime('%Y-%m-%d'), context)
+            sale_line = self.browse(cr, uid, ids[0], context=context)
+            for line in inv_line_obj.browse(cr, uid, create_ids, context=context):
+                rec = acct_anal_def_obj.account_get(cr, uid, line.product_id.id, sale_line.order_id.partner_id.id, uid, time.strftime('%Y-%m-%d'), context)
 
                 if rec:
-                    pool_inv_line.write(cr, uid, [line.id], {'analytics_id':rec.analytics_id.id}, context=context)
-                    cr.commit()
+                    inv_line_obj.write(cr, uid, [line.id], {'analytics_id': rec.analytics_id.id}, context=context)
         return create_ids
 
 sale_order_line()
 
 
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+class account_bank_statement(osv.osv):
+    _inherit = "account.bank.statement"
+    _name = "account.bank.statement"
+    
+    def create_move_from_st_line(self, cr, uid, st_line_id, company_currency_id, st_line_number, context=None):
+        account_move_line_pool = self.pool.get('account.move.line')
+        account_bank_statement_line_pool = self.pool.get('account.bank.statement.line')
+        st_line = account_bank_statement_line_pool.browse(cr, uid, st_line_id, context=context)
+        result = super(account_bank_statement,self).create_move_from_st_line(cr, uid, st_line_id, company_currency_id, st_line_number, context=context)
+        move = st_line.move_ids and st_line.move_ids[0] or False
+        if move:
+            for line in move.line_id:
+                account_move_line_pool.write(cr, uid, [line.id], {'analytics_id':st_line.analytics_id.id}, context=context)
+        return result
+
+    def button_confirm_bank(self, cr, uid, ids, context=None):
+        super(account_bank_statement,self).button_confirm_bank(cr, uid, ids, context=context)
+        for st in self.browse(cr, uid, ids, context=context):
+            for st_line in st.line_ids:
+                if st_line.analytics_id:
+                    if not st.journal_id.analytic_journal_id:
+                        raise osv.except_osv(_('No Analytic Journal !'),_("You have to define an analytic journal on the '%s' journal!") % (st.journal_id.name,))
+                if not st_line.amount:
+                    continue
+        return True
+    
+account_bank_statement()
+
+
+class account_bank_statement_line(osv.osv):
+    _inherit = "account.bank.statement.line"
+    _name = "account.bank.statement.line"
+    _columns = {
+        'analytics_id': fields.many2one('account.analytic.plan.instance', 'Analytic Distribution'),
+    }
+account_bank_statement_line()
+
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
\ No newline at end of file