forked from OCA/account-financial-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ADD] account_fiscal_year_auto_create : new module to create automati…
…cally new fiscal years
- Loading branch information
1 parent
6c54ae1
commit b8e210a
Showing
11 changed files
with
224 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
================================= | ||
Fiscal Years - Automatic Creation | ||
================================= | ||
|
||
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
!! This file is generated by oca-gen-addon-readme !! | ||
!! changes will be overwritten. !! | ||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from . import models |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# Copyright (C) 2021 - Today: GRAP (http://www.grap.coop) | ||
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). | ||
|
||
{ | ||
"name": "Fiscal Years - Automatic Creation", | ||
"summary": "Automatically create new fiscal years, based on the datas" | ||
" of the last fiscal years", | ||
"version": "12.0.1.0.1", | ||
"category": "Accounting", | ||
"author": "GRAP,Odoo Community Association (OCA)", | ||
"maintainers": ["legalsylvain"], | ||
"website": "http://www.github.com/OCA/account-financial-tools", | ||
"license": "AGPL-3", | ||
"depends": [ | ||
"account", | ||
], | ||
"data": [ | ||
"data/ir_cron.xml", | ||
], | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<?xml version="1.0" encoding="UTF-8"?> | ||
<!-- | ||
Copyright (C) 2021 - Today: GRAP (http://www.grap.coop) | ||
@author: Sylvain LE GAL (https://twitter.com/legalsylvain) | ||
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). | ||
--> | ||
|
||
<odoo noupdate="1"> | ||
<record id="cron_fiscal_year_auto_create" model="ir.cron"> | ||
<field name="name">Auto Create Fiscal Years</field> | ||
<field name="active" eval="True"/> | ||
<field name="model_id" ref="account.model_account_fiscal_year"/> | ||
<field name="state">code</field> | ||
<field name="code">model.cron_auto_create()</field> | ||
<field name="interval_number">1</field> | ||
<field name="interval_type">days</field> | ||
<field name="nextcall" eval="(DateTime.today()).strftime('%Y-%m-%d')"/> | ||
<field name="numbercall">-1</field> | ||
<field name="user_id" ref="base.user_root"/> | ||
</record> | ||
</odoo> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
# Translation of Odoo Server. | ||
# This file contains the translation of the following modules: | ||
# * account_fiscal_year_auto_create | ||
# | ||
msgid "" | ||
msgstr "" | ||
"Project-Id-Version: Odoo Server 12.0\n" | ||
"Report-Msgid-Bugs-To: \n" | ||
"POT-Creation-Date: 2021-03-31 08:41+0000\n" | ||
"PO-Revision-Date: 2021-03-31 08:41+0000\n" | ||
"Last-Translator: <>\n" | ||
"Language-Team: \n" | ||
"MIME-Version: 1.0\n" | ||
"Content-Type: text/plain; charset=UTF-8\n" | ||
"Content-Transfer-Encoding: \n" | ||
"Plural-Forms: \n" | ||
|
||
#. module: account_fiscal_year_auto_create | ||
#: model:ir.actions.server,name:account_fiscal_year_auto_create.cron_fiscal_year_auto_create_ir_actions_server | ||
#: model:ir.cron,cron_name:account_fiscal_year_auto_create.cron_fiscal_year_auto_create | ||
#: model:ir.cron,name:account_fiscal_year_auto_create.cron_fiscal_year_auto_create | ||
msgid "Auto Create Fiscal Years" | ||
msgstr "Création automatique d'année fiscales" | ||
|
||
#. module: account_fiscal_year_auto_create | ||
#: code:addons/account_fiscal_year_auto_create/models/account_fiscal_year.py:45 | ||
#, python-format | ||
msgid "FY %s - %s" | ||
msgstr "AF %s - %s" | ||
|
||
#. module: account_fiscal_year_auto_create | ||
#: model:ir.model,name:account_fiscal_year_auto_create.model_account_fiscal_year | ||
msgid "Fiscal Year" | ||
msgstr "Exercice fiscal" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from . import account_fiscal_year |
56 changes: 56 additions & 0 deletions
56
account_fiscal_year_auto_create/models/account_fiscal_year.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# Copyright (C) 2021 - Today: GRAP (http://www.grap.coop) | ||
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). | ||
|
||
from datetime import datetime | ||
from dateutil.relativedelta import relativedelta | ||
|
||
from odoo import _, api, models | ||
|
||
|
||
class AccountFiscalYear(models.Model): | ||
_inherit = "account.fiscal.year" | ||
|
||
@api.model | ||
def cron_auto_create(self): | ||
companies = self.env["res.company"].search([]) | ||
for company in companies: | ||
last_fiscal_year = self.search( | ||
[('company_id', '=', company.id)], | ||
order="date_to desc", limit=1) | ||
|
||
if last_fiscal_year and ( | ||
last_fiscal_year.date_to < | ||
datetime.now().date() + relativedelta(days=1) | ||
): | ||
self.create(last_fiscal_year._prepare_next_fiscal_year()) | ||
|
||
@api.multi | ||
def _prepare_next_fiscal_year(self): | ||
self.ensure_one() | ||
# try to generate a new name, based on the previous | ||
# name replacing YYYY pattern by YYYY+1 value | ||
# - "FY 2018" will be replace by "FY 2019" | ||
# - "FY 2018-2019" will be replace by "FY 2019-2020" | ||
new_name = self.name.replace( | ||
str((self.date_to.year)), str((self.date_to.year + 1)) | ||
).replace( | ||
str((self.date_from.year)), str((self.date_from.year + 1)) | ||
) | ||
if self.search([ | ||
("name", "=", new_name), | ||
("company_id", "=", self.company_id.id) | ||
]): | ||
# the replace process fail to guess a correct unique name | ||
new_name = _("FY %s - %s") % ( | ||
str(self.date_to), str(self.date_from) | ||
) | ||
# compute new dates, handling leap years | ||
new_date_from = self.date_to + relativedelta(days=1) | ||
new_date_to = new_date_from + relativedelta(years=1, days=-1) | ||
return { | ||
"name": new_name, | ||
"company_id": self.company_id.id, | ||
"date_from": new_date_from.strftime("%Y-%m-%d"), | ||
"date_to": new_date_to.strftime("%Y-%m-%d"), | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
* Sylvain LE GAL <https://twitter.com/legalsylvain> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
This module extends the functionality of Accounting Odoo module, to | ||
auto generate fiscal years. | ||
|
||
Once installed, a cron is running each day. It will create, for each company, | ||
a new fiscal year, if it is the last day of the current fiscal year. | ||
|
||
This module is interesting specially in multi company context, to avoid annoying setup every year. | ||
|
||
The fiscal year created has a classical "12 monthes" duration, but the accountant | ||
can modify it, once created. | ||
|
||
Exemple | ||
~~~~~~~ | ||
|
||
If a company has it last fiscal year, defined as: | ||
|
||
- ``name``: FY 2021-2022 | ||
- ``date_from``: 2021-06-01 | ||
- ``date_to``: 2022-05-31 | ||
|
||
When the cron will be executed on May 31, 2022, it will create the following fiscal year: | ||
|
||
- ``name``: FY 2022-2023 | ||
- ``date_from``: 2022-06-01 | ||
- ``date_to``: 2023-05-31 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
from . import test_module |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
# Copyright (C) 2021 - Today: GRAP (http://www.grap.coop) | ||
# @author: Sylvain LE GAL (https://twitter.com/legalsylvain) | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). | ||
|
||
from odoo.tests.common import TransactionCase | ||
|
||
from datetime import date, datetime | ||
|
||
|
||
class TestModule(TransactionCase): | ||
|
||
def setUp(self): | ||
super().setUp() | ||
self.AccountFiscalYear = self.env["account.fiscal.year"] | ||
self.company = self.env["res.company"].create({ | ||
"name": "Demo Company (account_fiscal_year_auto_create)", | ||
}) | ||
|
||
# create a fiscal year | ||
self.last_year = datetime.now().year - 1 | ||
self.last_fiscal_year = self.AccountFiscalYear.create({ | ||
"name": "FY %d" % (self.last_year), | ||
"date_from": date(self.last_year, 1, 1).strftime("%Y-%m-%d"), | ||
"date_to": date(self.last_year, 12, 31).strftime("%Y-%m-%d"), | ||
"company_id": self.company.id, | ||
}) | ||
|
||
def test_cron(self): | ||
existing_fiscal_years = self.AccountFiscalYear.search([]) | ||
self.AccountFiscalYear.cron_auto_create() | ||
|
||
# Run cron should create a new fiscal year | ||
new_fiscal_year = self.AccountFiscalYear.search([ | ||
("id", "not in", existing_fiscal_years.ids) | ||
]) | ||
self.assertTrue(new_fiscal_year) | ||
self.assertEqual( | ||
new_fiscal_year.name, "FY %d" % (self.last_year + 1)) | ||
self.assertEqual( | ||
new_fiscal_year.date_from, date(self.last_year + 1, 1, 1)) | ||
self.assertEqual( | ||
new_fiscal_year.date_from, date(self.last_year + 1, 1, 1)) | ||
self.assertEqual( | ||
new_fiscal_year.name, "FY %d" % (self.last_year + 1)) | ||
|
||
# Rerun cron should not create a new fiscal year | ||
existing_fiscal_years = self.AccountFiscalYear.search([]) | ||
self.AccountFiscalYear.cron_auto_create() | ||
|
||
# Run cron should create a new fiscal year | ||
new_fiscal_year = self.AccountFiscalYear.search([ | ||
("id", "not in", existing_fiscal_years.ids) | ||
]) | ||
self.assertFalse(new_fiscal_year) |