Initial commit: Odoo 18.0-20251222 extra-addons
Some checks failed
pre-commit / pre-commit (push) Has been cancelled
tests / Detect unreleased dependencies (push) Has been cancelled
tests / test with OCB (push) Has been cancelled
tests / test with Odoo (push) Has been cancelled

This commit is contained in:
tocmo0nlord
2026-03-13 20:43:25 +00:00
parent 36e847a7df
commit adbe430761
9472 changed files with 1265727 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association
=================================
Fiscal Years - Automatic Creation
=================================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:11bf52fcc426add73a3bc0b91c59979b82672b24ca3b8b86fdd39c0f378587fd
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github
:target: https://github.com/OCA/account-financial-tools/tree/18.0/account_fiscal_year_auto_create
:alt: OCA/account-financial-tools
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/account-financial-tools-18-0/account-financial-tools-18-0-account_fiscal_year_auto_create
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/account-financial-tools&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
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.
Example
-------
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
**Table of contents**
.. contents::
:local:
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/account-financial-tools/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_fiscal_year_auto_create%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
-------
* GRAP
Contributors
------------
- Sylvain LE GAL
<`https://twitter.com/legalsylvain\\> <https://twitter.com/legalsylvain\>>`__
Maintainers
-----------
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px
:target: https://github.com/legalsylvain
:alt: legalsylvain
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-legalsylvain|
This module is part of the `OCA/account-financial-tools <https://github.com/OCA/account-financial-tools/tree/18.0/account_fiscal_year_auto_create>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1 @@
from . import models

View File

@@ -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": "18.0.1.0.0",
"category": "Accounting",
"author": "GRAP,Odoo Community Association (OCA)",
"maintainers": ["legalsylvain"],
"website": "https://github.com/OCA/account-financial-tools",
"license": "AGPL-3",
"depends": [
"account_fiscal_year",
],
"data": [
"data/ir_cron.xml",
],
}

View File

@@ -0,0 +1,19 @@
<?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_fiscal_year.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="user_id" ref="base.user_root" />
</record>
</odoo>

View File

@@ -0,0 +1,30 @@
# 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 18.0\n"
"Report-Msgid-Bugs-To: \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
msgid "Auto Create Fiscal Years"
msgstr ""
#. module: account_fiscal_year_auto_create
#. odoo-python
#: code:addons/account_fiscal_year_auto_create/models/account_fiscal_year.py:0
msgid "FY %(date_to)s - %(date_from)s"
msgstr ""
#. module: account_fiscal_year_auto_create
#: model:ir.model,name:account_fiscal_year_auto_create.model_account_fiscal_year
msgid "Fiscal Year"
msgstr ""

View File

@@ -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 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-04-17 17:33+0000\n"
"Last-Translator: gelo joga Rodríguez <gelo.joga@factorlibre.com>\n"
"Language-Team: none\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.14.1\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
msgid "Auto Create Fiscal Years"
msgstr "Creación automática de años fiscales"
#. module: account_fiscal_year_auto_create
#. odoo-python
#: code:addons/account_fiscal_year_auto_create/models/account_fiscal_year.py:0
#, python-format
msgid "FY %(date_to)s - %(date_from)s"
msgstr "FY %(date_to)s - %(date_from)s"
#. module: account_fiscal_year_auto_create
#: model:ir.model,name:account_fiscal_year_auto_create.model_account_fiscal_year
msgid "Fiscal Year"
msgstr "Año Fiscal"

View File

@@ -0,0 +1,39 @@
# 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"
"PO-Revision-Date: 2023-05-10 13:02+0000\n"
"Last-Translator: Sandrine (ACSONE) <sandrine.ravet@acsone.eu>\n"
"Language-Team: none\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.14.1\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
msgid "Auto Create Fiscal Years"
msgstr "Créer Automatiquement Les Exercices Fiscaux"
#. module: account_fiscal_year_auto_create
#. odoo-python
#: code:addons/account_fiscal_year_auto_create/models/account_fiscal_year.py:0
#, python-format
msgid "FY %(date_to)s - %(date_from)s"
msgstr "FY %(date_to)s - %(date_from)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"
#, python-format
#~ msgid "FY %s - %s"
#~ msgstr "AF %s - %s"

View File

@@ -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 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-05-10 13:02+0000\n"
"Last-Translator: Sandrine (ACSONE) <sandrine.ravet@acsone.eu>\n"
"Language-Team: none\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.14.1\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
msgid "Auto Create Fiscal Years"
msgstr "Création automatique d'années fiscales"
#. module: account_fiscal_year_auto_create
#. odoo-python
#: code:addons/account_fiscal_year_auto_create/models/account_fiscal_year.py:0
#, python-format
msgid "FY %(date_to)s - %(date_from)s"
msgstr "FY %(date_to)s - %(date_from)s"
#. module: account_fiscal_year_auto_create
#: model:ir.model,name:account_fiscal_year_auto_create.model_account_fiscal_year
msgid "Fiscal Year"
msgstr "Année fiscale"

View File

@@ -0,0 +1,36 @@
# 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 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-02-16 10:09+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>\n"
"Language-Team: none\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.14.1\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
msgid "Auto Create Fiscal Years"
msgstr "Automatski kreiraj nove fiskalne godine"
#. module: account_fiscal_year_auto_create
#. odoo-python
#: code:addons/account_fiscal_year_auto_create/models/account_fiscal_year.py:0
#, python-format
msgid "FY %(date_to)s - %(date_from)s"
msgstr "FG %(date_to)s - %(date_from)s"
#. module: account_fiscal_year_auto_create
#: model:ir.model,name:account_fiscal_year_auto_create.model_account_fiscal_year
msgid "Fiscal Year"
msgstr "Fiskalna godina"

View File

@@ -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 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-02-26 16:36+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\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
msgid "Auto Create Fiscal Years"
msgstr "Crea automaticamente anno fiscale"
#. module: account_fiscal_year_auto_create
#. odoo-python
#: code:addons/account_fiscal_year_auto_create/models/account_fiscal_year.py:0
#, python-format
msgid "FY %(date_to)s - %(date_from)s"
msgstr "AF %(date_to)s - %(date_from)s"
#. module: account_fiscal_year_auto_create
#: model:ir.model,name:account_fiscal_year_auto_create.model_account_fiscal_year
msgid "Fiscal Year"
msgstr "Anno fiscale"

View File

@@ -0,0 +1 @@
from . import account_fiscal_year

View File

@@ -0,0 +1,53 @@
# 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())
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 %(date_to)s - %(date_from)s",
date_to=str(self.date_to),
date_from=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"),
}

View File

@@ -0,0 +1,3 @@
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"

View File

@@ -0,0 +1 @@
- Sylvain LE GAL \<https://twitter.com/legalsylvain\>

View File

@@ -0,0 +1,27 @@
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.
## Example
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

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,451 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document">
<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="fiscal-years-automatic-creation">
<h1>Fiscal Years - Automatic Creation</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:11bf52fcc426add73a3bc0b91c59979b82672b24ca3b8b86fdd39c0f378587fd
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/account-financial-tools/tree/18.0/account_fiscal_year_auto_create"><img alt="OCA/account-financial-tools" src="https://img.shields.io/badge/github-OCA%2Faccount--financial--tools-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/account-financial-tools-18-0/account-financial-tools-18-0-account_fiscal_year_auto_create"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/account-financial-tools&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module extends the functionality of Accounting Odoo module, to auto
generate fiscal years.</p>
<p>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.</p>
<p>This module is interesting specially in multi company context, to avoid
annoying setup every year.</p>
<p>The fiscal year created has a classical “12 monthes” duration, but the
accountant can modify it, once created.</p>
<div class="section" id="example">
<h2>Example</h2>
<p>If a company has it last fiscal year, defined as:</p>
<ul class="simple">
<li><tt class="docutils literal">name</tt>: FY 2021-2022</li>
<li><tt class="docutils literal">date_from</tt>: 2021-06-01</li>
<li><tt class="docutils literal">date_to</tt>: 2022-05-31</li>
</ul>
<p>When the cron will be executed on May 31, 2022, it will create the
following fiscal year:</p>
<ul class="simple">
<li><tt class="docutils literal">name</tt>: FY 2022-2023</li>
<li><tt class="docutils literal">date_from</tt>: 2022-06-01</li>
<li><tt class="docutils literal">date_to</tt>: 2023-05-31</li>
</ul>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a></li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h3><a class="toc-backref" href="#toc-entry-1">Bug Tracker</a></h3>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/account-financial-tools/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/account-financial-tools/issues/new?body=module:%20account_fiscal_year_auto_create%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h3><a class="toc-backref" href="#toc-entry-2">Credits</a></h3>
</div>
</div>
<div class="section" id="authors">
<h2>Authors</h2>
<ul class="simple">
<li>GRAP</li>
</ul>
</div>
<div class="section" id="contributors">
<h2>Contributors</h2>
<ul class="simple">
<li>Sylvain LE GAL
&lt;<a class="reference external" href="https://twitter.com/legalsylvain&gt;">https://twitter.com/legalsylvain\&gt;</a></li>
</ul>
</div>
<div class="section" id="maintainers">
<h2>Maintainers</h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/legalsylvain"><img alt="legalsylvain" src="https://github.com/legalsylvain.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/account-financial-tools/tree/18.0/account_fiscal_year_auto_create">OCA/account-financial-tools</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View File

@@ -0,0 +1 @@
from . import test_module

View File

@@ -0,0 +1,49 @@
# 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 date, datetime
from odoo.addons.base.tests.common import BaseCommon
class TestFiscalYear(BaseCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.AccountFiscalYear = cls.env["account.fiscal.year"]
cls.company = cls.env["res.company"].create(
{
"name": "Demo Company (account_fiscal_year_auto_create)",
}
)
cls.last_year = datetime.now().year - 1
cls.last_fiscal_year = cls.AccountFiscalYear.create(
{
"name": f"FY {cls.last_year}",
"date_from": date(cls.last_year, 1, 1),
"date_to": date(cls.last_year, 12, 31),
"company_id": cls.company.id,
}
)
def test_cron_auto_create(self):
"""It should create new fiscal year via cron and not duplicate"""
# Step 1: Run cron -> should create one new fiscal year
old_fiscal_year_ids = self.AccountFiscalYear.search([]).ids
self.AccountFiscalYear.cron_auto_create()
new_fy = self.AccountFiscalYear.search([("id", "not in", old_fiscal_year_ids)])
self.assertEqual(len(new_fy), 1, "A new fiscal year should be created.")
expected_year = self.last_year + 1
self.assertEqual(new_fy.name, f"FY {expected_year}")
self.assertEqual(new_fy.date_from, date(expected_year, 1, 1))
self.assertEqual(new_fy.date_to, date(expected_year, 12, 31))
# Step 2: Run cron again -> should NOT create duplicate fiscal year
new_ids = self.AccountFiscalYear.search([]).ids
self.AccountFiscalYear.cron_auto_create()
newer_fy = self.AccountFiscalYear.search([("id", "not in", new_ids)])
self.assertFalse(newer_fy, "No new fiscal year should be created again.")