Add option to reconcile the reversal move with the original move (#387)

[IMP] account_reversal: Several improvements

* Default date for reverse move is not start_date of the period following the period of the original move (and not the period following today's period)
* Return form view of account.move if only 1 move is reversed
* Add option to reconcile with the reversal entry.
This commit is contained in:
Alexis de Lattre
2016-09-13 14:44:38 +02:00
committed by Pedro M. Baeza
parent 751d234612
commit bc45293273
3 changed files with 55 additions and 29 deletions

View File

@@ -50,7 +50,8 @@ class account_move(models.Model):
@api.multi
def _move_reversal(self, reversal_date,
reversal_period_id=False, reversal_journal_id=False,
move_prefix=False, move_line_prefix=False):
move_prefix=False, move_line_prefix=False,
reconcile=False):
"""
Create the reversal of a move
@@ -67,6 +68,7 @@ class account_move(models.Model):
"""
self.ensure_one()
period_obj = self.env['account.period']
amlo = self.env['account.move.line']
if reversal_period_id:
reversal_period = period_obj.browse([reversal_period_id])[0]
@@ -100,27 +102,44 @@ class account_move(models.Model):
'to_be_reversed': False,
})
for reversal_move_line in reversal_move.line_id:
reversal_ml_name = ' '.join(
rec_dict = {}
for rev_move_line in reversal_move.line_id:
rev_ml_name = ' '.join(
[x for x
in [move_line_prefix, reversal_move_line.name]
in [move_line_prefix, rev_move_line.name]
if x]
)
reversal_move_line.write(
{'debit': reversal_move_line.credit,
'credit': reversal_move_line.debit,
'amount_currency': reversal_move_line.amount_currency * -1,
'name': reversal_ml_name},
rev_move_line.write(
{'debit': rev_move_line.credit,
'credit': rev_move_line.debit,
'amount_currency': rev_move_line.amount_currency * -1,
'name': rev_ml_name},
check=True,
update_check=True)
if reconcile and rev_move_line.account_id.reconcile:
rec_dict.setdefault(
(rev_move_line.account_id, rev_move_line.partner_id),
amlo.browse(False))
rec_dict[(rev_move_line.account_id, rev_move_line.partner_id)]\
+= rev_move_line
reversal_move.validate()
if reconcile:
for mline in self.line_id:
if mline.account_id.reconcile:
rec_dict[(mline.account_id, mline.partner_id)] += mline
for to_rec_move_lines in rec_dict.itervalues():
to_rec_move_lines.reconcile()
return reversal_move.id
@api.multi
def create_reversals(self, reversal_date, reversal_period_id=False,
reversal_journal_id=False,
move_prefix=False, move_line_prefix=False):
move_prefix=False, move_line_prefix=False,
reconcile=False):
"""
Create the reversal of one or multiple moves
@@ -140,7 +159,8 @@ class account_move(models.Model):
reversal_period_id=reversal_period_id,
reversal_journal_id=reversal_journal_id,
move_prefix=move_prefix,
move_line_prefix=move_line_prefix
move_line_prefix=move_line_prefix,
reconcile=reconcile
)
for move in self
if not move.reversal_id

View File

@@ -37,7 +37,7 @@ class account_move_reversal(orm.TransientModel):
required=True,
help="Enter the date of the reversal account entries. "
"By default, OpenERP proposes the first day of "
"the next period."),
"the period following the period of the move to reverse."),
'period_id': fields.many2one(
'account.period',
'Reversal Period',
@@ -57,6 +57,7 @@ class account_move_reversal(orm.TransientModel):
help="Prefix that will be added to the name of the journal "
"item to be reversed to create the name of the reversal "
"journal item (a space is added after the prefix)."),
'reconcile': fields.boolean('Reconcile'),
}
def _next_period_first_date(self, cr, uid, context=None):
@@ -66,21 +67,21 @@ class account_move_reversal(orm.TransientModel):
period_ctx = context.copy()
period_ctx['account_period_prefer_normal'] = True
period_obj = self.pool.get('account.period')
today_period_id = period_obj.find(cr, uid, context=period_ctx)
if today_period_id:
today_period = period_obj.browse(
cr, uid, today_period_id[0], context=context)
next_period_id = period_obj.next(
cr, uid, today_period, 1, context=context)
if next_period_id:
next_period = period_obj.browse(
cr, uid, next_period_id, context=context)
res = next_period.date_start
assert context['active_model'] == 'account.move'
to_reverse_move = self.pool['account.move'].browse(
cr, uid, context['active_id'], context=context)
next_period_id = period_obj.next(
cr, uid, to_reverse_move.period_id, 1, context=context)
if next_period_id:
next_period = period_obj.browse(
cr, uid, next_period_id, context=context)
res = next_period.date_start
return res
_defaults = {
'date': _next_period_first_date,
'move_line_prefix': 'REV -',
'reconcile': True,
}
def action_reverse(self, cr, uid, ids, context=None):
@@ -90,13 +91,12 @@ class account_move_reversal(orm.TransientModel):
form = self.read(cr, uid, ids, context=context)[0]
mod_obj = self.pool.get('ir.model.data')
act_obj = self.pool.get('ir.actions.act_window')
move_obj = self.pool.get('account.move')
move_ids = context['active_ids']
period_id = form['period_id'][0] if form.get('period_id') else False
journal_id = form['journal_id'][0] if form.get('journal_id') else False
reconcile = form['reconcile'] if form.get('reconcile') else False
reversed_move_ids = move_obj.create_reversals(
cr, uid,
move_ids,
@@ -105,12 +105,18 @@ class account_move_reversal(orm.TransientModel):
reversal_journal_id=journal_id,
move_prefix=form['move_prefix'],
move_line_prefix=form['move_line_prefix'],
reconcile=reconcile,
context=context)
__, action_id = mod_obj.get_object_reference(
action = self.pool['ir.actions.act_window'].for_xml_id(
cr, uid, 'account', 'action_move_journal_line')
action = act_obj.read(cr, uid, [action_id], context=context)[0]
action['domain'] = unicode([('id', 'in', reversed_move_ids)])
action['name'] = _('Reversal Entries')
action['context'] = unicode({'search_default_to_be_reversed': 0})
if len(reversed_move_ids) == 1:
action['res_id'] = reversed_move_ids[0]
action['view_mode'] = 'form,tree'
action['views'] = False
action['view_id'] = False
else:
action['domain'] = unicode([('id', 'in', reversed_move_ids)])
return action

View File

@@ -6,7 +6,7 @@
<field name="name">account.move.reverse.form</field>
<field name="model">account.move.reverse</field>
<field name="arch" type="xml">
<form string="Create reversal journal entries" version="7.0">
<form string="Create reversal journal entries">
<label string="This will create reversal for all selected entries whether checked 'to be reversed' or not."/>
<group>
<field name="date"/>
@@ -15,6 +15,7 @@
<newline/>
<field name="move_prefix" />
<field name="move_line_prefix" />
<field name="reconcile"/>
</group>
<footer>
@@ -30,7 +31,6 @@
<record id="act_account_move_reverse" model="ir.actions.act_window">
<field name="name">Reverse Entries</field>
<field name="res_model">account.move.reverse</field>
<field name="view_type">form</field>
<field name="view_mode">form</field>
<field name="view_id" ref="view_account_move_reverse"/>
<field name="target">new</field>