From 34d3754ae0f09e078190170ab84da202096ccfee Mon Sep 17 00:00:00 2001 From: qdp-odoo Date: Mon, 24 Oct 2016 16:12:18 +0200 Subject: [PATCH] [REF] hr_expense: refactoring of expense sheet entry posting + display of a stat button to open journal entries instead of the m2o. Since commit dabf82870a4812a5bada56430fa7e584d6a74d42, the expense sheet now creates one account.move per expense, so there is no point in grouping per journal. Moreover, the account_move_id m2o is not relevant anymore for expense sheet having more than one line. That's why it is now replaced by a button --- addons/hr_expense/models/hr_expense.py | 130 ++++++++++--------- addons/hr_expense/views/hr_expense_views.xml | 9 +- 2 files changed, 74 insertions(+), 65 deletions(-) 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"> +