Files
account-financial-tools/account_renumber/wizard/wizard_renumber.py
2016-08-19 13:59:32 +02:00

109 lines
3.8 KiB
Python

# -*- coding: utf-8 -*-
# © 2009 Pexego Sistemas Informáticos. All Rights Reserved
# © 2016 Jairo Llopis <jairo.llopis@tecnativa.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import logging
from datetime import date
from openerp import _, api, exceptions, fields, models
_logger = logging.getLogger(__name__)
class WizardRenumber(models.TransientModel):
_name = "wizard.renumber"
_description = "Account renumber wizard"
date_from = fields.Date(
string="Starting date",
required=True,
default=lambda self: self._default_date_from(),
help="Start renumbering in this date, inclusive.",
)
date_to = fields.Date(
string="Finish date",
required=True,
default=lambda self: self._default_date_to(),
help="Finish renumbering in this date, inclusive.",
)
journal_ids = fields.Many2many(
comodel_name='account.journal',
relation='account_journal_wzd_renumber_rel',
column1='wizard_id',
column2='journal_id',
string="Journals",
required=True,
help="Journals to renumber",
)
number_next = fields.Integer(
string='First Number',
default=1,
required=True,
help="Journal sequences will start counting on this number",
)
@api.model
def _default_date_from(self):
"""Day 1 of current year by default."""
return date(self._default_date_to().year, 1, 1)
@api.model
def _default_date_to(self):
"""Today by default."""
return fields.Date.from_string(fields.Date.context_today(self))
@api.multi
def renumber(self):
"""Renumber all the posted moves on the given journal and periods.
:return dict:
Window action to open the renumbered moves, to review them.
"""
reset_sequences = self.env["ir.sequence"]
reset_ranges = self.env["ir.sequence.date_range"]
_logger.debug("Searching for account moves to renumber.")
move_ids = self.env['account.move'].search(
[('journal_id', 'in', self.journal_ids.ids),
('date', '>=', self.date_from),
('date', '<=', self.date_to),
('state', '=', 'posted')],
order='date, id')
if not move_ids:
raise exceptions.MissingError(
_('No records found for your selection!'))
_logger.debug("Renumbering %d account moves.", len(move_ids))
for move in move_ids:
sequence = move.journal_id.sequence_id
if sequence not in reset_sequences:
if sequence.use_date_range:
date_range = self.env["ir.sequence.date_range"].search(
[("sequence_id", "=", sequence.id),
("date_from", "<=", move.date),
("date_to", ">=", move.date)]
)
if date_range and date_range not in reset_ranges:
date_range.number_next = self.number_next
reset_ranges |= date_range
else:
sequence.number_next = self.number_next
reset_sequences |= sequence
# Generate (using our own get_id) and write the new move number
move.name = (sequence.with_context(ir_sequence_date=move.date)
.next_by_id())
_logger.debug("%d account moves renumbered.", len(move_ids))
return {
'type': 'ir.actions.act_window',
'name': _("Renumbered account moves"),
'res_model': 'account.move',
'domain': [("id", "in", move_ids.ids)],
'view_type': 'form',
'view_mode': 'tree',
'context': self.env.context,
'target': 'current',
}