diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1c6434bfc2274c73d98dbf62b6de9baccdc353ce..732d0c4a644eb444d6b4385643ff32fab19fab52 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,8 +6,6 @@ exclude: | ^setup/|/static/description/index\.html$| # We don't want to mess with tool-generated files .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/| - # Maybe reactivate this when all README files include prettier ignore tags? - ^README\.md$| # Library files can have extraneous formatting (even minimized) /static/(src/)?lib/| # Repos using Sphinx to generate docs don't need prettying @@ -28,7 +26,7 @@ repos: language: fail files: "\\.rej$" - repo: https://github.com/oca/maintainer-tools - rev: ab1d7f6 + rev: 7d8a9f9ad73db0976fb03cbee43d953bc29b89e9 hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons @@ -46,11 +44,11 @@ repos: - --remove-duplicate-keys - --remove-unused-variables - repo: https://github.com/psf/black - rev: 20.8b1 + rev: 22.3.0 hooks: - id: black - repo: https://github.com/pre-commit/mirrors-prettier - rev: v2.1.2 + rev: v2.6.2 hooks: - id: prettier name: prettier (with plugin-xml) @@ -61,7 +59,7 @@ repos: - --plugin=@prettier/plugin-xml files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ - repo: https://github.com/pre-commit/mirrors-eslint - rev: v7.8.1 + rev: v8.15.0 hooks: - id: eslint verbose: true @@ -69,7 +67,7 @@ repos: - --color - --fix - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.2.0 + rev: v4.2.0 hooks: - id: trailing-whitespace # exclude autogenerated files @@ -91,12 +89,12 @@ repos: - id: mixed-line-ending args: ["--fix=lf"] - repo: https://github.com/asottile/pyupgrade - rev: v2.7.2 + rev: v2.32.1 hooks: - id: pyupgrade args: ["--keep-percent-format"] - repo: https://github.com/PyCQA/isort - rev: 5.5.1 + rev: 5.10.1 hooks: - id: isort name: isort except __init__.py @@ -104,13 +102,13 @@ repos: - --settings=. exclude: /__init__\.py$ - repo: https://gitlab.com/PyCQA/flake8 - rev: 3.8.3 + rev: 3.9.2 hooks: - id: flake8 name: flake8 additional_dependencies: ["flake8-bugbear==20.1.4"] - repo: https://github.com/PyCQA/pylint - rev: pylint-2.5.3 + rev: v2.11.1 hooks: - id: pylint name: pylint with optional checks @@ -119,7 +117,7 @@ repos: - --exit-zero verbose: true additional_dependencies: &pylint_deps - - pylint-odoo==3.5.0 + - pylint-odoo==5.0.5 - id: pylint name: pylint with mandatory checks args: diff --git a/__manifest__.py b/__manifest__.py index 6627b572528da4d89d9da2396506f9b7eecd7bdd..0d523e710d1d8650b439af5fbf05c02e5110c28c 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -9,12 +9,14 @@ "application": False, "depends": [ "cgscop_inovatic", - "cgscop_liste_ministere_alfodoo", + "cgscop_liasse_fiscale", + "cgscop_liste_ministere", ], "data": [ + "security/ir.model.access.csv", "datas/cron_inovatic.xml", - "views/scop_liste_ministere.xml", "wizard/load_xml_liasse.xml", + "views/scop_liste_ministere.xml", ], "installable": True, "auto_install": False, diff --git a/models/inovatic_job_queue.py b/models/inovatic_job_queue.py index 01aaf793d373187dfea92d28fac845b47cca3f9f..44ae3c36c05e6c7e4f1c5d4d3085da664116693e 100644 --- a/models/inovatic_job_queue.py +++ b/models/inovatic_job_queue.py @@ -32,26 +32,38 @@ class InovaticJobQueue(models.Model): # Internal function # ------------------------------------------------------ def _get_cmis_file(self): - if not self.liasse_fiscale_id.liste_ministere_id: + if ( + not self.liasse_fiscale_id.node_ref + or not self.liasse_fiscale_id.liste_ministere_id + ): raise UserError( _( - "Rechargement impossible : il n'y a pas de " - "Liste Ministère associée à cette liasse" + "Rechargement impossible : il n'y a pas de fichier ou de " + "Liste Ministère associé à cette liasse" ) ) backend = self.env["cmis.backend"].search([]) backend.ensure_one() cmis_client = backend.get_cmis_client() - query = """ - SELECT * FROM crm:document as d - JOIN crm:organisme as o ON d.cmis:objectId = o.cmis:objectId - WHERE d.crm:type='LFI' - AND d.crm:annee = '%s' - AND d.crm:contexte = 'LM' - AND o.crm:id = '%s'""" % ( - str(self.liasse_fiscale_id.liste_ministere_id.year), - str(self.liasse_fiscale_id.partner_id.id), - ) + if self.liasse_fiscale_id.node_ref: + ref = self.liasse.node_ref.split(";") + query = """ + SELECT * FROM crm:document + WHERE cmis:objectId = '%s' + """ % ( + ref[0], + ) + else: + query = """ + SELECT * FROM crm:document as d + JOIN crm:organisme as o ON d.cmis:objectId = o.cmis:objectId + WHERE d.crm:type='LFI' + AND d.crm:annee = '%s' + AND d.crm:contexte = 'LM' + AND o.crm:id = '%s'""" % ( + str(self.liasse_fiscale_id.liste_ministere_id.year), + str(self.liasse_fiscale_id.partner_id.id), + ) doc = cmis_client.getDefaultRepository().query(query) if not doc: raise exceptions.UserError( diff --git a/models/scop_liste_ministere.py b/models/scop_liste_ministere.py index ea9622ef22ec873a226f1de664b52692901b6582..20ec67f54437aa0634df61db683c6bc3e67d3030 100644 --- a/models/scop_liste_ministere.py +++ b/models/scop_liste_ministere.py @@ -1,8 +1,12 @@ # © 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import logging + from odoo import _, exceptions, fields, models +_logger = logging.getLogger(__name__) + class ListeMinistereInovatic(models.Model): _inherit = "scop.liste.ministere" @@ -14,7 +18,7 @@ class ListeMinistereInovatic(models.Model): last_job_queue_date_sync = fields.Datetime(related="last_job_queue.date_sync") # ------------------------------------------------------ - # BUTTON functions + # Button functions # ------------------------------------------------------ def inovatic_treatment(self): liasse_id = self.create_liasse_fiscale() @@ -47,3 +51,22 @@ class ListeMinistereInovatic(models.Model): raise exceptions.UserError( _("Il n'y a pas de Liasse correspondante dans Alfresco") ) + + # ------------------------------------------------------ + # Inherit parent + # ------------------------------------------------------ + def action_completed(self): + """ + Hérite la fonction parente pour envoyer autmatiquement la liasse à Inovatic + si cette liasse existe et si elle n'a pas déjà été chargée lorsque la coop + valide le dossier + """ + if ( + self.scop_liasse_fiscale_id + and not self.scop_liasse_fiscale_id.source == "inovatic_api" + ): + try: + self.scop_liasse_ficale_id.inovatic_treatment() + except Exception as e: + _logger.error(e) + super().action_completed() diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv new file mode 100644 index 0000000000000000000000000000000000000000..7392305e8485fe895e2349905505ba939473630b --- /dev/null +++ b/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_load_xml_liasse,access_load_xml_liasse,model_load_xml_liasse,base.group_user,1,1,1,1 diff --git a/wizard/load_xml_liasse.xml b/wizard/load_xml_liasse.xml index 1c7135a44ac188958101e4de91b85c09bd517383..dd1d92b7418751fcad26c26f3991fd9ec5204db6 100644 --- a/wizard/load_xml_liasse.xml +++ b/wizard/load_xml_liasse.xml @@ -18,7 +18,7 @@ <button class="btn btn-sm btn-primary" name="load_liasse" - string="Cherger une liasse XML" + string="Charger une liasse XML" type="object" confirm="Êtes-vous sûr(e) de vouloir charger ce fichier ?" /> diff --git a/wizard/scop_load_liasse_wizard.py b/wizard/scop_load_liasse_wizard.py new file mode 100644 index 0000000000000000000000000000000000000000..417a172d57421016bf7758a30f4530e2b1150dbc --- /dev/null +++ b/wizard/scop_load_liasse_wizard.py @@ -0,0 +1,47 @@ +# © 2021 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import models + + +class ScopLoadLiasseWizard(models.TransientModel): + _inherit = "scop.load.liasse.wizard" + + # ------------------------------------------------------ + # Inherit parent + # ------------------------------------------------------ + def load_liasse(self): + super().load_liasse() + if not self.liasse_id.liste_ministere_id: + # LM d'inscription ou de renouvellement liées à la coop + lm_ids = self.liasse_id.partner_id.liste_ministere_ids.filtered( + lambda lm: lm.type_lm != "survey_adjust" + ) + if lm_ids: + lm_type = "renew" + else: + lm_type = "subscribe" + # LM sur l'année N+1 de la liasse + lm_id = lm_ids.filtered(lambda lm: lm.year == str(self.liasse_id.year + 1)) + if not lm_id: + # Création de la LM si elle n'existe pas + new_lm = lm_id.create_folder( + partner_id=self.liasse_id.partner_id, + year=self.liasse_id.year + 1, + lm_type=lm_type, + ) + lm_id = lm_id.browse(new_lm) + # Mise à jour de la LM avec les valeurs de la liasse et de la file d'attente + lm_id.update( + { + "scop_liasse_fiscale_id": self.liasse_id.id, + "last_job_queue": self.job_queue_id.id, + } + ) + else: + self.liasse_id.liste_ministere_id.update( + { + "scop_liasse_fiscale_id": self.liasse_id.id, + "last_job_queue": self.job_queue_id.id, + } + )