diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index c950b020e80..192fca044e6 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -170,77 +170,71 @@ class HrExpense(models.Model): ''' main function that is called when trying to create the accounting entries related to an expense ''' - journal_dict = {} for expense in self: - jrn = expense.sheet_id.bank_journal_id if expense.payment_mode == 'company_account' else expense.sheet_id.journal_id - journal_dict.setdefault(jrn, []) - journal_dict[jrn].append(expense) + journal = expense.sheet_id.bank_journal_id if expense.payment_mode == 'company_account' else expense.sheet_id.journal_id + #create the move that will contain the accounting entries + acc_date = expense.sheet_id.accounting_date or expense.date + move = self.env['account.move'].create({ + 'journal_id': journal.id, + 'company_id': self.env.user.company_id.id, + 'date': acc_date, + 'ref': expense.sheet_id.name, + # force the name to the default value, to avoid an eventual 'default_name' in the context + # to set it to '' which cause no number to be given to the account.move when posted. + 'name': '/', + }) + company_currency = expense.company_id.currency_id + diff_currency_p = expense.currency_id != company_currency + #one account.move.line per expense (+taxes..) + move_lines = expense._move_line_get() - for journal, expense_list in journal_dict.items(): - for expense in expense_list: - #create the move that will contain the accounting entries - acc_date = expense.sheet_id.accounting_date or expense.date - move = self.env['account.move'].create({ + #create one more move line, a counterline for the total on payable account + payment_id = False + total, total_currency, move_lines = expense._compute_expense_totals(company_currency, move_lines, acc_date) + if expense.payment_mode == 'company_account': + if not expense.sheet_id.bank_journal_id.default_credit_account_id: + raise UserError(_("No credit account found for the %s journal, please configure one.") % (expense.sheet_id.bank_journal_id.name)) + emp_account = expense.sheet_id.bank_journal_id.default_credit_account_id.id + journal = expense.sheet_id.bank_journal_id + #create payment + payment_methods = (total < 0) and journal.outbound_payment_method_ids or journal.inbound_payment_method_ids + journal_currency = journal.currency_id or journal.company_id.currency_id + payment = self.env['account.payment'].create({ + 'payment_method_id': payment_methods and payment_methods[0].id or False, + 'payment_type': total < 0 and 'outbound' or 'inbound', + 'partner_id': expense.employee_id.address_home_id.commercial_partner_id.id, + 'partner_type': 'supplier', 'journal_id': journal.id, - 'company_id': self.env.user.company_id.id, - 'date': acc_date, - 'ref': expense.sheet_id.name, - # force the name to the default value, to avoid an eventual 'default_name' in the context - # to set it to '' which cause no number to be given to the account.move when posted. - 'name': '/', + 'payment_date': expense.date, + 'state': 'reconciled', + 'currency_id': diff_currency_p and expense.currency_id.id or journal_currency.id, + 'amount': diff_currency_p and abs(total_currency) or abs(total), + 'name': expense.name, }) - company_currency = expense.company_id.currency_id - diff_currency_p = expense.currency_id != company_currency - #one account.move.line per expense (+taxes..) - move_lines = expense._move_line_get() + payment_id = payment.id + else: + if not expense.employee_id.address_home_id: + raise UserError(_("No Home Address found for the employee %s, please configure one.") % (expense.employee_id.name)) + emp_account = expense.employee_id.address_home_id.property_account_payable_id.id - #create one more move line, a counterline for the total on payable account - payment_id = False - total, total_currency, move_lines = expense._compute_expense_totals(company_currency, move_lines, acc_date) - if expense.payment_mode == 'company_account': - if not expense.sheet_id.bank_journal_id.default_credit_account_id: - raise UserError(_("No credit account found for the %s journal, please configure one.") % (expense.sheet_id.bank_journal_id.name)) - emp_account = expense.sheet_id.bank_journal_id.default_credit_account_id.id - journal = expense.sheet_id.bank_journal_id - #create payment - payment_methods = (total < 0) and journal.outbound_payment_method_ids or journal.inbound_payment_method_ids - journal_currency = journal.currency_id or journal.company_id.currency_id - payment = self.env['account.payment'].create({ - 'payment_method_id': payment_methods and payment_methods[0].id or False, - 'payment_type': total < 0 and 'outbound' or 'inbound', - 'partner_id': expense.employee_id.address_home_id.commercial_partner_id.id, - 'partner_type': 'supplier', - 'journal_id': journal.id, - 'payment_date': expense.date, - 'state': 'reconciled', - 'currency_id': diff_currency_p and expense.currency_id.id or journal_currency.id, - 'amount': diff_currency_p and abs(total_currency) or abs(total), - 'name': expense.name, + move_lines.append({ + 'type': 'dest', + 'name': expense.employee_id.name, + 'price': total, + 'account_id': emp_account, + 'date_maturity': acc_date, + 'amount_currency': diff_currency_p and total_currency or False, + 'currency_id': diff_currency_p and expense.currency_id.id or False, + 'payment_id': payment_id, }) - payment_id = payment.id - else: - if not expense.employee_id.address_home_id: - raise UserError(_("No Home Address found for the employee %s, please configure one.") % (expense.employee_id.name)) - emp_account = expense.employee_id.address_home_id.property_account_payable_id.id - move_lines.append({ - 'type': 'dest', - 'name': expense.employee_id.name, - 'price': total, - 'account_id': emp_account, - 'date_maturity': acc_date, - 'amount_currency': diff_currency_p and total_currency or False, - 'currency_id': diff_currency_p and expense.currency_id.id or False, - 'payment_id': payment_id, - }) - - #convert eml into an osv-valid format - lines = map(lambda x: (0, 0, expense._prepare_move_line(x)), move_lines) - move.write({'line_ids': lines}) - expense.sheet_id.write({'account_move_id': move.id}) - move.post() - if expense.payment_mode == 'company_account': - expense.sheet_id.paid_expense_sheets() + #convert eml into an osv-valid format + lines = map(lambda x: (0, 0, expense._prepare_move_line(x)), move_lines) + move.write({'line_ids': lines}) + expense.sheet_id.write({'account_move_id': move.id}) + move.post() + if expense.payment_mode == 'company_account': + expense.sheet_id.paid_expense_sheets() return True @api.multi @@ -523,3 +517,11 @@ class HrExpenseSheet(models.Model): res['domain'] = [('res_model', '=', 'hr.expense'), ('res_id', 'in', self.expense_line_ids.ids)] res['context'] = {'default_res_model': 'hr.expense.sheet', 'default_res_id': self.id} return res + + @api.multi + def action_open_journal_entries(self): + res = self.env['ir.actions.act_window'].for_xml_id('account', 'action_move_journal_line') + refs = [x.name for x in self] + res['domain'] = [('ref', 'in', refs)] + res['context'] = {} + return res diff --git a/addons/hr_expense/views/hr_expense_views.xml b/addons/hr_expense/views/hr_expense_views.xml index 619ce5b0368..63028e5eba9 100644 --- a/addons/hr_expense/views/hr_expense_views.xml +++ b/addons/hr_expense/views/hr_expense_views.xml @@ -423,6 +423,13 @@ type="object"> +