Files
tryton/invoice.py
T
Marco Huymajer d96ad80376 Use accounting date instead of invoice date
For the analytic lines generated out of invoice lines use the accounting
date instead of the invoice date.

issue3075
review728002
(transplanted from 0103490821cb72dd23fe4c0821b756fa0ce22fe7)
2013-03-25 09:07:52 +01:00

241 lines
9.3 KiB
Python

#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
from __future__ import with_statement
from trytond.model import ModelView, ModelSQL, fields
from trytond.pyson import Not, Equal, Eval
from trytond.transaction import Transaction
class InvoiceLine(ModelSQL, ModelView):
_name = 'account.invoice.line'
analytic_accounts = fields.Many2One('analytic_account.account.selection',
'Analytic Accounts',
states={
'invisible': Not(Equal(Eval('type'), 'line')),
})
def _view_look_dom_arch(self, tree, type):
analytic_account_obj = self.pool.get('analytic_account.account')
analytic_account_obj.convert_view(tree)
arch, fields = super(InvoiceLine, self)._view_look_dom_arch(tree, type)
return arch, fields
def fields_get(self, fields_names=None):
analytic_account_obj = self.pool.get('analytic_account.account')
res = super(InvoiceLine, self).fields_get(fields_names)
analytic_accounts_field = super(InvoiceLine, self).fields_get(
['analytic_accounts'])['analytic_accounts']
res.update(analytic_account_obj.analytic_accounts_fields_get(
analytic_accounts_field, fields_names))
return res
def default_get(self, fields, with_rec_name=True):
fields = [x for x in fields if not x.startswith('analytic_account_')]
return super(InvoiceLine, self).default_get(fields,
with_rec_name=with_rec_name)
def read(self, ids, fields_names=None):
selection_obj = self.pool.get('analytic_account.account.selection')
int_id = False
if isinstance(ids, (int, long)):
int_id = True
ids = [ids]
if fields_names:
fields_names2 = [x for x in fields_names
if not x.startswith('analytic_account_')]
else:
fields_names2 = fields_names
res = super(InvoiceLine, self).read(ids, fields_names=fields_names2)
if not fields_names:
fields_names = list(set(self._columns.keys() \
+ self._inherit_fields.keys()))
root_ids = []
for field in fields_names:
if field.startswith('analytic_account_') and '.' not in field:
root_ids.append(int(field[len('analytic_account_'):]))
if root_ids:
id2record = {}
for record in res:
id2record[record['id']] = record
lines = self.browse(ids)
for line in lines:
for root_id in root_ids:
id2record[line.id]['analytic_account_' \
+ str(root_id)] = False
if line.type != 'line':
continue
if not line.analytic_accounts:
continue
for account in line.analytic_accounts.accounts:
if account.root.id in root_ids:
id2record[line.id]['analytic_account_' \
+ str(account.root.id)] = account.id
for field in fields_names:
if field.startswith('analytic_account_' + \
str(account.root.id) + '.'):
ham, field2 = field.split('.', 1)
id2record[line.id][field] = account[field2]
if int_id:
return res[0]
return res
def create(self, vals):
selection_obj = self.pool.get('analytic_account.account.selection')
vals = vals.copy()
selection_vals = {}
for field in vals.keys():
if field.startswith('analytic_account_'):
if vals[field]:
selection_vals.setdefault('accounts', [])
selection_vals['accounts'].append(('add', vals[field]))
del vals[field]
if vals.get('analytic_accounts'):
selection_obj.write(vals['analytic_accounts'], selection_vals)
elif vals.get('type', 'line') == 'line':
selection_id = selection_obj.create(selection_vals)
vals['analytic_accounts'] = selection_id
return super(InvoiceLine, self).create(vals)
def write(self, ids, vals):
selection_obj = self.pool.get('analytic_account.account.selection')
vals = vals.copy()
if isinstance(ids, (int, long)):
ids = [ids]
selection_vals = {}
for field in vals.keys():
if field.startswith('analytic_account_'):
root_id = int(field[len('analytic_account_'):])
selection_vals[root_id] = vals[field]
del vals[field]
if selection_vals:
lines = self.browse(ids)
for line in lines:
if line.type != 'line':
continue
accounts = []
if not line.analytic_accounts:
# Create missing selection
with Transaction().set_user(0):
selection_id = selection_obj.create({})
self.write(line.id, {
'analytic_accounts': selection_id,
})
line = self.browse(line.id)
for account in line.analytic_accounts.accounts:
if account.root.id in selection_vals:
value = selection_vals[account.root.id]
if value:
accounts.append(value)
else:
accounts.append(account.id)
for account_id in selection_vals.values():
if account_id \
and account_id not in accounts:
accounts.append(account_id)
selection_obj.write(line.analytic_accounts.id, {
'accounts': [('set', accounts)],
})
return super(InvoiceLine, self).write(ids, vals)
def delete(self, ids):
selection_obj = self.pool.get('analytic_account.account.selection')
if isinstance(ids, (int, long)):
ids = [ids]
selection_ids = []
lines = self.browse(ids)
for line in lines:
if line.analytic_accounts:
selection_ids.append(line.analytic_accounts.id)
res = super(InvoiceLine, self).delete(ids)
selection_obj.delete(selection_ids)
return res
def copy(self, ids, default=None):
selection_obj = self.pool.get('analytic_account.account.selection')
new_ids = super(InvoiceLine, self).copy(ids, default=default)
int_id = False
if isinstance(new_ids, (int, long)):
int_id = True
new_ids = [new_ids]
for line in self.browse(new_ids):
if line.analytic_accounts:
selection_id = selection_obj.copy(line.analytic_accounts.id)
self.write(line.id, {
'analytic_accounts': selection_id,
})
if int_id:
return new_ids[0]
return new_ids
def _credit(self, line):
selection_obj = self.pool.get('analytic_account.account.selection')
result = super(InvoiceLine, self)._credit(line)
if line.analytic_accounts:
selection_id = selection_obj.copy(line.analytic_accounts.id)
result['analytic_accounts'] = selection_id
return result
def get_move_line(self, line):
res = super(InvoiceLine, self).get_move_line(line)
if line.analytic_accounts and line.analytic_accounts.accounts:
res['analytic_lines'] = []
for account in line.analytic_accounts.accounts:
vals = {}
vals['name'] = line.description
vals['debit'] = res['debit']
vals['credit'] = res['credit']
vals['account'] = account.id
vals['journal'] = line.invoice.journal.id
vals['date'] = (line.invoice.accounting_date
or line.invoice.invoice_date)
vals['reference'] = line.invoice.reference
vals['party'] = line.invoice.party.id
res['analytic_lines'].append(('create', vals))
return res
InvoiceLine()
class Account(ModelSQL, ModelView):
_name = 'analytic_account.account'
def delete(self, ids):
account_invoice_line_obj = self.pool.get('account.invoice.line')
res = super(Account, self).delete(ids)
# Restart the cache on the fields_view_get method of account.invoice.line
account_invoice_line_obj.fields_view_get.reset()
return res
def create(self, vals):
account_invoice_line_obj = self.pool.get('account.invoice.line')
res = super(Account, self).create(vals)
# Restart the cache on the fields_view_get method of account.invoice.line
account_invoice_line_obj.fields_view_get.reset()
return res
def write(self, ids, vals):
account_invoice_line_obj = self.pool.get('account.invoice.line')
res = super(Account, self).write(ids, vals)
# Restart the cache on the fields_view_get method of account.invoice.line
account_invoice_line_obj.fields_view_get.reset()
return res
Account()