mirror of
https://github.com/OCA/bank-payment.git
synced 2025-02-02 10:37:31 +02:00
Add support for using bank account as offsetting account in journal entry
This commit is contained in:
committed by
Enric Tobella
parent
ad162ffacd
commit
ed265873ce
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user