X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Faccount_analytic_plans%2Faccount_analytic_plans.py;h=7f1e3854f6a226656332eb9348e8339a6dacbf16;hb=036dfd209ee714f2ca0e6c4cd0cc122556e2dbca;hp=b1e61d29cd7ac680304a0f50e735f68d7730417a;hpb=65652235c672cdc129e27f2e82be18b7bedbf928;p=odoo%2Fodoo.git diff --git a/addons/account_analytic_plans/account_analytic_plans.py b/addons/account_analytic_plans/account_analytic_plans.py index b1e61d2..7f1e385 100644 --- a/addons/account_analytic_plans/account_analytic_plans.py +++ b/addons/account_analytic_plans/account_analytic_plans.py @@ -1,25 +1,24 @@ -# -*- encoding: utf-8 -*- +# -*- coding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution -# Copyright (C) 2004-2008 Tiny SPRL (). All Rights Reserved -# $Id$ +# Copyright (C) 2004-2010 Tiny SPRL (). # # 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 . # ############################################################################## -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): """%(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'] += "" - 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,10 +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)) - - if not vals['name'] and not vals['code']: - raise osv.except_osv('Error', 'Make sure You have entered Name and Code for the model !') + 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) @@ -213,10 +222,7 @@ class account_analytic_plan_instance(osv.osv): 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 self.write(cr, uid, [this.id],vals, context) - else: - #this plan instance isn't a model, so a simple write is fine - return super(account_analytic_plan_instance, self).write(cr, uid, ids, vals, context) + return super(account_analytic_plan_instance, self).write(cr, uid, ids, vals, context) account_analytic_plan_instance() @@ -259,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}) @@ -280,54 +286,40 @@ class account_move_line(osv.osv): 'analytics_id':fields.many2one('account.analytic.plan.instance','Analytic Distribution'), } - def _analytic_update(self, cr, uid, ids, context): - if self.called: - self.called=False - return False - - obj_line=self.pool.get('account.analytic.line') + def _default_get_move_form_hook(self, cursor, user, data): + data = super(account_move_line, self)._default_get_move_form_hook(cursor, user, data) + if data.has_key('analytics_id'): + del(data['analytics_id']) + return data - for line in self.browse(cr, uid, ids, context): + 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): if line.analytics_id: - toremove = obj_line.search(cr, uid, [('move_id','=',line.id)], context=context) - if toremove: - obj_line.unlink(cr, uid, toremove, 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 = self.pool.get('account.analytic.line').search(cr, uid, [('move_id','=',line.id)], context=context) + if toremove: + line.unlink(cr, uid, toremove, context=context) for line2 in line.analytics_id.account_ids: - val = (line.debit or 0.0) - (line.credit or 0.0) + val = (line.credit or 0.0) - (line.debit or 0.0) amt=val * (line2.rate/100) al_vals={ 'name': line.name, 'date': line.date, - 'unit_amount':1, - 'product_id':12, 'account_id': line2.analytic_account_id.id, + 'unit_amount': line.quantity, + 'product_id': line.product_id and line.product_id.id or False, + 'product_uom_id': line.product_uom_id and line.product_uom_id.id or False, '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) - self.called=True - return True - - def write(self, cr, uid, ids, vals, context=None, check=True, update_check=True): - self.called=False - if ('analytics_id' in vals) and (not vals['analytics_id']): - for line in self.browse(cr, uid, ids, context): - toremove = self.pool.get('account.analytic.line').search(cr, uid, [('move_id','=',line.id)], context=context) - if toremove: - self.pool.get('account.analytic.line').unlink(cr, uid, toremove, context=context) - result = super(account_move_line, self).write(cr, uid, ids, vals, context, check, update_check) - self._analytic_update(cr, uid, ids, context) - return result - - def create(self, cr, uid, vals, context=None, check=True): - self.called=False - result = super(account_move_line, self).create(cr, uid, vals, context, check) - self._analytic_update(cr, uid, [result], context) - return result + return True account_move_line() @@ -340,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') @@ -397,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: