Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[16.0][IMP] account_cutoff_base: auto reverse #270

Merged
merged 1 commit into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion account_cutoff_base/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"license": "AGPL-3",
"summary": "Base module for Account Cut-offs",
"author": "Akretion,Odoo Community Association (OCA)",
"maintainers": ["alexis-via"],
"maintainers": ["alexis-via", "jbaudoux"],
"website": "https://github.com/OCA/account-closing",
"depends": ["account"],
"data": [
Expand Down
26 changes: 26 additions & 0 deletions account_cutoff_base/i18n/fr.po
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,20 @@ msgstr "Êtes-vous sûr de vouloir retourner à l'état de brouillon ?"
msgid "Attachment Count"
msgstr "Nombre de pièces jointes"

#. module: account_cutoff_base
#: model:ir.model.fields,field_description:account_cutoff_base.field_account_cutoff__auto_reverse
msgid "Auto Reverse"
msgstr "Extourne automatique"

#. module: account_cutoff_base
#: model:ir.model.fields,help:account_cutoff_base.field_account_cutoff__auto_reverse
msgid ""
"Automatically reverse created move on following day. Use this if you accrue "
"a value end of period that you want to reverse begin of next period"
msgstr ""
"Extourner automatiquement le mouvement sur le jour suivant. Utilisez ceci si vous provisionnez "
"un montant à la fin d'une période et que vous voulez l'extourner au début de la période suivante"

#. module: account_cutoff_base
#: model_terms:ir.ui.view,arch_db:account_cutoff_base.account_cutoff_form
msgid "Back to Draft"
Expand Down Expand Up @@ -293,6 +307,11 @@ msgstr "Date de la provision"
msgid "Cut-off Journal Entry"
msgstr "Pièce comptable de la provision"

#. module: account_cutoff_base
#: model:ir.model.fields,field_description:account_cutoff_base.field_account_cutoff__move_reversal_id
msgid "Cut-off Journal Entry Reversal"
msgstr "Pièce comptable de l'extourne"

#. module: account_cutoff_base
#: model:ir.model.fields,field_description:account_cutoff_base.field_account_cutoff__line_ids
msgid "Cut-off Lines"
Expand Down Expand Up @@ -823,6 +842,13 @@ msgstr ""
"Il n'est pas possible de supprimer les provisions qui sont à l'état "
"'Terminé'."

#. module: account_cutoff_base
#. odoo-python
#: code:addons/account_cutoff_base/models/account_cutoff.py:0
#, python-format
msgid "reversal of: "
msgstr "extourne de: "

#~ msgid "SMS Delivery error"
#~ msgstr "Erreur d'envoi du SMS"

Expand Down
39 changes: 38 additions & 1 deletion account_cutoff_base/models/account_cutoff.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Copyright 2013-2021 Akretion (http://www.akretion.com/)
# Copyright 2013 Akretion (http://www.akretion.com/)
# Copyright 2018 Jacques-Etienne Baudoux (BCIM) <[email protected]>
# @author: Alexis de Lattre <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

Expand Down Expand Up @@ -109,6 +110,24 @@ def _default_cutoff_account_id(self):
copy=False,
check_company=True,
)
auto_reverse = fields.Boolean(
help="Automatically reverse created move on following day. Use this "
"if you accrue a value end of period that you want to reverse "
"begin of next period",
)
move_reversal_id = fields.Many2one(
"account.move",
string="Cut-off Journal Entry Reversal",
compute="_compute_move_reversal_id",
)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry to be late to the party, but could we make this a computed field based on env["account.move"].search[("reversed_entry_id", "=", self.move_id)].

Copy link
Member

@sbidoul sbidoul Jul 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or self.move_id.reversal_move_id and self.move_id.reversal_move_id[0]

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds better indeed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated to use a compute. Can you re-review? Thanks

@api.depends("move_id.reversal_move_id", "move_id.reversal_move_id.state")
def _compute_move_reversal_id(self):
for rec in self:
rec.move_reversal_id = rec.move_id.reversal_move_id.filtered(
lambda m: m.state != "cancel"
)[:1]

move_ref = fields.Char(
string="Reference of the Cut-off Journal Entry",
states={"done": [("readonly", True)]},
Expand Down Expand Up @@ -191,6 +210,10 @@ def name_get(self):

def back2draft(self):
self.ensure_one()
if self.move_reversal_id:
self.move_reversal_id.line_ids.remove_move_reconcile()
self.move_reversal_id.unlink()
self.move_id.line_ids.remove_move_reconcile()
if self.move_id:
self.move_id.unlink()
self.write({"state": "draft"})
Expand Down Expand Up @@ -325,6 +348,20 @@ def create_move(self):
move = move_obj.create(vals)
if self.company_id.post_cutoff_move:
move._post(soft=False)

if self.auto_reverse:
next_day = fields.Date.from_string(self.cutoff_date) + relativedelta(days=1)
rev_move = move._reverse_moves(
[
{
"date": next_day,
"ref": _("reversal of: ") + move.ref,
}
]
)
if self.company_id.post_cutoff_move:
rev_move._post(soft=False)

self.write({"move_id": move.id, "state": "done"})
self.message_post(body=_("Journal entry generated"))

Expand Down
1 change: 1 addition & 0 deletions account_cutoff_base/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@
* Jim Hoefnagels <[email protected]>
* `Trobz <https://trobz.com>`_:
* Dzung Tran <[email protected]>
* Jacques-Etienne Baudoux (BCIM) <[email protected]>
108 changes: 108 additions & 0 deletions account_cutoff_base/tests/test_account_cutoff.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,33 @@
# Copyright 2018 Jacques-Etienne Baudoux (BCIM) <[email protected]>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from odoo import Command, fields
from odoo.tests.common import TransactionCase


class TestAccountCutoff(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
cls.company = cls.env.ref("base.main_company")
cls.cutoff_journal = cls.env["account.journal"].create(
{
"code": "cop0",
"company_id": cls.company.id,
"name": "Cutoff Journal Base",
"type": "general",
}
)
cls.cutoff_account = cls.env["account.account"].create(
{
"name": "Cutoff Base Account",
"code": "ACB480000",
"company_id": cls.company.id,
"account_type": "liability_current",
}
)

def test_default_cutoff_account_id(self):
account_id = self.env["account.cutoff"]._default_cutoff_account_id()
self.assertEqual(account_id, False)
Expand Down Expand Up @@ -36,3 +60,87 @@ def test_default_cutoff_account_id(self):
random_account.id,
"The account must be equals to %s" % random_account.id,
)

def test_create_move(self):
type_cutoff = "accrued_revenue"
cutoff = (
self.env["account.cutoff"]
.with_context(default_cutoff_type=type_cutoff)
.create(
{
"cutoff_type": type_cutoff,
"company_id": 1,
"cutoff_date": fields.Date.today(),
"cutoff_account_id": self.cutoff_account.id,
"cutoff_journal_id": self.cutoff_journal.id,
}
)
)
account = self.env["account.account"].create(
{
"name": "Base account",
"code": "ACB220000",
"company_id": self.company.id,
"account_type": "liability_current",
}
)
cutoff.line_ids = [
Command.create(
{
"parent_id": cutoff.id,
"account_id": account.id,
"cutoff_account_id": self.cutoff_account.id,
"cutoff_amount": 50,
},
)
]
self.company.post_cutoff_move = False
cutoff.auto_reverse = False
cutoff.create_move()
self.assertEqual(
cutoff.move_id.state,
"draft",
"A draft move is expected",
)
self.assertFalse(
cutoff.move_reversal_id,
"No reversal move is expected",
)
cutoff.back2draft()
self.assertFalse(
cutoff.move_id,
"No move is expected",
)
cutoff.auto_reverse = True
cutoff.create_move()
self.assertEqual(
cutoff.move_id.state,
"draft",
"A draft move is expected",
)
self.assertEqual(
cutoff.move_reversal_id.state,
"draft",
"A draft reversal move is expected",
)
cutoff.back2draft()
self.assertFalse(
cutoff.move_id,
"No move is expected",
)
self.assertFalse(
cutoff.move_reversal_id,
"No reversal move is expected",
)
self.company.post_cutoff_move = True
cutoff.create_move()
self.assertEqual(
cutoff.move_id.state,
"posted",
"A posted move is expected",
)
self.assertEqual(
cutoff.move_id.state,
"posted",
"A posted reversal move is expected",
)
2 changes: 2 additions & 0 deletions account_cutoff_base/views/account_cutoff.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
options="{'datepicker': {'warn_future': true}}"
/>
<field name="total_cutoff_amount" />
<field name="auto_reverse" />
<field name="source_move_state" widget="radio" />
<field name="company_id" options="{'no_create': True}" />
<field name="company_currency_id" invisible="1" />
Expand All @@ -85,6 +86,7 @@
<field name="move_ref" />
<field name="move_partner" />
<field name="move_id" />
<field name="move_reversal_id" />
</group>
</group>
<group name="lines">
Expand Down
Loading