Add support for using bank account as offsetting account in journal entry

This commit is contained in:
Alexis de Lattre
2016-05-11 22:48:48 +02:00
committed by Enric Tobella
parent ad162ffacd
commit ed265873ce
4 changed files with 80 additions and 36 deletions

View File

@@ -47,8 +47,12 @@ class AccountPaymentMode(models.Model):
"* Payment Date\n"
"(other modules can set additional fields to restrict the "
"grouping.)")
transfer_move = fields.Boolean(
generate_move = fields.Boolean(
'Generate Accounting Entries On File Upload')
offsetting_account = fields.Selection([
('bank_account', 'Bank Account'),
('transfer_account', 'Transfer Account'),
], string='Offsetting Account')
transfer_account_id = fields.Many2one(
'account.account', string='Transfer Account',
domain=[('internal_type', '=', 'other'), ('reconcile', '=', True)],
@@ -59,26 +63,39 @@ class AccountPaymentMode(models.Model):
'account.journal', string='Transfer Journal',
help='Journal to write payment entries when confirming '
'payment/debit orders of this mode')
transfer_move_option = fields.Selection([
move_option = fields.Selection([
('date', 'One move per payment date'),
('line', 'One move per payment line'),
], string='Transfer Move Option', default='date')
], string='Move Option')
@api.multi
@api.constrains(
'transfer_move', 'transfer_account_id', 'transfer_journal_id',
'transfer_move_option')
'generate_move', 'offsetting_account',
'transfer_account_id', 'transfer_journal_id', 'move_option')
def transfer_move_constrains(self):
for mode in self:
if mode.transfer_move and (
not mode.transfer_account_id or
not mode.transfer_journal_id or
not mode.transfer_move_option):
raise ValidationError(_(
"The option 'Generate Accounting Entries On File Upload' "
"is active on payment mode '%s', so the three parameters "
"'Transfer Account', 'Transfer Journal' and "
"'Transfer Move Option' must be set.") % mode.name)
if mode.generate_move:
if not mode.offsetting_account:
raise ValidationError(_(
"On the payment mode '%s', you must select an "
"option for the 'Offsetting Account' parameter")
% mode.name)
elif mode.offsetting_account == 'transfer_account':
if not mode.transfer_account_id:
raise ValidationError(_(
"On the payment mode '%s', you must "
"select a value for the 'Transfer Account'.")
% mode.name)
if not mode.transfer_journal_id:
raise ValidationError(_(
"On the payment mode '%s', you must "
"select a value for the 'Transfer Journal'.")
% mode.name)
if not mode.move_option:
raise ValidationError(_(
"On the payment mode '%s', you must "
"choose an option for the 'Move Option' "
"parameter.") % mode.name)
@api.onchange('payment_method_id')
def payment_method_id_change(self):
@@ -92,3 +109,21 @@ class AccountPaymentMode(models.Model):
aj_ids = ajo.search([
('type', 'in', ('sale_refund', 'sale'))]).ids
self.default_journal_ids = [(6, 0, aj_ids)]
@api.onchange('generate_move')
def generate_move_change(self):
if self.generate_move:
# default values
self.offsetting_account = 'bank_account'
self.move_option = 'date'
else:
self.offsetting_account = False
self.transfer_account_id = False
self.transfer_journal_id = False
self.move_option = False
@api.onchange('offsetting_account')
def offsetting_account_change(self):
if self.offsetting_account == 'bank_account':
self.transfer_account_id = False
self.transfer_journal_id = False

View File

@@ -83,7 +83,7 @@ class AccountPaymentOrder(models.Model):
compute='_bank_line_count', string='Number of Bank Lines',
readonly=True)
move_ids = fields.One2many(
'account.move', 'payment_order_id', string='Transfer Journal Entries',
'account.move', 'payment_order_id', string='Journal Entries',
readonly=True)
@api.multi
@@ -292,23 +292,26 @@ class AccountPaymentOrder(models.Model):
@api.multi
def generated2uploaded(self):
for order in self:
if order.payment_mode_id.transfer_move:
order.generate_transfer_move()
if order.payment_mode_id.generate_move:
order.generate_move()
self.write({
'state': 'uploaded',
'date_uploaded': fields.Date.context_today(self),
})
return True
# Generation of transfer move
@api.multi
def _prepare_transfer_move(self):
def _prepare_move(self):
if self.payment_type == 'outbound':
ref = _('Payment order %s') % self.name
else:
ref = _('Debit order %s') % self.name
if self.payment_mode_id.offsetting_account == 'bank_account':
journal_id = self.journal_id.id
elif self.payment_mode_id.offsetting_account == 'transfer_account':
journal_id = self.payment_mode_id.transfer_journal_id.id
vals = {
'journal_id': self.payment_mode_id.transfer_journal_id.id,
'journal_id': journal_id,
'ref': ref,
'payment_order_id': self.id,
'line_ids': [],
@@ -316,17 +319,21 @@ class AccountPaymentOrder(models.Model):
return vals
@api.multi
def _prepare_move_line_transfer_account(
def _prepare_move_line_offsetting_account(
self, amount, bank_payment_lines):
if self.payment_type == 'outbound':
name = _('Payment order %s') % self.name
else:
name = _('Debit order %s') % self.name
date_maturity = bank_payment_lines[0].date
if self.payment_mode_id.offsetting_account == 'bank_account':
account_id = self.journal_id.default_debit_account_id.id
elif self.payment_mode_id.offsetting_account == 'transfer_account':
account_id = self.payment_mode_id.transfer_account_id.id
vals = {
'name': name,
'partner_id': False,
'account_id': self.payment_mode_id.transfer_account_id.id,
'account_id': account_id,
'credit': (self.payment_type == 'outbound' and
amount or 0.0),
'debit': (self.payment_type == 'inbound' and
@@ -366,7 +373,7 @@ class AccountPaymentOrder(models.Model):
return vals
@api.multi
def generate_transfer_move(self):
def generate_move(self):
"""
Create the moves that pay off the move lines from
the payment/debit order.
@@ -374,12 +381,12 @@ class AccountPaymentOrder(models.Model):
self.ensure_one()
am_obj = self.env['account.move']
# prepare a dict "trfmoves" that can be used when
# self.payment_mode_id.transfer_move_option = date or line
# self.payment_mode_id.move_option = date or line
# key = unique identifier (date or True or line.id)
# value = bank_pay_lines (recordset that can have several entries)
trfmoves = {}
for bline in self.bank_line_ids:
hashcode = bline.move_line_transfer_account_hashcode()
hashcode = bline.move_line_offsetting_account_hashcode()
if hashcode in trfmoves:
trfmoves[hashcode] += bline
else:
@@ -387,13 +394,13 @@ class AccountPaymentOrder(models.Model):
company_currency = self.env.user.company_id.currency_id
for hashcode, blines in trfmoves.iteritems():
mvals = self._prepare_transfer_move()
mvals = self._prepare_move()
total_amount = 0
for bline in blines:
total_amount += bline.amount_currency
if bline.currency_id != company_currency:
raise UserError(_(
"Cannot generate the transfer move when "
"Cannot generate the account move when "
"the currency of the payment (%s) is not the "
"same as the currency of the company (%s). This "
"is not supported for the moment.")
@@ -402,7 +409,7 @@ class AccountPaymentOrder(models.Model):
partner_ml_vals = self._prepare_move_line_partner_account(
bline)
mvals['line_ids'].append((0, 0, partner_ml_vals))
trf_ml_vals = self._prepare_move_line_transfer_account(
trf_ml_vals = self._prepare_move_line_offsetting_account(
total_amount, blines)
mvals['line_ids'].append((0, 0, trf_ml_vals))
move = am_obj.create(mvals)

View File

@@ -80,13 +80,13 @@ class BankPaymentLine(models.Model):
return super(BankPaymentLine, self).create(vals)
@api.multi
def move_line_transfer_account_hashcode(self):
def move_line_offsetting_account_hashcode(self):
"""
This method is inherited in the module
account_banking_sepa_direct_debit
"""
self.ensure_one()
if self.order_id.payment_mode_id.transfer_move_option == 'date':
if self.order_id.payment_mode_id.move_option == 'date':
hashcode = self.date
else:
hashcode = unicode(self.id)

View File

@@ -20,15 +20,17 @@
<field name="default_invoice"/>
<field name="default_date_type"/>
</group>
<group name="trf-move-config" string="Accounting Entries Options">
<field name="transfer_move"/>
<group name="accounting-config" string="Accounting Entries Options">
<field name="generate_move"/>
<field name="offsetting_account" widget="radio"
attrs="{'required': [('generate_move', '=', True)], 'invisible': [('generate_move', '=', False)]}"/>
<field name="transfer_account_id"
attrs="{'invisible': [('transfer_move', '=', False)], 'required': [('transfer_move', '=', True)]}"
attrs="{'invisible': [('offsetting_account', '!=', 'transfer_account')], 'required': [('offsetting_account', '=', 'transfer_account')]}"
context="{'default_reconcile': True, 'default_company_id': company_id}"/> <!-- We can't put a default vue to user_type_id... -->
<field name="transfer_journal_id"
attrs="{'invisible': [('transfer_move', '=', False)], 'required': [('transfer_move', '=', True)]}"/>
<field name="transfer_move_option"
attrs="{'invisible': [('transfer_move', '=', False)], 'required': [('transfer_move', '=', True)]}"/>
attrs="{'invisible': [('offsetting_account', '!=', 'transfer_account')], 'required': [('offsetting_account', '=', 'transfer_account')]}"/>
<field name="move_option"
attrs="{'invisible': [('generate_move', '=', False)], 'required': [('generate_move', '=', True)]}"/>
</group>
</group>
</field>