mirror of
https://github.com/OCA/account-financial-tools.git
synced 2025-02-02 12:47:26 +02:00
[ADD] account_journal_general_sequence: account move entry sequence
Under some legislations, account moves must follow a single sequence. Since Odoo removed this sequence number in recent versions, this information was lost. With this module, you can force your account moves to follow a separate sequence. The sequence is automatic when a move is posted. Includes a wizard to reorder those numbers in the sequence. @moduon MT-676
This commit is contained in:
1
account_journal_general_sequence/wizards/__init__.py
Normal file
1
account_journal_general_sequence/wizards/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import account_move_renumber_wizard
|
||||
@@ -0,0 +1,82 @@
|
||||
# Copyright 2022 Moduon
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
|
||||
from datetime import date
|
||||
|
||||
from odoo import _, api, exceptions, fields, models
|
||||
|
||||
|
||||
class AccountMoveRenumberWizard(models.TransientModel):
|
||||
_name = "account.move.renumber.wizard"
|
||||
_description = "Account move entry renumbering wizard"
|
||||
|
||||
starting_date = fields.Date(
|
||||
required=True,
|
||||
default=lambda self: self._default_starting_date(),
|
||||
help="Renumber account moves starting this day.",
|
||||
)
|
||||
starting_number = fields.Integer(
|
||||
default=1, help="Reset sequence to this number before starting."
|
||||
)
|
||||
available_sequence_ids = fields.Many2many(
|
||||
comodel_name="ir.sequence",
|
||||
string="Available sequences",
|
||||
default=lambda self: self._default_available_sequence_ids(),
|
||||
)
|
||||
sequence_id = fields.Many2one(
|
||||
comodel_name="ir.sequence",
|
||||
string="Sequence",
|
||||
required=True,
|
||||
default=lambda self: self._default_entry_number_sequence(),
|
||||
domain="[('id', 'in', available_sequence_ids)]",
|
||||
help="Sequence to use for renumbering. Affects all journals that use this sequence.",
|
||||
)
|
||||
|
||||
@api.model
|
||||
def _default_starting_date(self):
|
||||
"""Start by default on day 1 of current year."""
|
||||
return date(date.today().year, 1, 1)
|
||||
|
||||
@api.model
|
||||
def _default_entry_number_sequence(self):
|
||||
"""Get default sequence if it exists."""
|
||||
return self.env["ir.sequence"].search(
|
||||
[("code", "=", "account_journal_general_sequence.default")]
|
||||
)
|
||||
|
||||
@api.model
|
||||
def _default_available_sequence_ids(self):
|
||||
"""Let view display only journal-related sequences."""
|
||||
return self.env["account.journal"].search([]).mapped("entry_number_sequence_id")
|
||||
|
||||
def action_renumber(self):
|
||||
"""Renumber moves.
|
||||
|
||||
Makes sure moves exist. Sorts them. Resets sequences. Renumbers them.
|
||||
"""
|
||||
# Find posted moves that match wizard criteria
|
||||
moves = self.env["account.move"].search(
|
||||
[
|
||||
("state", "=", "posted"),
|
||||
("date", ">=", self.starting_date),
|
||||
("journal_id.entry_number_sequence_id", "=", self.sequence_id.id),
|
||||
],
|
||||
order="date, id",
|
||||
)
|
||||
if not moves:
|
||||
raise exceptions.UserError(_("No account moves found."))
|
||||
# Reset sequence
|
||||
future_ranges = self.env["ir.sequence.date_range"].search(
|
||||
[
|
||||
("date_from", ">", self.starting_date),
|
||||
("sequence_id", "=", self.sequence_id.id),
|
||||
]
|
||||
)
|
||||
future_ranges.unlink()
|
||||
current_range = self.sequence_id._get_current_sequence(self.starting_date)
|
||||
current_range.number_next_actual = self.starting_number
|
||||
self.sequence_id.number_next_actual = self.starting_number
|
||||
# Renumber the moves
|
||||
moves.entry_number = False
|
||||
moves.flush(["entry_number"])
|
||||
moves._compute_entry_number()
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!-- Copyright 2022 Moduon
|
||||
License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -->
|
||||
<data>
|
||||
|
||||
<record id="account_move_renumber_wizard_view_form" model="ir.ui.view">
|
||||
<field name="name">Renumber form</field>
|
||||
<field name="model">account.move.renumber.wizard</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Renumber account entry numbers">
|
||||
<sheet>
|
||||
<group colspan="4">
|
||||
<field name="starting_date" />
|
||||
<field name="starting_number" />
|
||||
<field name="available_sequence_ids" invisible="1" />
|
||||
<field name="sequence_id" />
|
||||
</group>
|
||||
</sheet>
|
||||
<footer>
|
||||
<button
|
||||
name="action_renumber"
|
||||
type="object"
|
||||
string="Renumber"
|
||||
class="btn-primary"
|
||||
confirm="If you have already filed and legalized your journals with the competent authority, this action could change it. Continue?"
|
||||
/>
|
||||
<button special="cancel" string="Cancel" class="btn-secondary" />
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="account_move_renumber_wizard_action" model="ir.actions.act_window">
|
||||
<field name="name">Renumber journal entries</field>
|
||||
<field name="res_model">account.move.renumber.wizard</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<menuitem
|
||||
id="account_move_renumber_wizard_menu"
|
||||
parent="account.menu_finance_entries_actions"
|
||||
action="account_move_renumber_wizard_action"
|
||||
/>
|
||||
|
||||
</data>
|
||||
Reference in New Issue
Block a user