diff --git a/l10n_fr_tax_return/__init__.py b/l10n_fr_tax_return/__init__.py new file mode 100644 index 0000000..6f037ac --- /dev/null +++ b/l10n_fr_tax_return/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# from . import controllers +from . import models +from . import wizards + +# from .hooks import pre_init_hook, post_init_hook, uninstall_hook diff --git a/l10n_fr_tax_return/__manifest__.py b/l10n_fr_tax_return/__manifest__.py new file mode 100644 index 0000000..63ee719 --- /dev/null +++ b/l10n_fr_tax_return/__manifest__.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). +{ + "name": "French tax return (2035)", + "version": "1.0.0", + "summary": "Computes lines for 2035 BNC declaration", + "description": """ + Module description + """, + "author": "RemiFr82", + "contributors": "", + "maintainer": "RemiFr82", + "website": "https://remifr82.me", + "license": "LGPL-3", + "category": "", + # "price": 0, + # "currency": "EUR", + "application": False, + "installable": True, + "auto_install": False, + # "pre_init_hook": "", + # "post_init_hook": "", + # "uninstall_hook": "", + # "excludes": [], + # "external_dependencies": [], + "depends": [ + "account", + "l10n_fr", + ], + "data": [ + # Base data + "data/account_tax_return.xml", + # Security + # 'security/res_groups.xml', + "security/ir.model.access.csv", + # 'security/ir_rule.xml', + # Views + "views/account_account.xml", + "views/account_tax_return.xml", + "views/account_tax_return_year.xml", + # Wizards + "wizards/tax_return_wizard.xml", + # Reports + # 'reports/report_templates.xml', + # 'reports/sql_view.xml', + ], + "assets": { + # "reports/report_assets.xml" + }, + "css": [], + "images": [], + "js": [], + "test": [], + "demo": [], +} diff --git a/l10n_fr_tax_return/data/account_tax_return.xml b/l10n_fr_tax_return/data/account_tax_return.xml new file mode 100644 index 0000000..a3096a4 --- /dev/null +++ b/l10n_fr_tax_return/data/account_tax_return.xml @@ -0,0 +1,342 @@ + + + + + + + + + Ligne AG + + credit + + + + Ligne AF + + + credit + + + + Ligne AD + + + credit + + + + Ligne AE + + + credit + + + + Ligne AC + + + credit + + + + Ligne AB + + + credit + + + + Ligne AA + + + credit + + + + + + Ligne BR + + + + + Ligne BP + + + + + + Ligne BN + + + + + + Ligne BM + + + + + + Ligne BK + + + + + + Ligne BT + + + + + + Ligne BU + + + + + + Ligne BZ + + + + + + Ligne BJ + + + + + + Ligne BH + + + + + + Ligne BG + + + + + + Ligne BF + + + + + + Ligne BV + + + + + + Ligne BS + + + + + + Ligne JY + + + + + + Ligne BD + + + + + + Ligne BC + + + + + + Ligne BB + + + + + + Ligne BA + + + + + + + + Ligne 1 + + credit + + + + Ligne 2 + + credit + + + + Ligne 3 + + credit + + + + + + Ligne 5 + + credit + + + + Ligne 6 + + credit + + + + + + Ligne 8 + + + + + Ligne 9 + + + + + Ligne 10 + + + + + Ligne 11 + + + + + Ligne 12 + + + + + Ligne 13 + + + + + Ligne 14 + + + + + Ligne 15 + + + + + Ligne 16 + + + + + Ligne 17 + + + + + Ligne 18 + + + + + Ligne 19 + + + + + Ligne 20 + + + + + Ligne 21 + + + + + Ligne 22 + + + + + Ligne 23 + + + + + Ligne 24 + + + + + + + Ligne 26 + + + + + Ligne 27 + + + + + Ligne 28 + + + + + Ligne 29 + + + + + Ligne 30 + + + + + Ligne 31 + + + + + Ligne 32 + + + + + + + diff --git a/l10n_fr_tax_return/i18n/fr.po b/l10n_fr_tax_return/i18n/fr.po new file mode 100644 index 0000000..db1ae08 --- /dev/null +++ b/l10n_fr_tax_return/i18n/fr.po @@ -0,0 +1,212 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * l10n_fr_tax_return +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e-20230613\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-09-21 11:13+0000\n" +"PO-Revision-Date: 2024-09-21 11:13+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: l10n_fr_tax_return +#: model:ir.model,name:l10n_fr_tax_return.model_account_account +msgid "Account" +msgstr "Compte" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__account_ids +msgid "Accounts to sum" +msgstr "Comptes à sommer" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__add_line_id +msgid "Added to line" +msgstr "Ajoutée à la ligne" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__amount +msgid "Amount" +msgstr "" + +#. module: l10n_fr_tax_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_tax_return.tax_return_wizard_view_form +msgid "Cancel" +msgstr "Annuler" + +#. module: l10n_fr_tax_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_tax_return.tax_return_wizard_view_form +msgid "Compute year tax return lines" +msgstr "Calculer les lignes pour l'année" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__create_uid +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__create_uid +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__create_date +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__create_date +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: l10n_fr_tax_return +#. odoo-python +#: code:addons/l10n_fr_tax_return/models/account_tax_return.py:0 +#: model:ir.model.fields.selection,name:l10n_fr_tax_return.selection__account_tax_return__line_type__credit +#: model:ir.model.fields.selection,name:l10n_fr_tax_return.selection__account_tax_return_year__line_type__credit +#, python-format +msgid "Credit" +msgstr "Crédit" + +#. module: l10n_fr_tax_return +#. odoo-python +#: code:addons/l10n_fr_tax_return/models/account_tax_return.py:0 +#: model:ir.model.fields.selection,name:l10n_fr_tax_return.selection__account_tax_return__line_type__debit +#: model:ir.model.fields.selection,name:l10n_fr_tax_return.selection__account_tax_return_year__line_type__debit +#, python-format +msgid "Debit" +msgstr "Débit" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__display_name +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__display_name +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard__display_name +msgid "Display Name" +msgstr "Nom à afficher" + +#. module: l10n_fr_tax_return +#: model_terms:ir.ui.view,arch_db:l10n_fr_tax_return.account_tax_return_year_view_search +msgid "Group By" +msgstr "Regrouper par" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__id +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__id +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard__id +msgid "ID" +msgstr "" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return____last_update +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year____last_update +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__write_uid +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__write_uid +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__write_date +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__write_date +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__line_id +msgid "Line" +msgstr "Ligne" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__line_type +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__line_type +msgid "Line Type" +msgstr "Type de ligne" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__sum_line_ids +msgid "Lines to add" +msgstr "Lignes à ajouter" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__ded_line_ids +msgid "Lines to substract" +msgstr "Lignes à soustraire" + +#. module: l10n_fr_tax_return +#. odoo-python +#: code:addons/l10n_fr_tax_return/wizards/tax_return_wizard.py:0 +#, python-format +msgid "" +"Please set a year in the past and after you started your odoo accounting." +msgstr "" +"Merci de renseigner une année postérieure au début de la comptabilité Odoo." + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__name +msgid "Reference" +msgstr "Référence" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__sub_line_id +msgid "Substracted from line" +msgstr "Déduite de la ligne" + +#. module: l10n_fr_tax_return +#: model:ir.ui.menu,name:l10n_fr_tax_return.tax_return_wizard_menu +msgid "Tax return compute" +msgstr "Calcul des lignes" + +#. module: l10n_fr_tax_return +#: model:ir.model,name:l10n_fr_tax_return.model_account_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_account__tax_return_id +msgid "Tax return line" +msgstr "Lignes de déclaration" + +#. module: l10n_fr_tax_return +#: model:ir.model,name:l10n_fr_tax_return.model_account_tax_return_year +msgid "Tax return line year" +msgstr "Valeurs des lignes" + +#. module: l10n_fr_tax_return +#: model:ir.ui.menu,name:l10n_fr_tax_return.account_tax_return_menu +msgid "Tax return lines" +msgstr "Lignes de déclaration" + +#. module: l10n_fr_tax_return +#: model:ir.model,name:l10n_fr_tax_return.model_tax_return_wizard +msgid "Tax return wizard" +msgstr "Calcul des lignes de déclaration" + +#. module: l10n_fr_tax_return +#: model:ir.actions.act_window,name:l10n_fr_tax_return.account_tax_return_action +#: model:ir.actions.act_window,name:l10n_fr_tax_return.account_tax_return_year_action +msgid "Tax returns" +msgstr "Lignes de déclaration" + +#. module: l10n_fr_tax_return +#: model:ir.actions.act_window,name:l10n_fr_tax_return.tax_return_wizard_action +msgid "Tax returns compute" +msgstr "" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return__is_sum_line +msgid "This line is a sum of other lines" +msgstr "Cette ligne est une somme d'autres lignes" + +#. module: l10n_fr_tax_return +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_account_tax_return_year__name +#: model:ir.model.fields,field_description:l10n_fr_tax_return.field_tax_return_wizard__name +#: model_terms:ir.ui.view,arch_db:l10n_fr_tax_return.account_tax_return_year_view_search +msgid "Year" +msgstr "Année" + +#. module: l10n_fr_tax_return +#: model:ir.ui.menu,name:l10n_fr_tax_return.account_tax_return_year_menu +msgid "Year tax return lines" +msgstr "Lignes par année" diff --git a/l10n_fr_tax_return/models/__init__.py b/l10n_fr_tax_return/models/__init__.py new file mode 100644 index 0000000..b424cc2 --- /dev/null +++ b/l10n_fr_tax_return/models/__init__.py @@ -0,0 +1,3 @@ +from . import account_account +from . import account_tax_return +from . import account_tax_return_year diff --git a/l10n_fr_tax_return/models/account_account.py b/l10n_fr_tax_return/models/account_account.py new file mode 100644 index 0000000..ddeb616 --- /dev/null +++ b/l10n_fr_tax_return/models/account_account.py @@ -0,0 +1,10 @@ +from odoo import models, fields + + +class AccountAccount(models.Model): + _inherit = "account.account" + + tax_return_id = fields.Many2one( + comodel_name="account.tax.return", + string="Tax return line", + ) diff --git a/l10n_fr_tax_return/models/account_tax_return.py b/l10n_fr_tax_return/models/account_tax_return.py new file mode 100644 index 0000000..55bc127 --- /dev/null +++ b/l10n_fr_tax_return/models/account_tax_return.py @@ -0,0 +1,52 @@ +from odoo import models, fields, _ + + +class AccountTaxReturn(models.Model): + _name = "account.tax.return" + _description = "Tax return line" + _order = "line_type, name, id" + + name = fields.Char(string="Reference") + account_ids = fields.One2many( + comodel_name="account.account", + inverse_name="tax_return_id", + string="Accounts to sum", + ) + line_type = fields.Selection( + selection=[ + ("credit", _("Credit")), + ("debit", _("Debit")), + ], + required=True, + default="debit", + ) + # Sum between lines + add_line_id = fields.Many2one( + comodel_name="account.tax.return", + string="Added to line", + ) + sub_line_id = fields.Many2one( + comodel_name="account.tax.return", + string="Substracted from line", + ) + is_sum_line = fields.Boolean(string="This line is a sum of other lines") + sum_line_ids = fields.One2many( + comodel_name="account.tax.return", + inverse_name="add_line_id", + string="Lines to add", + ) + ded_line_ids = fields.One2many( + comodel_name="account.tax.return", + inverse_name="sub_line_id", + string="Lines to substract", + ) + + def compute_value(self, move_lines=[]): + self.ensure_one() + if not self.is_sum_line: + if self.line_type == "credit": + return sum(move_lines.mapped(lambda aml: aml.credit - aml.debit)) + else: + return sum(move_lines.mapped(lambda aml: aml.debit - aml.credit)) + else: + return 0.0 diff --git a/l10n_fr_tax_return/models/account_tax_return_year.py b/l10n_fr_tax_return/models/account_tax_return_year.py new file mode 100644 index 0000000..1f0b726 --- /dev/null +++ b/l10n_fr_tax_return/models/account_tax_return_year.py @@ -0,0 +1,22 @@ +from odoo import models, fields + + +class AccountTaxReturnYear(models.Model): + _name = "account.tax.return.year" + _description = "Tax return line year" + _order = "name desc, line_id, id" + + name = fields.Char(string="Year", size=4) + line_id = fields.Many2one( + comodel_name="account.tax.return", + string="Line", + required=True, + ondelete="cascade", + ) + line_type = fields.Selection( + related="line_id.line_type", + ) + amount = fields.Float( + string="Amount", + digits="Product Price", + ) diff --git a/l10n_fr_tax_return/security/ir.model.access.csv b/l10n_fr_tax_return/security/ir.model.access.csv new file mode 100644 index 0000000..877fd1f --- /dev/null +++ b/l10n_fr_tax_return/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_account_tax_return_group_account_readonly,Account readonly account.tax.return,model_account_tax_return,account.group_account_readonly,1,1,1,1 +access_account_tax_return_year_group_account_readonly,Account readonly account.tax.return.year,model_account_tax_return_year,account.group_account_readonly,1,1,1,1 +access_tax_return_wizard_group_account_readonly,Account readonly tax.return.wizard,model_tax_return_wizard,base.group_user,1,1,1,1 diff --git a/l10n_fr_tax_return/static/description/icon.png b/l10n_fr_tax_return/static/description/icon.png new file mode 100644 index 0000000..663109e Binary files /dev/null and b/l10n_fr_tax_return/static/description/icon.png differ diff --git a/l10n_fr_tax_return/static/description/icon.svg b/l10n_fr_tax_return/static/description/icon.svg new file mode 100644 index 0000000..fedafcd --- /dev/null +++ b/l10n_fr_tax_return/static/description/icon.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/l10n_fr_tax_return/views/account_account.xml b/l10n_fr_tax_return/views/account_account.xml new file mode 100644 index 0000000..47fd9c1 --- /dev/null +++ b/l10n_fr_tax_return/views/account_account.xml @@ -0,0 +1,22 @@ + + + + + account.account.view.list.inherit + account.account + + + + + + + + + + + diff --git a/l10n_fr_tax_return/views/account_tax_return.xml b/l10n_fr_tax_return/views/account_tax_return.xml new file mode 100644 index 0000000..2c55010 --- /dev/null +++ b/l10n_fr_tax_return/views/account_tax_return.xml @@ -0,0 +1,67 @@ + + + + + account.tax.return.view.form + account.tax.return + +
+ + + + + + + + + + + + + + + + +
+
+
+ + + account.tax.return.view.tree + account.tax.return + + + + + + + + + + + + account.tax.return.view.search + account.tax.return + + + + + + + + + Tax returns + account.tax.return + tree,form + [] + {} + + + + +
diff --git a/l10n_fr_tax_return/views/account_tax_return_year.xml b/l10n_fr_tax_return/views/account_tax_return_year.xml new file mode 100644 index 0000000..264cbd7 --- /dev/null +++ b/l10n_fr_tax_return/views/account_tax_return_year.xml @@ -0,0 +1,65 @@ + + + + + account.tax.return.year.view.form + account.tax.return.year + +
+ + + + + + + + +
+
+
+ + + account.tax.return.year.view.tree + account.tax.return.year + + + + + + + + + + + + account.tax.return.year.view.search + account.tax.return.year + + + + + + + + + + + + + + + Tax returns + account.tax.return.year + tree,form + [] + {'search_deafault_by_year': 1} + + + + +
diff --git a/l10n_fr_tax_return/wizards/__init__.py b/l10n_fr_tax_return/wizards/__init__.py new file mode 100644 index 0000000..42d3853 --- /dev/null +++ b/l10n_fr_tax_return/wizards/__init__.py @@ -0,0 +1 @@ +from . import tax_return_wizard diff --git a/l10n_fr_tax_return/wizards/tax_return_wizard.py b/l10n_fr_tax_return/wizards/tax_return_wizard.py new file mode 100644 index 0000000..49e6956 --- /dev/null +++ b/l10n_fr_tax_return/wizards/tax_return_wizard.py @@ -0,0 +1,106 @@ +import logging +from odoo import models, fields, api, _ +from odoo.exceptions import ValidationError + +_logger = logging.getLogger(__name__) + + +class TaxReturnWizard(models.TransientModel): + _name = "tax.return.wizard" + _description = "Tax return wizard" + + name = fields.Char(string="Year", size=4) + # is_date_ok = fields.Boolean(string="Year ok", compute="_check_year") + + def _check_year(self): + self.ensure_one() + if not self.name.isdigit() or int(self.name) >= fields.Date.today().year: + raise ValidationError( + _( + "Please set a year in the past and after you started your odoo accounting." + ) + ) + # return { + # "value": { + # "name": "", + # }, + # "warning": { + # "title": _("Wrong year !"), + # "massage": _( + # "Please set a year in the past and after you started your odoo accounting." + # ), + # }, + # } + + def execute(self): + self._check_year() + start = fields.Date.to_date("{}-01-01".format(self.name)) + stop = fields.Date.to_date("{}-12-31".format(self.name)) + AML = self.env["account.move.line"] + ATR = self.env["account.tax.return"] + ATRY = self.env["account.tax.return.year"] + # Reset year lines if already created + ATRY.search([("name", "=", self.name)]).unlink() + atr_lines = ATR.search([]) + atr_sum_lines = atr_lines.filtered("is_sum_line") + accounts = atr_lines.mapped("account_ids") + year_amls = AML.search( + [ + ("date", ">=", start), + ("date", "<=", stop), + ("account_id", "in", accounts.ids), + ("parent_state", "=", "posted"), + ] + ) + base_vals_list = [] + for line in atr_lines - atr_sum_lines: + base_vals_list.append( + { + "name": self.name, + "line_id": line.id, + "amount": line.compute_value( + year_amls.filtered( + lambda aml: aml.account_id.id in line.account_ids.ids + ) + ), + } + ) + year_atry = ATRY.create(base_vals_list) + while atr_sum_lines: + summed_lines = ATR + for line in atr_sum_lines.filtered( + lambda atr: atr.id + not in (atr.mapped("add_line_id") | atr.mapped("sub_line_id")).ids + ): + new_vals = { + "name": self.name, + "line_id": line.id, + "amount": ( + sum( + year_atry.filtered( + lambda atry: atry.line_id.id in line.sum_line_ids.ids + ).mapped("amount") + ) + or 0.0 + ) + - ( + sum( + year_atry.filtered( + lambda atry: atry.line_id.id in line.ded_line_ids.ids + ).mapped("amount") + ) + or 0.0 + ), + } + year_atry |= ATRY.create([new_vals]) + summed_lines |= line + atr_sum_lines -= summed_lines + action = self.env.ref( + "l10n_fr_tax_return.account_tax_return_year_action" + ).read()[0] + action.update( + { + "context": {"search_default_name": self.name}, + } + ) + return action diff --git a/l10n_fr_tax_return/wizards/tax_return_wizard.xml b/l10n_fr_tax_return/wizards/tax_return_wizard.xml new file mode 100644 index 0000000..88b5601 --- /dev/null +++ b/l10n_fr_tax_return/wizards/tax_return_wizard.xml @@ -0,0 +1,38 @@ + + + + + tax.return.wizard.view.form + tax.return.wizard + +
+ + + + +
+
+
+
+
+ + + Tax returns compute + tax.return.wizard + form + new + [] + {} + + + + +