[REF] hr_expense: refactoring of expense sheet entry posting + display of a stat button to open journal entries instead of the m2o.
Since commit dabf82870a, 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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -423,6 +423,13 @@
|
||||
type="object">
|
||||
<field name="attachment_number" widget="statinfo" string="Documents"/>
|
||||
</button>
|
||||
<button name="action_open_journal_entries"
|
||||
class="oe_stat_button"
|
||||
icon="fa-book"
|
||||
string="Accounting Entries"
|
||||
attrs="{'invisible': [('account_move_id', '=', False)]}"
|
||||
type="object">
|
||||
</button>
|
||||
</div>
|
||||
<div class="oe_title">
|
||||
<label for="name" class="oe_edit_only"/>
|
||||
@@ -445,7 +452,7 @@
|
||||
<field name="journal_id" domain="[('type', '=', 'purchase')]" groups="account.group_account_user" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('payment_mode', '!=', 'own_account')]}"/>
|
||||
<field name="bank_journal_id" groups="account.group_account_user" options="{'no_open': True, 'no_create': True}" attrs="{'invisible': [('payment_mode', '!=', 'company_account')]}" domain="[('type', 'in', ['cash', 'bank'])]"/>
|
||||
<field name="accounting_date" groups="account.group_account_user" attrs="{'invisible': [('state', 'not in', ['approve', 'post', 'done'])]}"/>
|
||||
<field name="account_move_id" attrs="{'invisible': [('state', 'not in', ['post', 'done'])]}" groups="account.group_account_user" readonly="1"/>
|
||||
<field name="account_move_id" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<field name="expense_line_ids" nolabel="1" widget="many2many" domain="[('state', '=', 'draft')]" options="{'no_delete': True}">
|
||||
|
||||
Reference in New Issue
Block a user