Initial commit: Odoo 18.0-20251222 extra-addons
This commit is contained in:
3
account_journal_general_sequence/models/__init__.py
Executable file
3
account_journal_general_sequence/models/__init__.py
Executable file
@@ -0,0 +1,3 @@
|
||||
from . import account_journal
|
||||
from . import account_move
|
||||
from . import account_move_line
|
||||
52
account_journal_general_sequence/models/account_journal.py
Executable file
52
account_journal_general_sequence/models/account_journal.py
Executable file
@@ -0,0 +1,52 @@
|
||||
# Copyright 2022 Moduon
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class AccountJournal(models.Model):
|
||||
_inherit = "account.journal"
|
||||
|
||||
entry_number_sequence_id = fields.Many2one(
|
||||
comodel_name="ir.sequence",
|
||||
string="Account entry number sequence",
|
||||
compute="_compute_entry_number_sequence",
|
||||
domain="[('company_id', '=', company_id)]",
|
||||
check_company=True,
|
||||
readonly=False,
|
||||
store=True,
|
||||
copy=False,
|
||||
help="Sequence used for account entry numbering.",
|
||||
)
|
||||
entry_number_sequence_id_name = fields.Char(related="entry_number_sequence_id.code")
|
||||
|
||||
@api.depends("company_id")
|
||||
def _compute_entry_number_sequence(self):
|
||||
"""Get the default sequence for all journals."""
|
||||
for one in self:
|
||||
sequence = self.env["ir.sequence"].search(
|
||||
[
|
||||
("code", "=", "account_journal_general_sequence.default"),
|
||||
("company_id", "=", one.company_id.id),
|
||||
]
|
||||
)
|
||||
if not sequence:
|
||||
_logger.info("Creating default sequence for account move numbers")
|
||||
sequence = self.env["ir.sequence"].create(
|
||||
{
|
||||
"name": self.env._(
|
||||
"Account entry default numbering (%s)",
|
||||
one.company_id.name,
|
||||
),
|
||||
"code": "account_journal_general_sequence.default",
|
||||
"company_id": one.company_id.id,
|
||||
"implementation": "no_gap",
|
||||
"prefix": "%(range_year)s/",
|
||||
"padding": 8,
|
||||
"use_date_range": True,
|
||||
}
|
||||
)
|
||||
one.entry_number_sequence_id = sequence
|
||||
75
account_journal_general_sequence/models/account_move.py
Executable file
75
account_journal_general_sequence/models/account_move.py
Executable file
@@ -0,0 +1,75 @@
|
||||
# Copyright 2022 Moduon
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
import logging
|
||||
|
||||
from odoo import api, fields, models
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
ADDON = "account_journal_general_sequence"
|
||||
|
||||
|
||||
class AccountMove(models.Model):
|
||||
_inherit = "account.move"
|
||||
|
||||
_sql_constraints = [
|
||||
(
|
||||
"entry_number_unique",
|
||||
"UNIQUE(entry_number, journal_id)",
|
||||
"Entry number must be unique per journal.",
|
||||
),
|
||||
]
|
||||
|
||||
entry_number = fields.Char(
|
||||
index=True,
|
||||
readonly=True,
|
||||
store=True,
|
||||
compute="_compute_entry_number",
|
||||
help="Automatic numbering, based on journal configuration.",
|
||||
)
|
||||
|
||||
@api.depends("state")
|
||||
def _compute_entry_number(self):
|
||||
"""Assign an entry number when posting."""
|
||||
# Skip if installing module, for performance reasons
|
||||
if self.env.context.get("module") == ADDON:
|
||||
module = self.env["ir.module.module"].search([("name", "=", ADDON)])
|
||||
if module.state == "to install":
|
||||
_logger.info(
|
||||
"Skipping entry number generation at install for %s.",
|
||||
self,
|
||||
)
|
||||
return
|
||||
canceled = self.filtered_domain(
|
||||
[("state", "=", "cancel"), ("entry_number", "!=", False)]
|
||||
)
|
||||
canceled.entry_number = False
|
||||
if canceled:
|
||||
no_gap_seqs = canceled.mapped(
|
||||
"journal_id.entry_number_sequence_id"
|
||||
).filtered_domain([("implementation", "=", "no_gap")])
|
||||
if no_gap_seqs:
|
||||
_logger.warning(
|
||||
"Emptied entry_number for %r after cancellation. "
|
||||
"This created gaps on %r.",
|
||||
canceled,
|
||||
no_gap_seqs,
|
||||
)
|
||||
chosen = self.filtered_domain(
|
||||
[("state", "=", "posted"), ("entry_number", "=", False)]
|
||||
)
|
||||
# Cache all the new numbers to avoid wasting recomputations, caused by
|
||||
# searches done by _next() in the loop below
|
||||
chosen_map = {}
|
||||
for move in chosen.sorted(
|
||||
lambda one: (one.date or "", one.name or "", one.id or 0)
|
||||
):
|
||||
chosen_map[move.id] = move.journal_id.entry_number_sequence_id._next(
|
||||
move.date
|
||||
)
|
||||
# Write all the new numbers in the chosen moves
|
||||
for move_id, new_number in chosen_map.items():
|
||||
self.browse(move_id).entry_number = new_number
|
||||
if chosen:
|
||||
_logger.info("Added entry_number to %d account moves", len(chosen))
|
||||
_logger.debug("Added entry_number to %r", chosen)
|
||||
10
account_journal_general_sequence/models/account_move_line.py
Executable file
10
account_journal_general_sequence/models/account_move_line.py
Executable file
@@ -0,0 +1,10 @@
|
||||
# Copyright 2022 Moduon
|
||||
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class AccountMoveLine(models.Model):
|
||||
_inherit = "account.move.line"
|
||||
|
||||
entry_number = fields.Char(related="move_id.entry_number")
|
||||
Reference in New Issue
Block a user