##############################################################################
import time
-from lxml import etree
from osv import fields, osv
from tools.translate import _
class account_analytic_account(osv.osv):
_name = 'account.analytic.account'
+ _inherit = ['mail.thread']
_description = 'Analytic Account'
def _compute_level_tree(self, cr, uid, ids, child_ids, res, field_names, context=None):
'name': fields.char('Account Name', size=128, required=True),
'complete_name': fields.function(_complete_name_calc, type='char', string='Full Account Name'),
'code': fields.char('Code/Reference', size=24, select=True),
- 'type': fields.selection([('view','Analytic View'), ('normal','Analytic Account'),('contract','Contract or Project'),('template','Template of Project')], 'Type of Account', help='If you select the View Type, it means you won\'t allow to create journal entries using that account.'),
+ 'type': fields.selection([('view','Analytic View'), ('normal','Analytic Account'),('contract','Contract or Project'),('template','Template of Project')], 'Type of Account', required=True,
+ help="If you select the View Type, it means you won\'t allow to create journal entries using that account.\n"\
+ "The type 'Analytic account' stands for usual accounts that you only want to use in accounting.\n"\
+ "If you select Contract or Project, it offers you the possibility to manage the validity and the invoicing options for this account.\n"\
+ "The special type 'Template of Project' allows you to define a template with default data that you can reuse easily."),
+ 'template_id': fields.many2one('account.analytic.account', 'Template of Contract'),
'description': fields.text('Description'),
'parent_id': fields.many2one('account.analytic.account', 'Parent Analytic Account', select=2),
'child_ids': fields.one2many('account.analytic.account', 'parent_id', 'Child Accounts'),
'credit': fields.function(_debit_credit_bal_qtty, type='float', string='Credit', multi='debit_credit_bal_qtty', digits_compute=dp.get_precision('Account')),
'quantity': fields.function(_debit_credit_bal_qtty, type='float', string='Quantity', multi='debit_credit_bal_qtty'),
'quantity_max': fields.float('Maximum Time', help='Sets the higher limit of time to work on the contract.'),
- 'partner_id': fields.many2one('res.partner', 'Customer', required=True),
- 'user_id': fields.many2one('res.users', 'Account Manager'),
+ 'partner_id': fields.many2one('res.partner', 'Customer'),
+ 'user_id': fields.many2one('res.users', 'Project Manager'),
+ 'manager_id': fields.many2one('res.users', 'Account Manager'),
'date_start': fields.date('Date Start'),
'date': fields.date('Date End', select=True),
'company_id': fields.many2one('res.company', 'Company', required=False), #not required because we want to allow different companies to use the same chart of account, except for leaf accounts.
}, string='Currency', type='many2one', relation='res.currency'),
}
+ def on_change_template(self, cr, uid, ids, template_id, context=None):
+ if not template_id:
+ return {}
+ res = {'value':{}}
+ template = self.browse(cr, uid, template_id, context=context)
+ res['value']['date_start'] = template.date_start
+ res['value']['date'] = template.date
+ res['value']['quantity_max'] = template.quantity_max
+ res['value']['description'] = template.description
+ return res
+
def on_change_partner_id(self, cr, uid, ids,partner_id, name, context={}):
res={}
if partner_id:
- part = self.pool.get('res.partner').browse(cr, uid, partner_id,context=context)
+ partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context)
+ if partner.user_id:
+ res['manager_id'] = partner.user_id.id
if not name:
- res['name'] = part.name
- if part.user_id:res['user_id'] = part.user_id.id
+ res['name'] = _('Contract: ') + partner.name
return {'value': res}
def _default_company(self, cr, uid, context=None):
default['line_ids'] = []
return super(account_analytic_account, self).copy(cr, uid, id, default, context=context)
- def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
- res = super(account_analytic_account, self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu)
- if view_type == 'form':
- doc = etree.XML(res['arch'])
- nodes = doc.xpath("//field[@name='name']")
- if context.get('default_type') == 'contract':
- for node in nodes:
- node.set('string', 'Contract/Project Name')
- if context.get('default_type') == 'template':
- for node in nodes:
- node.set('string', 'Template/Project Name')
- res['arch'] = etree.tostring(doc)
- return res
-
def on_change_company(self, cr, uid, id, company_id):
if not company_id:
return {}
account = self.search(cr, uid, args, limit=limit, context=context)
return self.name_get(cr, uid, account, context=context)
+ def create(self, cr, uid, vals, context=None):
+ contract = super(account_analytic_account, self).create(cr, uid, vals, context=context)
+ if contract:
+ self.create_send_note(cr, uid, [contract], context=context)
+ return contract
+
+ def create_send_note(self, cr, uid, ids, context=None):
+ for obj in self.browse(cr, uid, ids, context=context):
+ self.message_subscribe(cr, uid, [obj.id], [obj.user_id.id], context=context)
+ self.message_append_note(cr, uid, [obj.id], body=_("Contract for <em>%s</em> has been <b>created</b>.") % (obj.partner_id.name), context=context)
+
account_analytic_account()
}
_order = 'date desc'
-
+
def _check_no_view(self, cr, uid, ids, context=None):
analytic_lines = self.browse(cr, uid, ids, context=context)
for line in analytic_lines:
if line.account_id.type == 'view':
return False
return True
-
+
_constraints = [
(_check_no_view, 'You can not create analytic line on view account.', ['account_id']),
- ]
+ ]
account_analytic_line()