modifs
[odoo/odoo.git] / addons / account_analytic_plans / account_analytic_plans.py
index 7df623a..7f1e385 100644 (file)
@@ -1,25 +1,24 @@
-# -*- encoding: utf-8 -*-
+# -*- coding: utf-8 -*-
 ##############################################################################
 #
 #    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
-#    $Id$
+#    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
 #
 #    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation, either version 3 of the License, or
-#    (at your option) any later version.
+#    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 General Public License for more details.
+#    GNU Affero General Public License for more details.
 #
-#    You should have received a copy of the GNU General Public License
+#    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 xml import dom
+from lxml import etree
 
 from mx import DateTime
 from mx.DateTime import now
@@ -30,6 +29,7 @@ from osv import fields, osv,orm
 import ir
 
 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):
@@ -85,7 +85,7 @@ class account_analytic_plan_instance(osv.osv):
     _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),
+        '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'),
@@ -95,6 +95,18 @@ class account_analytic_plan_instance(osv.osv):
         '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.get('journal_id', False):
+            journal = self.pool.get('account.journal').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 = {}
@@ -122,7 +134,7 @@ class account_analytic_plan_instance(osv.osv):
             res.append((inst.id, name))
         return res
 
-    def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=80):
+    def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100):
         args= args or []
         if name:
             ids = self.search(cr, uid, [('code', '=', name)] + args, limit=limit, context=context or {})
@@ -132,9 +144,9 @@ class account_analytic_plan_instance(osv.osv):
             ids = self.search(cr, uid, args, limit=limit, context=context or {})
         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):
+    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)
+        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'):
             plan_id = False
@@ -162,8 +174,8 @@ class account_analytic_plan_instance(osv.osv):
                 <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 = dom.minidom.parseString(res['arch'])
-                xarch, xfields = self._view_look_dom_arch(cr, uid, doc, context=context)
+                doc = etree.fromstring(res['arch'].encode('utf8'))
+                xarch, xfields = self._view_look_dom_arch(cr, uid, doc, view_id, context=context)
                 res['arch'] = xarch
                 res['fields'] = xfields
             return res
@@ -176,7 +188,7 @@ class account_analytic_plan_instance(osv.osv):
 
             pids = self.pool.get('account.analytic.plan.instance').search(cr, uid, [('name','=',vals['name']),('code','=',vals['code']),('plan_id','<>',False)])
             if pids:
-                raise osv.except_osv('Error', 'A model having this name and code already exists !')
+                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)])
             for i in res:
@@ -189,7 +201,7 @@ class account_analytic_plan_instance(osv.osv):
                             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'])]):
                                 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 " + str(item.min_required) + " and " + 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)
 
@@ -253,13 +265,13 @@ class account_invoice_line(osv.osv):
             vals['analytics_id'] = vals['analytics_id'][0]
         return super(account_invoice_line, self).create(cr, uid, vals, context)
 
-    def move_line_get_item(self, cr, uid, line, 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 ['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, price_unit=False, address_invoice_id=False, context={}):
-        res_prod = super(account_invoice_line,self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, price_unit, address_invoice_id, 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)
         if rec and rec.analytics_id:
             res_prod['value'].update({'analytics_id':rec.analytics_id.id})
@@ -284,9 +296,12 @@ class account_move_line(osv.osv):
         super(account_move_line, self).create_analytic_lines(cr, uid, ids, context)
         for line in self.browse(cr, uid, ids, context):
            if line.analytics_id:
+               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 = self.pool.get('account.analytic.line').search(cr, uid, [('move_id','=',line.id)], context=context)
                if toremove:
-                    obj_line.unlink(cr, uid, toremove, context=context)
+                    line.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)
@@ -300,7 +315,7 @@ 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)
@@ -317,7 +332,7 @@ class account_invoice(osv.osv):
         res['analytics_id']=x.get('analytics_id',False)
         return res
 
-    def _get_analityc_lines(self, cr, uid, id):
+    def _get_analytic_lines(self, cr, uid, id):
         inv = self.browse(cr, uid, [id])[0]
         cur_obj = self.pool.get('res.currency')
 
@@ -374,3 +389,24 @@ class analytic_default(osv.osv):
     }
 analytic_default()
 
+class sale_order_line(osv.osv):
+    _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)
+        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)
+
+                if rec:
+                    pool_inv_line.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: