Hi there, Hi really need your help on solving an Attribute error I am having on the module "account_transfer" from Cubic ERP. The problem is when I want to get the transfer "Done" I get an error with the following lines:
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons-pack\account_transfer\account_transfer.py", line 214, in action_done
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\account_voucher\account_voucher.py", line 842, in proforma_voucher
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\lst_account_lt\account_voucher\account_voucher.py", line 577, in action_move_line_create
File "C:\Program Files (x86)\OpenERP 7.0\Server\server\openerp\addons\lst_account_lt\account_voucher\account_voucher.py", line 445, in voucher_move_line_create
AttributeError: 'NoneType' object has no attribute 'id'
For what I see the error is related to 3 modules and 4 areas of code.
1- action_done (account_transfer)
def action_done(self, cr, uid, ids, context=None):
voucher_obj = self.pool.get('account.voucher')
move_obj = self.pool.get('account.move')
for trans in self.browse(cr, uid, ids, context=context):
paid_amount = []
# import pdb; pdb.set_trace()
for voucher in trans.voucher_ids:
voucher.state=='draft' and voucher_obj.proforma_voucher(cr, uid, [voucher.id], context=context)
sign = (voucher.journal_id.id == trans.src_journal_id.id) and 1 or -1
paid_amount.append(sign * voucher_obj._paid_amount_in_company_currency(cr, uid, [voucher.id], '', '')[voucher.id])
#paid_amount.append(sign * voucher.paid_amount_in_company_currency)
sum_amount = sum(paid_amount)
if len(paid_amount) > 1 and sum_amount != 0.0:
periods = self.pool.get('account.period').find(cr, uid)
move = {}
move['journal_id'] = trans.dst_journal_id.id
move['period_id'] = periods and periods[0] or False
move['ref'] = trans.name + str(trans.origin and (' - ' + trans.origin) or '')
move['date'] = trans.date
move['line_id'] = [(0,0,{}),(0,0,{})]
move['line_id'][0][2]['name'] = trans.name
move['line_id'][1][2]['name'] = trans.name
if sum_amount > 0:
move['line_id'][0][2]['account_id'] = trans.dst_journal_id.default_debit_account_id.id
move['line_id'][1][2]['account_id'] = trans.src_journal_id.account_transit.id #trans.company_id.income_currency_exchange_account_id.id
move['line_id'][0][2]['debit'] = sum_amount
move['line_id'][1][2]['credit'] = sum_amount
else:
move['line_id'][0][2]['account_id'] = trans.dst_journal_id.default_credit_account_id.id
move['line_id'][1][2]['account_id'] = trans.src_journal_id.account_transit.id #trans.company_id.expense_currency_exchange_account_id.id
move['line_id'][1][2]['debit'] = -1 * sum_amount
move['line_id'][0][2]['credit'] = -1 * sum_amount
move_id = move_obj.create(cr, uid, move, context=context)
self.write(cr, uid, [trans.id], {'adjust_move':move_id}, context=context)
return self.write(cr, uid, ids, {'state':'done'},context=context)
2 - proforma_voucher
def proforma_voucher(self, cr, uid, ids, context=None):
self.action_move_line_create(cr, uid, ids, context=context)
return True
3- voucher_move_line_create (line 445)
def voucher_move_line_create(self, cr, uid, voucher_id, line_total, invoice, move_id, company_currency, current_currency, context=None):
'''
Create one account move line, on the given account move, per voucher line where amount is not 0.0.
It returns Tuple with tot_line what is total of difference between debit and credit and
a list of lists with ids to be reconciled with this format (total_deb_cred,list_of_lists).
:param voucher_id: Voucher id what we are working with
:param line_total: Amount of the first line, which correspond to the amount we should totally split among all voucher lines.
:param move_id: Account move wher those lines will be joined.
:param company_currency: id of currency of the company to which the voucher belong
:param current_currency: id of currency of the voucher
:return: Tuple build as (remaining amount not allocated on voucher lines, list of account_move_line created in this method)
:rtype: tuple(float, list of int)
'''
if context is None:
context = {}
move_line_obj = self.pool.get('account.move.line')
currency_obj = self.pool.get('res.currency')
tax_obj = self.pool.get('account.tax')
tot_line = line_total
rec_lst_ids = []
lst_adv_ids = []
voucher_brw = self.pool.get('account.voucher').browse(cr, uid, voucher_id, context)
ctx = context.copy()
ctx.update({'date': voucher_brw.date})
prec = self.pool.get('decimal.precision').precision_get(cr, uid, 'Account')
for line in voucher_brw.line_ids:
#create one move line per voucher line where amount is not 0.0
# AND (second part of the clause) only if the original move line was not having debit = credit = 0 (which is a legal value)
if not line.amount and not (line.move_line_id and not float_compare(line.move_line_id.debit, line.move_line_id.credit, precision_rounding=prec) and not float_compare(line.move_line_id.debit, 0.0, precision_rounding=prec)):
continue
# convert the amount set on the voucher line into the currency of the voucher's company
amount = self._convert_amount(cr, uid, line.untax_amount or line.amount, voucher_brw.id, context=ctx)
# if the amount encoded in voucher is equal to the amount unreconciled, we need to compute the
if line.contract_tax_value > 0.0:
invoice_minus_tax = line.amount_original - line.contract_tax_value
percentage_being_paid = line.amount / invoice_minus_tax
amount += self._convert_amount(cr, uid, line.contract_tax_value * percentage_being_paid, voucher_brw.id, context=ctx)
if line.amount == line.amount_unreconciled:
if not line.move_line_id:
raise osv.except_osv(_('Wrong voucher line'), _("The invoice you are willing to pay is not valid anymore."))
# currency rate difference
sign = voucher_brw.type in ('payment', 'purchase') and -1 or 1
currency_rate_difference = sign * (line.move_line_id.amount_residual - amount)
else:
currency_rate_difference = 0.0
move_line = {
'journal_id': voucher_brw.journal_id.id,
'period_id': voucher_brw.period_id.id,
'name': line.name or '/',
'account_id': line.account_id.id,
'move_id': move_id,
'partner_id': voucher_brw.partner_id.id,
'currency_id': line.move_line_id and (company_currency <> line.move_line_id.currency_id.id and line.move_line_id.currency_id.id) or False,
'analytic_account_id': line.account_analytic_id and line.account_analytic_id.id or False,
'quantity': 1,
'credit': 0.0,
'debit': 0.0,
'date': voucher_brw.date,
ERROR LINE 445 --- 'advance_id': line.move_line_id.advance_id.id,
}
if amount < 0:
amount = -amount
if line.type == 'dr':
line.type = 'cr'
else:
line.type = 'dr'
if (line.type=='dr'):
tot_line += amount
move_line['debit'] = amount
else:
tot_line -= amount
move_line['credit'] = amount
if voucher_brw.tax_id and voucher_brw.type in ('sale', 'purchase'):
move_line.update({
'account_tax_id': voucher_brw.tax_id.id,
})
if move_line.get('account_tax_id', False):
tax_data = tax_obj.browse(cr, uid, [move_line['account_tax_id']], context=context)[0]
if not (tax_data.base_code_id and tax_data.tax_code_id):
raise osv.except_osv(_('No Account Base Code and Account Tax Code!'),_("You have to configure account base code and account tax code on the '%s' tax!") % (tax_data.name))
# compute the amount in foreign currency
foreign_currency_diff = 0.0
amount_currency = False
if line.move_line_id:
voucher_currency = voucher_brw.currency_id and voucher_brw.currency_id.id or voucher_brw.journal_id.company_id.currency_id.id
# We want to set it on the account move line as soon as the original line had a foreign currency
if line.move_line_id.currency_id and line.move_line_id.currency_id.id != company_currency:
# we compute the amount in that foreign currency.
if line.move_line_id.currency_id.id == current_currency:
# if the voucher and the voucher line share the same currency, there is no computation to do
sign = (move_line['debit'] - move_line['credit']) < 0 and -1 or 1
amount_currency = sign * (line.amount)
elif line.move_line_id.currency_id.id == voucher_brw.payment_rate_currency_id.id:
# if the rate is specified on the voucher, we must use it
voucher_rate = currency_obj.browse(cr, uid, voucher_currency, context=ctx).rate
amount_currency = (move_line['debit'] - move_line['credit']) * voucher_brw.payment_rate * voucher_rate
else:
# otherwise we use the rates of the system (giving the voucher date in the context)
amount_currency = currency_obj.compute(cr, uid, company_currency, line.move_line_id.currency_id.id, move_line['debit']-move_line['credit'], context=ctx)
if line.amount == line.amount_unreconciled and line.move_line_id.currency_id.id == voucher_currency:
sign = voucher_brw.type in ('payment', 'purchase') and -1 or 1
foreign_currency_diff = sign * line.move_line_id.amount_residual_currency + amount_currency
move_line['amount_currency'] = amount_currency
voucher_line = move_line_obj.create(cr, uid, move_line)
rec_ids = [voucher_line, line.move_line_id.id]
if not currency_obj.is_zero(cr, uid, voucher_brw.company_id.currency_id, currency_rate_difference):
# Change difference entry in company currency
exch_lines = self._get_exchange_lines(cr, uid, line, move_id, currency_rate_difference, company_currency, current_currency, context=context)
new_id = move_line_obj.create(cr, uid, exch_lines[0],context)
move_line_obj.create(cr, uid, exch_lines[1], context)
rec_ids.append(new_id)
if line.move_line_id and line.move_line_id.currency_id and not currency_obj.is_zero(cr, uid, line.move_line_id.currency_id, foreign_currency_diff):
# Change difference entry in voucher currency
move_line_foreign_currency = {
'journal_id': line.voucher_id.journal_id.id,
'period_id': line.voucher_id.period_id.id,
'name': _('change')+': '+(line.name or '/'),
'account_id': line.account_id.id,
'move_id': move_id,
'partner_id': line.voucher_id.partner_id.id,
'currency_id': line.move_line_id.currency_id.id,
'amount_currency': -1 * foreign_currency_diff,
'quantity': 1,
'credit': 0.0,
'debit': 0.0,
'date': line.voucher_id.date,
}
new_id = move_line_obj.create(cr, uid, move_line_foreign_currency, context=context)
rec_ids.append(new_id)
if line.move_line_id.id:
rec_lst_ids.append(rec_ids)
if line.move_line_id.advance_id:
lst_adv_ids.append(line.move_line_id.advance_id.id)
return (tot_line, rec_lst_ids, lst_adv_ids)
4.- action_move_line_create (577)
def action_move_line_create(self, cr, uid, ids, context={}):
'''
Confirm the vouchers given in ids and create the journal entries for each of them
'''
if context is None:
context = {}
move_pool = self.pool.get('account.move')
move_line_pool = self.pool.get('account.move.line')
adv_obj = self.pool.get('account.advance')
for voucher in self.browse(cr, uid, ids, context=context):
if voucher.move_id:
continue
for vline in voucher.line_ids:
if vline.contract_tax_value > 0:
if vline.amount == vline.amount_unreconciled:
raise osv.except_osv(_('Error!'),_("Total Alocated value must no be equal to the remaining value when a contract tax exists!"))
company_currency = self._get_company_currency(cr, uid, voucher.id, context)
current_currency = self._get_current_currency(cr, uid, voucher.id, context)
# we select the context to use accordingly if it's a multicurrency case or not
context = self._sel_context(cr, uid, voucher.id, context)
# But for the operations made by _convert_amount, we always need to give the date in the context
ctx = context.copy()
ctx.update({'date': voucher.date})
# Create the account move record.
if voucher.type not in ('out_money_sale', 'in_money_sale'):
move_id = move_pool.create(cr, uid, self.account_move_get(cr, uid, voucher.id, context=context), context=context)
else:
move_id = voucher.money_sale_account_move_id.id
# Get the name of the account_move just created
name = move_pool.browse(cr, uid, move_id, context=context).name
# Create the first line of the voucher
move_line_id = move_line_pool.create(cr, uid, self.first_move_line_get(cr, uid, voucher.id, move_id, company_currency, current_currency, context), context)
move_line_brw = move_line_pool.browse(cr, uid, move_line_id, context=context)
line_total = move_line_brw.debit - move_line_brw.credit
rec_list_ids = []
# if voucher.line_cr_ids and voucher.line_dr_ids and
ml_contract = self.contract_move_line_get(cr, uid, voucher.id,line_total , move_id, name, company_currency, current_currency, context)
if ml_contract:
for m in ml_contract:
move_line_pool.create(cr, uid, m, context)
if voucher.type in ('sale', 'out_money_sale', 'debit_note'):
line_total = line_total - self._convert_amount(cr, uid, voucher.tax_amount, voucher.id, context=ctx)
elif voucher.type in ('purchase', 'in_money_sale', 'in_debit_note'):
line_total = line_total + self._convert_amount(cr, uid, voucher.tax_amount, voucher.id, context=ctx)
# Create one move line per voucher line where amount is not 0.0
ERROR LINE 577 ----- line_total, rec_list_ids, lst_adv_ids = self.voucher_move_line_create(cr, uid, voucher.id, line_total,None, move_id, company_currency, current_currency, context)
# Create the writeoff line if needed
if not ml_contract:
ml_writeoff = self.writeoff_move_line_get(cr, uid, voucher.id, line_total, move_id, name, company_currency, current_currency, context)
if ml_writeoff:
# rec_list_ids.append(ml_writeoff)
move_line_pool.create(cr, uid, ml_writeoff, context)
invoice = self._get_voucher_invoice(cr, uid, voucher, context)
if invoice and invoice.type in ( 'out_invoice','out_money_sale'):#,'out_refund'):
if voucher.amount:
self._process_seal_tax(cr, uid, voucher.id, voucher.amount, move_id,invoice, context)
# We post the voucher.
self.write(cr, uid, [voucher.id], {
'move_id': move_id,
'state': 'posted',
'number': name,
})
if voucher.journal_id.entry_posted:
move_pool.post(cr, uid, [move_id], context={})
# We automatically reconcile the account move lines.
reconcile = False
for rec_ids in rec_list_ids:
if len(rec_ids) >= 2:
reconcile = move_line_pool.reconcile_partial(cr, uid, rec_ids, writeoff_acc_id=voucher.writeoff_acc_id.id, writeoff_period_id=voucher.period_id.id, writeoff_journal_id=voucher.journal_id.id)
#Regularize Advances
if reconcile:
for adv in adv_obj.browse(cr, uid, lst_adv_ids):
if adv.residual_amount == 0.0:
adv_obj.write(cr, uid, adv.id, {'state': 'regularized'})
return True
Can you please help me solve this problem please?
Thank you very much