modifs
[odoo/odoo.git] / addons / account_analytic_plans / account_analytic_plans.py
index 8367adb..7f1e385 100644 (file)
@@ -1,8 +1,8 @@
 # -*- coding: utf-8 -*-
 ##############################################################################
-#    
+#
 #    OpenERP, Open Source Management Solution
-#    Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
+#    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 Affero General Public License as
@@ -15,7 +15,7 @@
 #    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
@@ -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 = {}
@@ -258,8 +270,8 @@ class account_invoice_line(osv.osv):
         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)
+    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,6 +296,9 @@ 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:
                     line.unlink(cr, uid, toremove, context=context)
@@ -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)
@@ -374,4 +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: