From 8eb791acea198c9c9d5ac85002c433e952ac1bf1 Mon Sep 17 00:00:00 2001
From: benjamin <benjamin@le-filament.com>
Date: Wed, 2 Mar 2022 12:14:48 +0100
Subject: [PATCH] [mig] migration to 14.0 + add pre-commit changes

---
 .editorconfig                                 |   20 +
 .eslintrc.yml                                 |  187 +++
 .flake8                                       |   12 +
 .gitignore                                    |   78 +-
 .isort.cfg                                    |   13 +
 .pre-commit-config.yaml                       |  127 ++
 .prettierrc.yml                               |    8 +
 .pylintrc                                     |   87 ++
 .pylintrc-mandatory                           |   64 +
 LICENSE                                       |   42 -
 README.rst                                    |   19 +-
 __init__.py                                   |    8 +-
 __manifest__.py                               |   24 +-
 controllers/__init__.py                       |    4 +
 controllers/banner_dash_dlg.py                |   11 +-
 data/union_regionale_data.xml                 |    9 -
 models/partner_dashboard_ur.py                |  727 ----------
 {models => report}/__init__.py                |   12 +-
 {models => report}/partner_dashboard_dlg.py   | 1269 +++++++++--------
 {views => report}/partner_dashboard_dlg.xml   |  414 +++---
 report/partner_dashboard_ur.py                |  914 ++++++++++++
 {views => report}/partner_dashboard_ur.xml    |  441 +++---
 security/ir.model.access.csv                  |   11 +-
 security/security_rules.xml                   |    5 +-
 static/description/icon.png                   |  Bin 9296 -> 13973 bytes
 templates/header_dlg_template.xml             |   19 +-
 views/res_partner.xml                         |   62 +-
 .../partner_dashboard_dlg_selection_wizard.py |   50 +-
 ...partner_dashboard_dlg_selection_wizard.xml |   27 +-
 29 files changed, 2844 insertions(+), 1820 deletions(-)
 create mode 100644 .editorconfig
 create mode 100644 .eslintrc.yml
 create mode 100644 .flake8
 create mode 100644 .isort.cfg
 create mode 100644 .pre-commit-config.yaml
 create mode 100644 .prettierrc.yml
 create mode 100644 .pylintrc
 create mode 100644 .pylintrc-mandatory
 mode change 100755 => 100644 README.rst
 delete mode 100644 data/union_regionale_data.xml
 delete mode 100644 models/partner_dashboard_ur.py
 rename {models => report}/__init__.py (79%)
 rename {models => report}/partner_dashboard_dlg.py (50%)
 rename {views => report}/partner_dashboard_dlg.xml (57%)
 create mode 100644 report/partner_dashboard_ur.py
 rename {views => report}/partner_dashboard_ur.xml (54%)

diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..bfd7ac5
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,20 @@
+# Configuration for known file extensions
+[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.{json,yml,yaml,rst,md}]
+indent_size = 2
+
+# Do not configure editor for libs and autogenerated content
+[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}]
+charset = unset
+end_of_line = unset
+indent_size = unset
+indent_style = unset
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.eslintrc.yml b/.eslintrc.yml
new file mode 100644
index 0000000..d4cc423
--- /dev/null
+++ b/.eslintrc.yml
@@ -0,0 +1,187 @@
+env:
+  browser: true
+  es6: true
+
+# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449
+parserOptions:
+  ecmaVersion: 2017
+
+overrides:
+  - files:
+      - "**/*.esm.js"
+    parserOptions:
+      sourceType: module
+
+# Globals available in Odoo that shouldn't produce errorings
+globals:
+  _: readonly
+  $: readonly
+  fuzzy: readonly
+  jQuery: readonly
+  moment: readonly
+  odoo: readonly
+  openerp: readonly
+  owl: readonly
+
+# Styling is handled by Prettier, so we only need to enable AST rules;
+# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
+rules:
+  accessor-pairs: warn
+  array-callback-return: warn
+  callback-return: warn
+  capitalized-comments:
+    - warn
+    - always
+    - ignoreConsecutiveComments: true
+      ignoreInlineComments: true
+  complexity:
+    - warn
+    - 15
+  constructor-super: warn
+  dot-notation: warn
+  eqeqeq: warn
+  global-require: warn
+  handle-callback-err: warn
+  id-blacklist: warn
+  id-match: warn
+  init-declarations: error
+  max-depth: warn
+  max-nested-callbacks: warn
+  max-statements-per-line: warn
+  no-alert: warn
+  no-array-constructor: warn
+  no-caller: warn
+  no-case-declarations: warn
+  no-class-assign: warn
+  no-cond-assign: error
+  no-const-assign: error
+  no-constant-condition: warn
+  no-control-regex: warn
+  no-debugger: error
+  no-delete-var: warn
+  no-div-regex: warn
+  no-dupe-args: error
+  no-dupe-class-members: error
+  no-dupe-keys: error
+  no-duplicate-case: error
+  no-duplicate-imports: error
+  no-else-return: warn
+  no-empty-character-class: warn
+  no-empty-function: error
+  no-empty-pattern: error
+  no-empty: warn
+  no-eq-null: error
+  no-eval: error
+  no-ex-assign: error
+  no-extend-native: warn
+  no-extra-bind: warn
+  no-extra-boolean-cast: warn
+  no-extra-label: warn
+  no-fallthrough: warn
+  no-func-assign: error
+  no-global-assign: error
+  no-implicit-coercion:
+    - warn
+    - allow: ["~"]
+  no-implicit-globals: warn
+  no-implied-eval: warn
+  no-inline-comments: warn
+  no-inner-declarations: warn
+  no-invalid-regexp: warn
+  no-irregular-whitespace: warn
+  no-iterator: warn
+  no-label-var: warn
+  no-labels: warn
+  no-lone-blocks: warn
+  no-lonely-if: error
+  no-mixed-requires: error
+  no-multi-str: warn
+  no-native-reassign: error
+  no-negated-condition: warn
+  no-negated-in-lhs: error
+  no-new-func: warn
+  no-new-object: warn
+  no-new-require: warn
+  no-new-symbol: warn
+  no-new-wrappers: warn
+  no-new: warn
+  no-obj-calls: warn
+  no-octal-escape: warn
+  no-octal: warn
+  no-param-reassign: warn
+  no-path-concat: warn
+  no-process-env: warn
+  no-process-exit: warn
+  no-proto: warn
+  no-prototype-builtins: warn
+  no-redeclare: warn
+  no-regex-spaces: warn
+  no-restricted-globals: warn
+  no-restricted-imports: warn
+  no-restricted-modules: warn
+  no-restricted-syntax: warn
+  no-return-assign: error
+  no-script-url: warn
+  no-self-assign: warn
+  no-self-compare: warn
+  no-sequences: warn
+  no-shadow-restricted-names: warn
+  no-shadow: warn
+  no-sparse-arrays: warn
+  no-sync: warn
+  no-this-before-super: warn
+  no-throw-literal: warn
+  no-undef-init: warn
+  no-undef: error
+  no-unmodified-loop-condition: warn
+  no-unneeded-ternary: error
+  no-unreachable: error
+  no-unsafe-finally: error
+  no-unused-expressions: error
+  no-unused-labels: error
+  no-unused-vars: error
+  no-use-before-define: error
+  no-useless-call: warn
+  no-useless-computed-key: warn
+  no-useless-concat: warn
+  no-useless-constructor: warn
+  no-useless-escape: warn
+  no-useless-rename: warn
+  no-void: warn
+  no-with: warn
+  operator-assignment: [error, always]
+  prefer-const: warn
+  radix: warn
+  require-yield: warn
+  sort-imports: warn
+  spaced-comment: [error, always]
+  strict: [error, function]
+  use-isnan: error
+  valid-jsdoc:
+    - warn
+    - prefer:
+        arg: param
+        argument: param
+        augments: extends
+        constructor: class
+        exception: throws
+        func: function
+        method: function
+        prop: property
+        return: returns
+        virtual: abstract
+        yield: yields
+      preferType:
+        array: Array
+        bool: Boolean
+        boolean: Boolean
+        number: Number
+        object: Object
+        str: String
+        string: String
+      requireParamDescription: false
+      requireReturn: false
+      requireReturnDescription: false
+      requireReturnType: false
+  valid-typeof: warn
+  yoda: warn
diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..e397e8e
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,12 @@
+[flake8]
+max-line-length = 88
+max-complexity = 16
+# B = bugbear
+# B9 = bugbear opinionated (incl line length)
+select = C,E,F,W,B,B9
+# E203: whitespace before ':' (black behaviour)
+# E501: flake8 line length (covered by bugbear B950)
+# W503: line break before binary operator (black behaviour)
+ignore = E203,E501,W503
+per-file-ignores=
+    __init__.py:F401
diff --git a/.gitignore b/.gitignore
index 75bb204..818770f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,75 @@
-.*
-*.pyc
-!.gitignore
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+/.venv
+/.pytest_cache
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+bin/
+build/
+develop-eggs/
+dist/
+eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+*.egg-info/
+.installed.cfg
+*.egg
+*.eggs
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.cache
+nosetests.xml
+coverage.xml
+
+# Translations
+*.mo
+
+# Pycharm
+.idea
+
+# Eclipse
+.settings
+
+# Visual Studio cache/options directory
+.vs/
+.vscode
+
+# OSX Files
+.DS_Store
+
+# Django stuff:
+*.log
+
+# Mr Developer
+.mr.developer.cfg
+.project
+.pydevproject
+
+# Rope
+.ropeproject
+
+# Sphinx documentation
+docs/_build/
+
+# Backup files
+*~
+*.swp
+
+# OCA rules
+!static/lib/
diff --git a/.isort.cfg b/.isort.cfg
new file mode 100644
index 0000000..0ec187e
--- /dev/null
+++ b/.isort.cfg
@@ -0,0 +1,13 @@
+[settings]
+; see https://github.com/psf/black
+multi_line_output=3
+include_trailing_comma=True
+force_grid_wrap=0
+combine_as_imports=True
+use_parentheses=True
+line_length=88
+known_odoo=odoo
+known_odoo_addons=odoo.addons
+sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER
+default_section=THIRDPARTY
+ensure_newline_before_comments = True
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..1c6434b
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,127 @@
+exclude: |
+  (?x)
+  # NOT INSTALLABLE ADDONS
+  # END NOT INSTALLABLE ADDONS
+  # Files and folders generated by bots, to avoid loops
+  ^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
+  ^docs/_templates/.*\.html$|
+  # You don't usually want a bot to modify your legal texts
+  (LICENSE.*|COPYING.*)
+default_language_version:
+  python: python3
+  node: "14.13.0"
+repos:
+  - repo: local
+    hooks:
+      # These files are most likely copier diff rejection junks; if found,
+      # review them manually, fix the problem (if needed) and remove them
+      - id: forbidden-files
+        name: forbidden files
+        entry: found forbidden files; remove them
+        language: fail
+        files: "\\.rej$"
+  - repo: https://github.com/oca/maintainer-tools
+    rev: ab1d7f6
+    hooks:
+      # update the NOT INSTALLABLE ADDONS section above
+      - id: oca-update-pre-commit-excluded-addons
+      - id: oca-fix-manifest-website
+        args: ["https://le-filament.com"]
+  - repo: https://github.com/myint/autoflake
+    rev: v1.4
+    hooks:
+      - id: autoflake
+        args:
+          - --expand-star-imports
+          - --ignore-init-module-imports
+          - --in-place
+          - --remove-all-unused-imports
+          - --remove-duplicate-keys
+          - --remove-unused-variables
+  - repo: https://github.com/psf/black
+    rev: 20.8b1
+    hooks:
+      - id: black
+  - repo: https://github.com/pre-commit/mirrors-prettier
+    rev: v2.1.2
+    hooks:
+      - id: prettier
+        name: prettier (with plugin-xml)
+        additional_dependencies:
+          - "prettier@2.1.2"
+          - "@prettier/plugin-xml@0.12.0"
+        args:
+          - --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
+    hooks:
+      - id: eslint
+        verbose: true
+        args:
+          - --color
+          - --fix
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v3.2.0
+    hooks:
+      - id: trailing-whitespace
+        # exclude autogenerated files
+        exclude: /README\.rst$|\.pot?$
+      - id: end-of-file-fixer
+        # exclude autogenerated files
+        exclude: /README\.rst$|\.pot?$
+      - id: debug-statements
+      - id: fix-encoding-pragma
+        args: ["--remove"]
+      - id: check-case-conflict
+      - id: check-docstring-first
+      - id: check-executables-have-shebangs
+      - id: check-merge-conflict
+        # exclude files where underlines are not distinguishable from merge conflicts
+        exclude: /README\.rst$|^docs/.*\.rst$
+      - id: check-symlinks
+      - id: check-xml
+      - id: mixed-line-ending
+        args: ["--fix=lf"]
+  - repo: https://github.com/asottile/pyupgrade
+    rev: v2.7.2
+    hooks:
+      - id: pyupgrade
+        args: ["--keep-percent-format"]
+  - repo: https://github.com/PyCQA/isort
+    rev: 5.5.1
+    hooks:
+      - id: isort
+        name: isort except __init__.py
+        args:
+          - --settings=.
+        exclude: /__init__\.py$
+  - repo: https://gitlab.com/PyCQA/flake8
+    rev: 3.8.3
+    hooks:
+      - id: flake8
+        name: flake8
+        additional_dependencies: ["flake8-bugbear==20.1.4"]
+  - repo: https://github.com/PyCQA/pylint
+    rev: pylint-2.5.3
+    hooks:
+      - id: pylint
+        name: pylint with optional checks
+        args:
+          - --rcfile=.pylintrc
+          - --exit-zero
+        verbose: true
+        additional_dependencies: &pylint_deps
+          - pylint-odoo==3.5.0
+      - id: pylint
+        name: pylint with mandatory checks
+        args:
+          - --rcfile=.pylintrc-mandatory
+        additional_dependencies: *pylint_deps
diff --git a/.prettierrc.yml b/.prettierrc.yml
new file mode 100644
index 0000000..5b6d4b3
--- /dev/null
+++ b/.prettierrc.yml
@@ -0,0 +1,8 @@
+# Defaults for all prettier-supported languages.
+# Prettier will complete this with settings from .editorconfig file.
+bracketSpacing: false
+printWidth: 88
+proseWrap: always
+semi: true
+trailingComma: "es5"
+xmlWhitespaceSensitivity: "strict"
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 0000000..dc6270e
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,87 @@
+[MASTER]
+load-plugins=pylint_odoo
+score=n
+
+[ODOOLINT]
+readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
+manifest_required_authors=Le Filament
+manifest_required_keys=license
+manifest_deprecated_keys=description,active
+license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
+valid_odoo_versions=14.0
+
+[MESSAGES CONTROL]
+disable=all
+
+# This .pylintrc contains optional AND mandatory checks and is meant to be
+# loaded in an IDE to have it check everything, in the hope this will make
+# optional checks more visible to contributors who otherwise never look at a
+# green travis to see optional checks that failed.
+# .pylintrc-mandatory containing only mandatory checks is used the pre-commit
+# config as a blocking check.
+
+enable=anomalous-backslash-in-string,
+    api-one-deprecated,
+    api-one-multi-together,
+    assignment-from-none,
+    attribute-deprecated,
+    class-camelcase,
+    dangerous-default-value,
+    dangerous-view-replace-wo-priority,
+    development-status-allowed,
+    duplicate-id-csv,
+    duplicate-key,
+    duplicate-xml-fields,
+    duplicate-xml-record-id,
+    eval-referenced,
+    eval-used,
+    incoherent-interpreter-exec-perm,
+    license-allowed,
+    manifest-author-string,
+    manifest-deprecated-key,
+    manifest-required-author,
+    manifest-required-key,
+    manifest-version-format,
+    method-compute,
+    method-inverse,
+    method-required-super,
+    method-search,
+    openerp-exception-warning,
+    pointless-statement,
+    pointless-string-statement,
+    print-used,
+    redundant-keyword-arg,
+    redundant-modulename-xml,
+    reimported,
+    relative-import,
+    return-in-init,
+    rst-syntax-error,
+    sql-injection,
+    too-few-format-args,
+    translation-field,
+    translation-required,
+    unreachable,
+    use-vim-comment,
+    wrong-tabs-instead-of-spaces,
+    xml-syntax-error,
+    # messages that do not cause the lint step to fail
+    consider-merging-classes-inherited,
+    create-user-wo-reset-password,
+    dangerous-filter-wo-user,
+    deprecated-module,
+    file-not-used,
+    invalid-commit,
+    missing-manifest-dependency,
+    missing-newline-extrafiles,
+    no-utf8-coding-comment,
+    odoo-addons-relative-import,
+    old-api7-method-defined,
+    redefined-builtin,
+    too-complex,
+    unnecessary-utf8-coding-comment
+
+
+[REPORTS]
+msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
+output-format=colorized
+reports=no
diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory
new file mode 100644
index 0000000..43ea239
--- /dev/null
+++ b/.pylintrc-mandatory
@@ -0,0 +1,64 @@
+[MASTER]
+load-plugins=pylint_odoo
+score=n
+
+[ODOOLINT]
+readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
+manifest_required_authors=Le Filament
+manifest_required_keys=license
+manifest_deprecated_keys=description,active
+license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
+valid_odoo_versions=14.0
+
+[MESSAGES CONTROL]
+disable=all
+
+enable=anomalous-backslash-in-string,
+    api-one-deprecated,
+    api-one-multi-together,
+    assignment-from-none,
+    attribute-deprecated,
+    class-camelcase,
+    dangerous-default-value,
+    dangerous-view-replace-wo-priority,
+    development-status-allowed,
+    duplicate-id-csv,
+    duplicate-key,
+    duplicate-xml-fields,
+    duplicate-xml-record-id,
+    eval-referenced,
+    eval-used,
+    incoherent-interpreter-exec-perm,
+    license-allowed,
+    manifest-author-string,
+    manifest-deprecated-key,
+    manifest-required-author,
+    manifest-required-key,
+    manifest-version-format,
+    method-compute,
+    method-inverse,
+    method-required-super,
+    method-search,
+    openerp-exception-warning,
+    pointless-statement,
+    pointless-string-statement,
+    print-used,
+    redundant-keyword-arg,
+    redundant-modulename-xml,
+    reimported,
+    relative-import,
+    return-in-init,
+    rst-syntax-error,
+    sql-injection,
+    too-few-format-args,
+    translation-field,
+    translation-required,
+    unreachable,
+    use-vim-comment,
+    wrong-tabs-instead-of-spaces,
+    xml-syntax-error
+
+[REPORTS]
+msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
+output-format=colorized
+reports=no
diff --git a/LICENSE b/LICENSE
index 3ffc567..eb37caf 100755
--- a/LICENSE
+++ b/LICENSE
@@ -617,45 +617,3 @@ Program, unless a warranty or assumption of liability accompanies a
 copy of the Program in return for a fee.
 
                      END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU Affero General Public License as published
-    by the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU Affero General Public License for more details.
-
-    You should have received a copy of the GNU Affero General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source.  For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code.  There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-<http://www.gnu.org/licenses/>.
\ No newline at end of file
diff --git a/README.rst b/README.rst
old mode 100755
new mode 100644
index 9ddc0a1..6cd110f
--- a/README.rst
+++ b/README.rst
@@ -3,22 +3,29 @@
    :alt: License: AGPL-3
 
 
-===========================
-CG Scop - Partner Dashboard
-===========================
+====================================
+CG SCOP - Gestion Dashboard Contacts
+====================================
 
-Description
-===========
+Ce module ajoute une vue dashboard pour faciliter la gestion des coopératives et des contacts.
 
-Ajoute un tableau de bord au menu contact pour les UR.
 
 Credits
 =======
 
+Funders
+------------
+
+The development of this module has been financially supported by:
+
+    Confédération Générale des SCOP (https://www.les-scop.coop)
+
+
 Contributors
 ------------
 
 * Hervé Silvant <hsilvant@scop.coop>
+* Benjamin Rivier <benjamin@le-filament.com>
 
 
 Maintainer
diff --git a/__init__.py b/__init__.py
index 5ea0fdc..5c6cd32 100644
--- a/__init__.py
+++ b/__init__.py
@@ -1,5 +1,5 @@
-# -*- coding: utf-8 -*-
+# © 2020 Le Filament (<https://www.le-filament.com>)
+# © 2020 Confédération Générale des Scop (<https://www.les-scop.coop>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
-from . import models
-from . import controllers
-from . import wizard
\ No newline at end of file
+from . import controllers, report, wizard
diff --git a/__manifest__.py b/__manifest__.py
index abce1aa..51528da 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -1,17 +1,21 @@
+# © 2020 Le Filament (<https://www.le-filament.com>)
+# © 2020 Confédération Générale des Scop (<https://www.les-scop.coop>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 {
-    'name': "CGSCOP Partner Dashboard",
-    'summary': "Dashboard coopératives",
-    'author': "CGSCOP",
-    'version': '12.0.0.0',
-    'depends': ["cgscop_partner","cgscop_partner_crm","cgscop_timesheet"],
-    'data': [
+    "name": "CGSCOP Partner Dashboard",
+    "summary": "Dashboard coopératives",
+    "author": "Le Filament, Confédération Générale des Scop",
+    "license": "AGPL-3",
+    "version": "14.0.1.0.0",
+    "depends": ["cgscop_partner", "cgscop_partner_crm", "cgscop_timesheet"],
+    "data": [
         "security/ir.model.access.csv",
         "security/security_rules.xml",
-        'views/partner_dashboard_ur.xml',
-        'views/partner_dashboard_dlg.xml',
+        "report/partner_dashboard_ur.xml",
+        "report/partner_dashboard_dlg.xml",
         "templates/header_dlg_template.xml",
         "wizard/partner_dashboard_dlg_selection_wizard.xml",
-        'views/res_partner.xml',
+        "views/res_partner.xml",
     ],
-    'demo': [],
+    "demo": [],
 }
diff --git a/controllers/__init__.py b/controllers/__init__.py
index a7a226b..e706c2f 100644
--- a/controllers/__init__.py
+++ b/controllers/__init__.py
@@ -1 +1,5 @@
+# © 2020 Le Filament (<https://www.le-filament.com>)
+# © 2020 Confédération Générale des Scop (<https://www.les-scop.coop>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
 from . import banner_dash_dlg
diff --git a/controllers/banner_dash_dlg.py b/controllers/banner_dash_dlg.py
index 90e8915..a431f30 100644
--- a/controllers/banner_dash_dlg.py
+++ b/controllers/banner_dash_dlg.py
@@ -1,4 +1,5 @@
-# © 2020 Le Filament (<http://www.le-filament.com>)
+# © 2020 Le Filament (<https://www.le-filament.com>)
+# © 2020 Confédération Générale des Scop (<https://www.les-scop.coop>)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
 from odoo import http
@@ -6,10 +7,10 @@ from odoo.http import request
 
 
 class BannerDashDlgController(http.Controller):
-
-    @http.route(['/cgscop_partner_dashboard/header_dlg'], type="json", auth="user")
+    @http.route(["/cgscop_partner_dashboard/header_dlg"], type="json", auth="user")
     def lm_header(self):
         return {
-            'html': request.env.ref(
-                'cgscop_partner_dashboard.header_dlg_template').render({})
+            "html": request.env.ref(
+                "cgscop_partner_dashboard.header_dlg_template"
+            ).render({})
         }
diff --git a/data/union_regionale_data.xml b/data/union_regionale_data.xml
deleted file mode 100644
index 7d94789..0000000
--- a/data/union_regionale_data.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0"?>
-<odoo>
-    <data>
-        <record id="cgscop" model="union.regionale">
-            <field name="long_name">Confédération générale des scop</field>
-            <field name="name">CgScop</field>
-        </record>       
-    </data>
-</odoo>
diff --git a/models/partner_dashboard_ur.py b/models/partner_dashboard_ur.py
deleted file mode 100644
index 579c215..0000000
--- a/models/partner_dashboard_ur.py
+++ /dev/null
@@ -1,727 +0,0 @@
-# © 2020 Le Filament (<http://www.le-filament.com>)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-import json
-
-from odoo import fields, models, api, tools, exceptions
-import datetime
-
-
-class ScopPartnerDashboardUr(models.Model):
-    _name = 'scop.partner.dashboard.ur'
-    _description = 'Dashboard coopératives UR'
-    _order = 'dash_type asc'
-    _auto = False
-
-    current_user_ur_id = fields.Many2one(
-        'union.regionale',
-        string="Union Régionale de l'utilisateur",
-        compute='_compute_current_user_ur_id',
-        search='_search_current_user_ur_id')
-
-    # Vue
-    ur_id = fields.Many2one('union.regionale', string='Union Régionale')
-    name = fields.Char()
-    dash_type = fields.Integer("Type de dashboard")
-    all_ur = fields.Boolean("Affichage de toutes les UR")
-
-    nb_prj_info = fields.Integer("Information")
-    nb_prj_pdiag = fields.Integer("Pre-diag")
-    nb_prj_accomp = fields.Integer("Accompagnement")
-    nb_prj_adh = fields.Integer("Adhésion")
-    nb_prj_soumis = fields.Integer("Soumis")
-    nb_prj_tot = fields.Integer("Projets en cours")
-
-    nb_fc_scop = fields.Integer("Nombre de scop")
-    nb_fc_scic = fields.Integer("Nombre de scic")
-    nb_fc_co47 = fields.Integer("Nombre de coop 47")
-    nb_coop_cae = fields.Integer("Nombre de CAE")
-    nb_coop_adh = fields.Integer("Nombre d'adhésion pour l'année")
-    nb_coop_tot = fields.Integer("Total coop adhérentes")
-
-    rev_todo = fields.Integer("A réviser")
-    rev_done = fields.Integer("Révisées")
-    rev_total = fields.Integer("Total révisions")
-    rev_1y = fields.Integer("Annuelle")
-    rev_5y = fields.Integer("Quinquennale")
-    rev_5ys = fields.Integer("Quinquennale séquencée (annuel)")
-    rev_5ys23 = fields.Integer("Quinquennale séquencée (2 ans et 3 ans)")
-    rev_percent_done = fields.Float(
-        "Réalisés",
-        compute="_compute_percent_rev")
-
-    act_dev = fields.Integer("Développement (hrs)")
-    act_acc = fields.Integer("Suivi (hrs)")
-    act_rev = fields.Integer("Révision (hrs)")
-    act_for = fields.Integer("Formation (hrs)")
-    act_acc_theo = fields.Integer("Acc. théorique (hrs)")
-    act_acc_percent_done = fields.Float(
-        "Réalisés",
-        compute="_compute_act_acc")
-
-    graph_values = fields.Text(compute="_compute_graph_values")
-
-    # ------------------------------------------------------
-    # Construction de la requete 
-    # ------------------------------------------------------
-    @api.model
-    def _select(self):
-        # On récupere l'id de la cgscop
-        cgids = self.env['union.regionale'].search([('name','ilike','CGSCOP')])       
-        if (len(cgids)!=1):
-            cgscop_id = 0
-        else:
-            cgscop_id = cgids[0].id
-
-        # On constitue les requetes
-        qy_projet = self._select_projet(cgscop_id)
-        qy_coop = self._select_coop(cgscop_id)
-        qy_rev = self._select_rev(cgscop_id)
-        qy_act = self._select_act(cgscop_id)
-        
-        qy = qy_projet + " UNION ALL " + qy_coop + " UNION ALL " + qy_rev + " UNION ALL " + qy_act
-
-        return qy
-
-
-    # ------------------------------------------------------
-    # Dashboard projets
-    # ------------------------------------------------------
-    @api.model
-    def _select_projet(self, cgscop_id):      
-        query = """
-                SELECT
-                CONCAT('1', ur_id) AS id,
-                org.ur_id as ur_id,
-                'Prospects en cours' AS name,
-                '1' as dash_type,
-                0 as all_ur,
-                SUM(case when substring(org.project_status,1,1) = '1' then 1 else 0 end) AS nb_prj_info,
-                SUM(case when substring(org.project_status,1,1) = '2' then 1 else 0 end) AS nb_prj_pdiag,
-                SUM(case when substring(org.project_status,1,1) = '3' then 1 else 0 end) AS nb_prj_accomp,
-                SUM(case when substring(org.project_status,1,1) = '4' then 1 else 0 end) AS nb_prj_adh,
-                SUM(case when substring(org.project_status,1,1) = '5' then 1 else 0 end) AS nb_prj_soumis,
-                count(org.id) as nb_prj_tot,
-                0 as nb_fc_scop,
-                0 as nb_fc_scic,
-                0 as nb_fc_co47,
-                0 as nb_coop_cae,
-                0 as nb_coop_adh,
-                0 as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 as rev_5y,
-                0 as rev_5ys,
-                0 as rev_5ys23,
-                0 as rev_todo,
-                0 as rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM res_partner org
-                where 
-                (org.ur_id <> %d) and
-                (org.active=TRUE) and
-                (org.is_cooperative = TRUE)and
-                substring(org.project_status,1,1) in ('1','2','3','4','5')  
-                group by
-                org.ur_id
-                UNION ALL
-                SELECT
-                '1CGSCOP' AS id,
-                '%d' as ur_id,
-                'Prospects en cours' AS name,
-                '1' as dash_type,
-                1 as all_ur,
-                SUM(case when substring(org.project_status,1,1) = '1' then 1 else 0 end) AS nb_prj_info,
-                SUM(case when substring(org.project_status,1,1) = '2' then 1 else 0 end) AS nb_prj_pdiag,
-                SUM(case when substring(org.project_status,1,1) = '3' then 1 else 0 end) AS nb_prj_accomp,
-                SUM(case when substring(org.project_status,1,1) = '4' then 1 else 0 end) AS nb_prj_adh,
-                SUM(case when substring(org.project_status,1,1) = '5' then 1 else 0 end) AS nb_prj_soumis,
-                count(org.id) as nb_prj_tot,
-                0 as nb_fc_scop,
-                0 as nb_fc_scic,
-                0 as nb_fc_co47,
-                0 as nb_coop_cae,
-                0 as nb_coop_adh,
-                0 as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 as rev_5y,
-                0 as rev_5ys,
-                0 as rev_5ys23,
-                0 as rev_todo,
-                0 as rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM res_partner org
-                where 
-                (org.active=TRUE) and
-                (org.is_cooperative = TRUE)and
-                substring(org.project_status,1,1) in ('1','2','3','4','5')  
-                """ % (cgscop_id, cgscop_id)
-
-        return query
-
-    # ------------------------------------------------------
-    # Dashboard cooperative
-    # ------------------------------------------------------
-    @api.model
-    def _select_coop(self, cgscop_id):  
-
-        try:
-            form_scop = self.env.ref('cgscop_partner.form_scop').id
-        except:
-            form_scop = 0
-        try:
-            form_scic = self.env.ref('cgscop_partner.form_scic').id
-        except:
-            form_scic = 0
-        try:
-            form_co47 = self.env.ref('cgscop_partner.form_coop47').id
-        except:
-            form_co47 = 0
-
-        query = """
-                SELECT
-                CONCAT('2', ur_id) AS id,
-                org.ur_id as ur_id,
-                'Coopératives adhérentes' AS name,
-                '2' as dash_type,
-                0 as all_ur,
-                0 as nb_prj_info,
-                0 as nb_prj_pdiag,
-                0 as nb_prj_accomp,
-                0 as nb_prj_adh,
-                0 as nb_prj_soumis,
-                0 as nb_prj_tot,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_scop,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_scic,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_co47,
-                SUM(case when org.cae is true then 1 else 0 end) AS nb_coop_cae,
-                SUM(case when date_part('year', adh.start) = date_part('year', CURRENT_DATE) then 1 else 0 end) AS nb_coop_adh,
-                count(org.id) as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 as rev_5y,
-                0 as rev_5ys,
-                0 as rev_5ys23,
-                0 as rev_todo,
-                0 as rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM res_partner org
-                left join scop_membership_period as adh
-                    on adh.partner_id = org.id
-                    and adh.start=(select max(start) from scop_membership_period where partner_id=org.id and type_id=1)
-                    and type_id=1
-                where 
-                (org.ur_id <> %d) and
-                (org.active=TRUE) and
-                (org.is_cooperative = TRUE) and
-                (org.membership_status = 'member')
-                group by
-                org.ur_id
-                UNION ALL
-                SELECT
-                '2CGSCOP' AS id,
-                '%d' as ur_id,
-                'Coopératives adhérentes' AS name,
-                '2' as dash_type,
-                1 as all_ur,
-                0 as nb_prj_info,
-                0 as nb_prj_pdiag,
-                0 as nb_prj_accomp,
-                0 as nb_prj_adh,
-                0 as nb_prj_soumis,
-                0 as nb_prj_tot,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_scop,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_scic,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_co47,
-                SUM(case when org.cae is true then 1 else 0 end) AS nb_coop_cae,
-                SUM(case when date_part('year', adh.start) = date_part('year', CURRENT_DATE) then 1 else 0 end) AS nb_coop_adh,
-                count(org.id) as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 as rev_5y,
-                0 as rev_5ys,
-                0 as rev_5ys23,
-                0 as rev_todo,
-                0 as rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM res_partner org
-                left join scop_membership_period as adh
-                    on adh.partner_id = org.id
-                    and adh.start=(select max(start) from scop_membership_period where partner_id=org.id and type_id=1)
-                    and type_id=1
-                where 
-                (org.active=TRUE) and
-                (org.is_cooperative = TRUE) and
-                (org.membership_status = 'member')
-                """ % (form_scop,form_scic,form_co47,cgscop_id,
-                    cgscop_id,form_scop,form_scic,form_co47)
-
-        return query
-
-
-    # ------------------------------------------------------
-    # Dashboard revision
-    # ------------------------------------------------------
-    @api.model
-    def _select_rev(self, cgscop_id):  
-
-        query = """
-                SELECT
-                id,
-                ur_id,
-                CONCAT('Révisions année ',date_part('year', CURRENT_DATE)) AS name,
-                '3' as dash_type,
-                0 as all_ur,
-                0 as nb_prj_info,
-                0 as nb_prj_pdiag,
-                0 as nb_prj_accomp,
-                0 as nb_prj_adh,
-                0 as nb_prj_soumis,
-                0 as nb_prj_tot,
-                0 as nb_fc_scop,
-                0 as nb_fc_scic,
-                0 as nb_fc_co47,
-                0 as nb_coop_cae,
-                0 as nb_coop_adh,
-                0 as nb_coop_tot,
-                SUM(wrev.rev_done) as rev_done,
-                SUM(wrev.rev_1y) AS rev_1y,
-                SUM(wrev.rev_5y) AS rev_5y,
-                SUM(wRev.rev_5ys) AS rev_5ys,
-                SUM(wrev.rev_5ys23) AS rev_5ys23,
-                SUM(wrev.rev_1y) + SUM(wrev.rev_5y) + SUM(wRev.rev_5ys) + SUM(wrev.rev_5ys23) AS rev_todo,
-                SUM(wrev.rev_done) + SUM(wrev.rev_1y) + SUM(wrev.rev_5y) + SUM(wRev.rev_5ys) + SUM(wrev.rev_5ys23) AS rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM
-                (
-                    SELECT  
-                    CONCAT(org.ur_id, org.revision_next_year) AS id,
-                    org.ur_id as ur_id,
-                    0 AS rev_done,
-                    case when org.revision_type = '1y' then 1 else 0 end AS rev_1y,
-                    case when org.revision_type = '5y' then 1 else 0 end AS rev_5y,
-                    case when org.revision_type = '5ys' then 1 else 0 end AS rev_5ys,
-                    case when org.revision_type = '5ys23' then 1 else 0 end AS rev_5ys23
-                    FROM res_partner as org
-                    WHERE (org.revision_next_year = date_part('year', CURRENT_DATE))
-                UNION ALL
-                    SELECT 
-                    CONCAT(org.ur_id, date_part('year', rev.date)) as id, 
-                    org.ur_id as ur_id,
-                    1 AS rev_done,
-                    0 AS rev_1y,
-                    0 AS rev_5y,
-                    0 AS rev_5ys,
-                    0 AS rev_5ys23
-                    FROM scop_revision as rev
-                    JOIN res_partner as org ON (org.id = rev.partner_id)
-                    WHERE (date_part('year', rev.date) = date_part('year', CURRENT_DATE))
-                ) AS wRev
-                GROUP BY wrev.id, wrev.ur_id
-        """        
-        return query
-
-
-    # ------------------------------------------------------
-    # Dashboard activité
-    # ------------------------------------------------------
-    @api.model
-    def _select_act(self, cgscop_id):  
-
-        query = """
-                SELECT
-                CONCAT('4', ur_id) as id,
-                ur_id,
-                CONCAT('Activité année ',date_part('year', CURRENT_DATE)) AS name,
-                '4' as dash_type,
-                0 as all_ur,
-                0 as nb_prj_info,
-                0 as nb_prj_pdiag,
-                0 as nb_prj_accomp,
-                0 as nb_prj_adh,
-                0 as nb_prj_soumis,
-                0 as nb_prj_tot,
-                0 as nb_fc_scop,
-                0 as nb_fc_scic,
-                0 as nb_fc_co47,
-                0 as nb_coop_cae,
-                0 as nb_coop_adh,
-                0 as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 AS rev_5y,
-                0 AS rev_5ys,
-                0 AS rev_5ys23,
-                0 AS rev_todo,
-                0 AS rev_total,
-                sum(wrk.amount_dev) as act_dev, 
-                sum(wrk.amount_acc) as act_acc,
-                sum(wrk.amount_rev) as act_rev, 
-                sum(wrk.amount_for) as act_for,
-                sum(wrk.amount_theo) as act_acc_theo
-                FROM
-                (
-                    select
-                    ac.ur_id as ur_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    ac.unit_amount as amount_rev,
-                    0 as amount_dev,
-                    0 as amount_acc,
-                    0 as amount_for,
-                    0 as amount_theo
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'R'
-                union all 
-                    select
-                    ac.ur_id as ur_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    0 as amount_rev,
-                    ac.unit_amount as amount_dev,
-                    0 as amount_acc,
-                    0 as amount_for,
-                    0 as amount_theo 
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'D'
-                union all 
-                    select
-                    ac.ur_id as ur_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    0 as amount_rev,
-                    0 as amount_dev,
-                    ac.unit_amount as amount_acc,
-                    0 as amount_for,
-                    0 as amount_theo 
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'A'
-                union all 
-                    select
-                    ac.ur_id as ur_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    0 as amount_rev,
-                    0 as amount_dev,
-                    0 as amount_acc,
-                    ac.unit_amount as amount_for,
-                    0 as amount_theo   
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'F'
-                union all 
-                    select
-                    pa.ur_id as ur_id,
-                    date_part('year', CURRENT_DATE) as "year",
-                    0 as amount_rev,
-                    0 as amount_dev,
-                    0 as amount_acc,
-                    0 as amount_for,
-                    fo.duree as act_acc_theo   
-                    from 
-                    res_partner as pa
-                    left join scop_followup_format as fo on fo.id = pa.followup_format_id
-                    where pa.membership_status = 'member'
-                ) as wrk
-                group BY
-                wrk.ur_id,
-                wrk.year
-        """        
-        return query
-
-    def init(self):
-        tools.drop_view_if_exists(self.env.cr, self._table)
-        self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
-            %s
-            )""" % (self._table, self._select()))
-
-    # ------------------------------------------------------
-    # Récupère l'ur de l'utilisateur connecté
-    # ------------------------------------------------------
-    @api.model
-    def _compute_current_user_ur_id(self):
-        for partner in self:
-            partner.current_user_ur_id = self.env.user.company_id.ur_id.id
-
-    def _search_current_user_ur_id(self, operator, value):
-        return [('ur_id', '=', self.env.user.company_id.ur_id.id)]
-
-    # ------------------------------------------------------
-    # Calcule les données du graphique
-    # ------------------------------------------------------
-    @api.multi
-    def _compute_graph_values(self):
-        for rec in self:
-            if (rec.dash_type == 1):
-                rec.graph_values = json.dumps([{
-                    'values': [
-                        {'label': 'Information', 'value': rec.nb_prj_info},
-                        {'label': 'Pré-diag', 'value': rec.nb_prj_pdiag},
-                        {'label': 'Accompagnement', 'value': rec.nb_prj_accomp},
-                        {'label': 'Adhésion', 'value': rec.nb_prj_adh},
-                        {'label': 'Soumis CG', 'value': rec.nb_prj_soumis}],
-                    'area': True,
-                    'title': '',
-                    'key': 'Prospects en cours',
-                }])
-
-            if (rec.dash_type == 2):
-                rec.graph_values = json.dumps([{
-                    'values': [
-                        {'label': 'Scop', 'value': rec.nb_fc_scop},
-                        {'label': 'Scic', 'value': rec.nb_fc_scic},
-                        {'label': 'Coop 47', 'value': rec.nb_fc_co47}],
-                    'area': True,
-                    'title': '',
-                    'key': 'Coopératives adhérentes',
-                }])
-
-            if (rec.dash_type == 3):
-                rec.graph_values = json.dumps([{
-                    'values': [
-                         {'label': 'Annuelle', 'value': rec.rev_1y},
-                         {'label': 'Quinquennale', 'value': rec.rev_5y},
-                         {'label': 'Quinq. séq. (annuel)', 'value': rec.rev_5ys},
-                         {'label': 'Quinq. séq. (2 et 3)', 'value': rec.rev_5ys23}
-                         ],
-                     'area': True,
-                       'title': '',
-                       'key': 'Nombre de révisions',
-                }])
-
-            if (rec.dash_type == 4):
-                rec.graph_values = json.dumps([{
-                    'values': [
-                         {'label': 'Développement (hrs)', 'value': rec.act_dev},
-                         {'label': 'Suivi (hrs)', 'value': rec.act_acc},
-                         {'label': 'Révision (hrs)', 'value': rec.act_rev},
-                         {'label': 'Formation (hrs)', 'value': rec.act_for}
-                         ],
-                     'area': True,
-                       'title': '',
-                       'key': "Découpage de l'activité"
-                }])
-
-    # ------------------------------------------------------
-    # Calcul le % de révision réalisé
-    # ------------------------------------------------------
-    @api.multi
-    def _compute_percent_rev(self):
-        for rec in self:
-            if rec.rev_total==0:
-                rec.rev_percent_done = 0
-            else:
-                rec.rev_percent_done = rec.rev_done / rec.rev_total * 100
-
-    # ------------------------------------------------------
-    # Calcul le % d'accompagnement réalisé
-    # ------------------------------------------------------
-    @api.multi
-    def _compute_act_acc(self):
-        for rec in self:
-            if rec.act_acc_theo==0:
-                rec.act_acc_percent_done = 0
-            else:
-                rec.act_acc_percent_done = rec.act_acc / rec.act_acc_theo * 100
-
-    # ------------------------------------------------------
-    # Affichage des projets de l'ur
-    # ------------------------------------------------------
-    def show_projets(self):
-        return {
-            'name': "Prospects" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'view_type': 'form',
-            'view_mode': 'kanban,tree,form',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_kanban').id, 'kanban'), 
-                (self.env.ref('cgscop_partner.view_partner_prospect_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                      ('is_cooperative', '=', True),
-                      ('project_status','in',('1_information','2_pre-diagnostic','3_accompagnement','4_adhesion','5_cg','7_abandonne')),
-                      ('current_user_ur_id', '=', 'ur_id')],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'default_project_status': '1_information'
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage de tous les projets
-    # ------------------------------------------------------
-    def show_all_projets(self):
-        return {
-            'name': "Tous les Prospects" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'view_type': 'form',
-            'view_mode': 'kanban,tree,form',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_kanban').id, 'kanban'), 
-                (self.env.ref('cgscop_partner.view_partner_prospect_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                ('is_cooperative', '=', True),
-                ('project_status', 'in', ('1_information','2_pre-diagnostic','3_accompagnement','4_adhesion','5_cg','7_abandonne'))],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'default_project_status': '1_information'
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage des coop adh de l'ur
-    # ------------------------------------------------------
-    def show_coop(self):
-        return {
-            'name': "Coopératives adhérentes" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'search_view_id': (self.env.ref('cgscop_partner.scop_partner_view_search').id,),
-            'view_type': 'form',
-            'view_mode': 'tree,form',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                ('is_cooperative', '=', True),
-                ('membership_status', '=', 'member'),
-                ('current_user_ur_id', '=', 'ur_id')],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'create': False,
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage de toutes les coop adh
-    # ------------------------------------------------------
-    def show_all_coop(self):
-        return {
-            'name': "Toutes les coopératives adhérentes",
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'search_view_id': (self.env.ref('cgscop_partner.scop_partner_view_search').id,),
-            'view_type': 'form',
-            'view_mode': 'tree,form',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                ('is_cooperative', '=', True),
-                ('membership_status', '=', 'member')],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'create': False,
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage des coop à réviser
-    # ------------------------------------------------------
-    def show_rev(self):
-
-        wyear = datetime.datetime.today().year
-
-        return {
-            'name': "Coopérative à réviser" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'view_type': 'form',
-            'view_mode': 'tree',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                ('is_cooperative', '=', True),
-                ('membership_status', '=', 'member'),
-                ('current_user_ur_id', '=', 'ur_id'),
-                ('revision_next_year', '=', wyear)],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'create': False,
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage des coop à suivre
-    # ------------------------------------------------------
-    def show_acc(self):
-
-        wyear = datetime.datetime.today().year
-
-        return {
-            'name': "Coopérative à suivre" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'search_view_id': (self.env.ref('cgscop_partner.scop_partner_view_search').id,),
-            'view_type': 'form',
-            'view_mode': 'tree',
-            'views': [
-                (self.env.ref('cgscop_partner_crm.scop_partner_crm_view_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                ('is_cooperative', '=', True),
-                ('membership_status', '=', 'member'),
-                ('current_user_ur_id', '=', 'ur_id')],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'create': False,
-            },
-        }
\ No newline at end of file
diff --git a/models/__init__.py b/report/__init__.py
similarity index 79%
rename from models/__init__.py
rename to report/__init__.py
index 9dd51d0..69a8959 100644
--- a/models/__init__.py
+++ b/report/__init__.py
@@ -1,6 +1,6 @@
-# © 2020 Le Filament (<http://www.le-filament.com>)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-
-from . import partner_dashboard_ur
-from . import partner_dashboard_dlg
\ No newline at end of file
+# © 2020 Le Filament (<http://www.le-filament.com>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+
+from . import partner_dashboard_ur
+from . import partner_dashboard_dlg
diff --git a/models/partner_dashboard_dlg.py b/report/partner_dashboard_dlg.py
similarity index 50%
rename from models/partner_dashboard_dlg.py
rename to report/partner_dashboard_dlg.py
index 1e0261a..d1254ff 100644
--- a/models/partner_dashboard_dlg.py
+++ b/report/partner_dashboard_dlg.py
@@ -1,572 +1,697 @@
-# © 2020 Le Filament (<http://www.le-filament.com>)
-# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
-
-import json
-
-from odoo import fields, models, api, tools, exceptions
-import datetime
-
-
-class ScopPartnerDashboardDlg(models.Model):
-    _name = 'scop.partner.dashboard.dlg'
-    _description = 'Dashboard coopératives délégués'
-    _order = 'dash_type asc'
-    _auto = False
-
-    # Vue
-    dlg_id = fields.Many2one('res.users', string='Délégué')
-    name = fields.Char()
-    dash_type = fields.Integer("Type de dashboard")
-
-    nb_prj_info = fields.Integer("Information")
-    nb_prj_pdiag = fields.Integer("Pre-diag")
-    nb_prj_accomp = fields.Integer("Accompagnement")
-    nb_prj_adh = fields.Integer("Adhésion")
-    nb_prj_soumis = fields.Integer("Soumis")
-    nb_prj_tot = fields.Integer("Projets en cours")
-
-    nb_fc_scop = fields.Integer("Nombre de scop")
-    nb_fc_scic = fields.Integer("Nombre de scic")
-    nb_fc_co47 = fields.Integer("Nombre de coop 47")
-    nb_coop_cae = fields.Integer("Nombre de CAE")
-    nb_coop_adh = fields.Integer("Nombre d'adhésion pour l'année")
-    nb_coop_tot = fields.Integer("Total coop adhérentes")
-
-    rev_todo = fields.Integer("A réviser")
-    rev_done = fields.Integer("Révisées")
-    rev_total = fields.Integer("Total révisions")
-    rev_1y = fields.Integer("Annuelle")
-    rev_5y = fields.Integer("Quinquennale")
-    rev_5ys = fields.Integer("Quinquennale séquencée (annuel)")
-    rev_5ys23 = fields.Integer("Quinquennale séquencée (2 ans et 3 ans)")
-    rev_percent_done = fields.Float(
-        "Réalisés",
-        compute="_compute_percent_rev")
-
-    act_dev = fields.Integer("Développement (hrs)")
-    act_acc = fields.Integer("Accompagnement (hrs)")
-    act_rev = fields.Integer("Révision (hrs)")
-    act_for = fields.Integer("Formation (hrs)")
-    act_acc_theo = fields.Integer("Acc. théorique (hrs)")
-
-    act_dev = fields.Integer("Développement (hrs)")
-    act_acc = fields.Integer("Suivi (hrs)")
-    act_rev = fields.Integer("Révision (hrs)")
-    act_for = fields.Integer("Formation (hrs)")
-    act_acc_theo = fields.Integer("Acc. théorique (hrs)")
-    act_acc_percent_done = fields.Float(
-        "Réalisés",
-        compute="_compute_act_acc")
-
-    graph_values = fields.Text(compute="_compute_graph_values")
-
-    # ------------------------------------------------------
-    # Construction de la requete 
-    # ------------------------------------------------------
-    @api.model
-    def _select(self):
-       
-        # On constitue les requetes
-        qy_projet = self._select_projet()
-        qy_coop = self._select_coop()
-        qy_rev = self._select_rev()
-        qy_act = self._select_act()
-        
-        qy = qy_projet + " UNION ALL " + qy_coop + " UNION ALL " + qy_rev + " UNION ALL " + qy_act
-
-        return qy
-
-    # ------------------------------------------------------
-    # Dashboard projets
-    # ------------------------------------------------------
-    @api.model
-    def _select_projet(self):      
-        query = """
-                SELECT
-                CONCAT('1', org.creation_delegate_id) AS id,
-                org.creation_delegate_id as dlg_id,
-                'Prospects en cours' AS name,
-                '1' as dash_type,
-                SUM(case when substring(org.project_status,1,1) = '1' then 1 else 0 end) AS nb_prj_info,
-                SUM(case when substring(org.project_status,1,1) = '2' then 1 else 0 end) AS nb_prj_pdiag,
-                SUM(case when substring(org.project_status,1,1) = '3' then 1 else 0 end) AS nb_prj_accomp,
-                SUM(case when substring(org.project_status,1,1) = '4' then 1 else 0 end) AS nb_prj_adh,
-                SUM(case when substring(org.project_status,1,1) = '5' then 1 else 0 end) AS nb_prj_soumis,
-                count(org.id) as nb_prj_tot,
-                0 as nb_fc_scop,
-                0 as nb_fc_scic,
-                0 as nb_fc_co47,
-                0 as nb_coop_cae,
-                0 as nb_coop_adh,
-                0 as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 as rev_5y,
-                0 as rev_5ys,
-                0 as rev_5ys23,
-                0 as rev_todo,
-                0 as rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM res_partner org
-                where 
-                (org.active=TRUE) and
-                (org.is_cooperative = TRUE)and
-                substring(org.project_status,1,1) in ('1','2','3','4','5')  
-                group by
-                org.creation_delegate_id
-        """        
-        return query
-
-    # ------------------------------------------------------
-    # Dashboard cooperative
-    # ------------------------------------------------------
-    @api.model
-    def _select_coop(self,):  
-
-        try:
-            form_scop = self.env.ref('cgscop_partner.form_scop').id
-        except:
-            form_scop = 0
-        try:
-            form_scic = self.env.ref('cgscop_partner.form_scic').id
-        except:
-            form_scic = 0
-        try:
-            form_co47 = self.env.ref('cgscop_partner.form_coop47').id
-        except:
-            form_co47 = 0
-
-        query = """
-                SELECT
-                CONCAT('2', org.followup_delegate_id) AS id,
-                org.followup_delegate_id as dlg_id,
-                'Coopératives suivies' AS name,
-                '2' as dash_type,
-                0 as nb_prj_info,
-                0 as nb_prj_pdiag,
-                0 as nb_prj_accomp,
-                0 as nb_prj_adh,
-                0 as nb_prj_soumis,
-                0 as nb_prj_tot,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_scop,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_scic,
-                SUM(case when org.cooperative_form_id = %d then 1 else 0 end) AS nb_fc_co47,
-                SUM(case when org.cae is true then 1 else 0 end) AS nb_coop_cae,
-                SUM(case when date_part('year', adh.start) = date_part('year', CURRENT_DATE) then 1 else 0 end) AS nb_coop_adh,
-                count(org.id) as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 as rev_5y,
-                0 as rev_5ys,
-                0 as rev_5ys23,
-                0 as rev_todo,
-                0 as rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM res_partner org
-                left join scop_membership_period as adh
-                    on adh.partner_id = org.id
-                    and adh.start=(select max(start) from scop_membership_period where partner_id=org.id and type_id=1)
-                    and type_id=1
-                where 
-                (org.active=TRUE) and
-                (org.is_cooperative = TRUE) and
-                (org.membership_status = 'member')
-                group by
-                org.followup_delegate_id
-                """ % (form_scop,form_scic,form_co47)
-
-        return query
-
-    # ------------------------------------------------------
-    # Dashboard revision
-    # ------------------------------------------------------
-    @api.model
-    def _select_rev(self):  
-
-        query = """
-                SELECT
-                id,
-                dlg_id,
-                CONCAT('Révisions année ',date_part('year', CURRENT_DATE)) AS name,
-                '3' as dash_type,
-                0 as nb_prj_info,
-                0 as nb_prj_pdiag,
-                0 as nb_prj_accomp,
-                0 as nb_prj_adh,
-                0 as nb_prj_soumis,
-                0 as nb_prj_tot,
-                0 as nb_fc_scop,
-                0 as nb_fc_scic,
-                0 as nb_fc_co47,
-                0 as nb_coop_cae,
-                0 as nb_coop_adh,
-                0 as nb_coop_tot,
-                SUM(wrev.rev_done) as rev_done,
-                SUM(wrev.rev_1y) AS rev_1y,
-                SUM(wrev.rev_5y) AS rev_5y,
-                SUM(wRev.rev_5ys) AS rev_5ys,
-                SUM(wrev.rev_5ys23) AS rev_5ys23,
-                SUM(wrev.rev_1y) + SUM(wrev.rev_5y) + SUM(wRev.rev_5ys) + SUM(wrev.rev_5ys23) AS rev_todo,
-                SUM(wrev.rev_done) + SUM(wrev.rev_1y) + SUM(wrev.rev_5y) + SUM(wRev.rev_5ys) + SUM(wrev.rev_5ys23) AS rev_total,
-                0 as act_dev, 
-                0 as act_acc,
-                0 as act_rev, 
-                0 as act_for,
-                0 as act_acc_theo
-                FROM
-                (
-                    SELECT  
-                    CONCAT(org.revision_person_id, org.revision_next_year) AS id,
-                    org.revision_person_id as dlg_id,
-                    0 AS rev_done,
-                    case when org.revision_type = '1y' then 1 else 0 end AS rev_1y,
-                    case when org.revision_type = '5y' then 1 else 0 end AS rev_5y,
-                    case when org.revision_type = '5ys' then 1 else 0 end AS rev_5ys,
-                    case when org.revision_type = '5ys23' then 1 else 0 end AS rev_5ys23
-                    FROM res_partner as org
-                    WHERE (org.revision_next_year = date_part('year', CURRENT_DATE))
-                UNION ALL
-                    SELECT 
-                    CONCAT(org.revision_person_id, date_part('year', rev.date)) as id, 
-                    org.revision_person_id as dlg_id,
-                    1 AS rev_done,
-                    0 AS rev_1y,
-                    0 AS rev_5y,
-                    0 AS rev_5ys,
-                    0 AS rev_5ys23
-                    FROM scop_revision as rev
-                    JOIN res_partner as org ON (org.id = rev.partner_id)
-                    WHERE (date_part('year', rev.date) = date_part('year', CURRENT_DATE))
-                ) AS wRev
-                GROUP BY wrev.id, wrev.dlg_id
-        """        
-        return query
-
-    # ------------------------------------------------------
-    # Dashboard activité
-    # ------------------------------------------------------
-    @api.model
-    def _select_act(self):  
-
-        query = """
-                SELECT
-                CONCAT('4', wrk.dlg_id) as id,
-                dlg_id,
-                CONCAT('Activité année ',date_part('year', CURRENT_DATE)) AS name,
-                '4' as dash_type,
-                0 as nb_prj_info,
-                0 as nb_prj_pdiag,
-                0 as nb_prj_accomp,
-                0 as nb_prj_adh,
-                0 as nb_prj_soumis,
-                0 as nb_prj_tot,
-                0 as nb_fc_scop,
-                0 as nb_fc_scic,
-                0 as nb_fc_co47,
-                0 as nb_coop_cae,
-                0 as nb_coop_adh,
-                0 as nb_coop_tot,
-                0 as rev_done,
-                0 as rev_1y,
-                0 AS rev_5y,
-                0 AS rev_5ys,
-                0 AS rev_5ys23,
-                0 AS rev_todo,
-                0 AS rev_total,
-                sum(wrk.amount_dev) as act_dev, 
-                sum(wrk.amount_acc) as act_acc,
-                sum(wrk.amount_rev) as act_rev, 
-                sum(wrk.amount_for) as act_for,
-                sum(wrk.amount_theo) as act_acc_theo
-                FROM
-                (
-                    select
-                    ac.user_id as dlg_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    ac.unit_amount as amount_rev,
-                    0 as amount_dev,
-                    0 as amount_acc,
-                    0 as amount_for,
-                    0 as amount_theo
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'R'
-                union all 
-                    select
-                    ac.user_id as dlg_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    0 as amount_rev,
-                    ac.unit_amount as amount_dev,
-                    0 as amount_acc,
-                    0 as amount_for,
-                    0 as amount_theo 
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'D'
-                union all 
-                    select
-                    ac.user_id as dlg_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    0 as amount_rev,
-                    0 as amount_dev,
-                    ac.unit_amount as amount_acc,
-                    0 as amount_for,
-                    0 as amount_theo 
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'A'
-                union all 
-                    select
-                    ac.user_id as dlg_id,
-                    EXTRACT(YEAR FROM ac.date) as "year",
-                    0 as amount_rev,
-                    0 as amount_dev,
-                    0 as amount_acc,
-                    ac.unit_amount as amount_for,
-                    0 as amount_theo   
-                    from 
-                    account_analytic_line as ac
-                    left join project_project as pu on pu.id = ac.project_id
-                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
-                    where
-                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
-                    and pn.domain = 'F'
-                union all 
-                    select
-                    pa.followup_delegate_id as dlg_id,
-                    date_part('year', CURRENT_DATE) as "year",
-                    0 as amount_rev,
-                    0 as amount_dev,
-                    0 as amount_acc,
-                    0 as amount_for,
-                    fo.duree as act_acc_theo   
-                    from 
-                    res_partner as pa
-                    left join scop_followup_format as fo on fo.id = pa.followup_format_id
-                    where pa.membership_status = 'member'
-                ) as wrk
-                group BY
-                wrk.dlg_id,
-                wrk.year
-        """        
-        return query
-
-    def init(self):
-        tools.drop_view_if_exists(self.env.cr, self._table)
-        self.env.cr.execute("""CREATE or REPLACE VIEW %s as (
-            %s
-            )""" % (self._table, self._select()))
-
-    # ------------------------------------------------------
-    # Calcule les données du graphique
-    # ------------------------------------------------------
-    @api.multi
-    def _compute_graph_values(self):
-        for rec in self:
-
-            if (rec.dash_type == 1):
-                rec.graph_values = json.dumps([{
-                    'values': [
-                            {'label': 'Information', 'value': rec.nb_prj_info},
-                            {'label': 'Pré-diag', 'value': rec.nb_prj_pdiag},
-                            {'label': 'Accompagnement', 'value': rec.nb_prj_accomp},
-                            {'label': 'Adhésion', 'value': rec.nb_prj_adh},
-                            {'label': 'Soumis CG', 'value': rec.nb_prj_soumis}
-                              ],
-                        'area': True,
-                        'title': '',
-                        'key': 'Prospects en cours',
-                }])
-
-            if (rec.dash_type == 2):
-                rec.graph_values = json.dumps([{
-                    'values': [
-                            {'label': 'Scop', 'value': rec.nb_fc_scop},
-                            {'label': 'Scic', 'value': rec.nb_fc_scic},
-                            {'label': 'Coop 47', 'value': rec.nb_fc_co47}
-                             ],
-                        'area': True,
-                        'title': '',
-                        'key': 'Coopératives adhérentes',
-                }])
-
-            if (rec.dash_type == 3):
-                rec.graph_values = json.dumps([{
-                'values': [
-                         {'label': 'Annuelle', 'value': rec.rev_1y},
-                         {'label': 'Quinquennale', 'value': rec.rev_5y},
-                         {'label': 'Quinq. séq. (annuel)', 'value': rec.rev_5ys},
-                         {'label': 'Quinq. séq. (2 et 3)', 'value': rec.rev_5ys23}
-                         ],
-                     'area': True,
-                       'title': '',
-                       'key': 'Nombre de révisions',
-                }])
-
-            if (rec.dash_type == 4):
-                rec.graph_values = json.dumps([{
-                    'values': [
-                         {'label': 'Développement (hrs)', 'value': rec.act_dev},
-                         {'label': 'Suivi (hrs)', 'value': rec.act_acc},
-                         {'label': 'Révision (hrs)', 'value': rec.act_rev},
-                         {'label': 'Formation (hrs)', 'value': rec.act_for}
-                         ],
-                     'area': True,
-                       'title': '',
-                       'key': "Découpage de l'activité"
-                }])
-
-    # ------------------------------------------------------
-    # Calcul le % de révision réalisé
-    # ------------------------------------------------------
-    @api.multi
-    def _compute_percent_rev(self):
-        for rec in self:
-            if rec.rev_total==0:
-                rec.rev_percent_done = 0
-            else:
-                rec.rev_percent_done = rec.rev_done / rec.rev_total * 100
-
-    # ------------------------------------------------------
-    # Calcul le % d'accompagnement réalisé
-    # ------------------------------------------------------
-    @api.multi
-    def _compute_act_acc(self):
-        for rec in self:
-            if rec.act_acc_theo==0:
-                rec.act_acc_percent_done = 0
-            else:
-                rec.act_acc_percent_done = rec.act_acc / rec.act_acc_theo * 100
-
-    # ------------------------------------------------------
-    # Affichage des projets 
-    # ------------------------------------------------------
-    def show_projets(self):
-        return {
-            'name': "Prospects" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'view_type': 'form',
-            'view_mode': 'kanban,tree,form,activity',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_kanban').id, 'kanban'), 
-                (self.env.ref('cgscop_partner.view_partner_prospect_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                      ('is_cooperative', '=', True),
-                      ('project_status','in',('1_information','2_pre-diagnostic','3_accompagnement','4_adhesion','5_cg','7_abandonne')),
-                      ('creation_delegate_id', '=', self.env.user.id)],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'default_project_status': '1_information'
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage des coop adh 
-    # ------------------------------------------------------
-    def show_coop(self):
-        return {
-            'name': "Coopératives adhérentes" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'search_view_id' : self.env.ref('cgscop_partner.scop_partner_view_search').id,
-            'view_type': 'form',
-            'view_mode': 'tree,form,activity',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                      ('is_cooperative', '=', True),
-                      ('membership_status', '=', 'member'),
-                      ('followup_delegate_id', '=', self.env.user.id)],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'create': False,
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage des coop à réviser
-    # ------------------------------------------------------
-    def show_rev(self):
-
-        wyear = datetime.datetime.today().year
-
-        return {
-            'name': "Coopérative à réviser" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'view_type': 'form',
-            'view_mode': 'tree,form,activity',
-            'views': [
-                (self.env.ref('cgscop_partner.view_partner_cooperative_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                      ('is_cooperative', '=', True),
-                      ('membership_status', '=', 'member'),
-                      ('revision_person_id', '=', self.env.user.id),
-                      ('revision_next_year', '=', wyear)
-                      ],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'create': False,
-            },
-        }
-
-    # ------------------------------------------------------
-    # Affichage des coop à suivre
-    # ------------------------------------------------------
-    def show_acc(self):
-
-        return {
-            'name': "Coopérative à suivre" ,
-            'type': 'ir.actions.act_window',
-            'res_model': 'res.partner',
-            'search_view_id': (self.env.ref('cgscop_partner.scop_partner_view_search').id,),
-            'view_type': 'form',
-            'view_mode': 'tree,form,activity',
-            'views': [
-                (self.env.ref('cgscop_partner_crm.scop_partner_crm_view_tree').id, 'tree'), 
-                (self.env.ref('cgscop_partner.scop_contact_view_form').id, 'form')],
-            'target': 'current',
-            'domain': [
-                ('is_cooperative', '=', True),
-                ('membership_status', '=', 'member'),
-                ('followup_delegate_id', '=', self.env.user.id)],
-            'context': {
-                'default_is_company': True,
-                'default_is_cooperative': True,
-                'default_company_type': 'company',
-                'create': False,
-            },
-        }
\ No newline at end of file
+# © 2020 Le Filament (<https://www.le-filament.com>)
+# © 2020 Confédération Générale des Scop (<https://www.les-scop.coop>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import datetime
+import json
+
+from psycopg2.extensions import AsIs
+
+from odoo import api, fields, models, tools
+
+
+class ScopPartnerDashboardDlg(models.Model):
+    _name = "scop.partner.dashboard.dlg"
+    _description = "Dashboard coopératives délégués"
+    _order = "dash_type asc"
+    _auto = False
+
+    # Vue
+    dlg_id = fields.Many2one("res.users", string="Délégué")
+    name = fields.Char()
+    dash_type = fields.Integer("Type de dashboard")
+
+    nb_prj_info = fields.Integer("Information")
+    nb_prj_pdiag = fields.Integer("Pre-diag")
+    nb_prj_accomp = fields.Integer("Accompagnement")
+    nb_prj_adh = fields.Integer("Adhésion")
+    nb_prj_soumis = fields.Integer("Soumis")
+    nb_prj_tot = fields.Integer("Projets en cours")
+
+    nb_fc_scop = fields.Integer("Nombre de scop")
+    nb_fc_scic = fields.Integer("Nombre de scic")
+    nb_fc_co47 = fields.Integer("Nombre de coop 47")
+    nb_coop_cae = fields.Integer("Nombre de CAE")
+    nb_coop_adh = fields.Integer("Nombre d'adhésion pour l'année")
+    nb_coop_tot = fields.Integer("Total coop adhérentes")
+
+    rev_todo = fields.Integer("A réviser")
+    rev_done = fields.Integer("Révisées")
+    rev_total = fields.Integer("Total révisions")
+    rev_1y = fields.Integer("Annuelle")
+    rev_5y = fields.Integer("Quinquennale")
+    rev_5ys = fields.Integer("Quinquennale séquencée (annuel)")
+    rev_5ys23 = fields.Integer("Quinquennale séquencée (2 ans et 3 ans)")
+    rev_percent_done = fields.Float("Réalisés", compute="_compute_percent_rev")
+
+    act_dev = fields.Integer("Développement (hrs)")
+    act_acc = fields.Integer("Accompagnement (hrs)")
+    act_rev = fields.Integer("Révision (hrs)")
+    act_for = fields.Integer("Formation (hrs)")
+    act_acc_theo = fields.Integer("Acc. théorique (hrs)")
+
+    act_dev = fields.Integer("Développement (hrs)")
+    act_acc = fields.Integer("Suivi (hrs)")
+    act_rev = fields.Integer("Révision (hrs)")
+    act_for = fields.Integer("Formation (hrs)")
+    act_acc_theo = fields.Integer("Acc. théorique (hrs)")
+    act_acc_percent_done = fields.Float("Réalisés", compute="_compute_act_acc")
+
+    graph_values = fields.Text(compute="_compute_graph_values")
+
+    # ------------------------------------------------------
+    # Construction de la requete
+    # ------------------------------------------------------
+    @api.model
+    def _select(self):
+
+        # On constitue les requetes
+        qy_projet = self._select_projet()
+        qy_coop = self._select_coop()
+        qy_rev = self._select_rev()
+        qy_act = self._select_act()
+
+        qy = (
+            qy_projet
+            + " UNION ALL "
+            + qy_coop
+            + " UNION ALL "
+            + qy_rev
+            + " UNION ALL "
+            + qy_act
+        )
+
+        return qy
+
+    # ------------------------------------------------------
+    # Dashboard projets
+    # ------------------------------------------------------
+    @api.model
+    def _select_projet(self):
+        query = """
+            SELECT
+                CONCAT('1', org.creation_delegate_id) AS id,
+                org.creation_delegate_id as dlg_id,
+                'Prospects en cours' AS name,
+                '1' as dash_type,
+                SUM(case
+                    when substring(org.project_status,1,1) = '1' then 1
+                    else 0 end) AS nb_prj_info,
+                SUM(case
+                    when substring(org.project_status,1,1) = '2' then 1
+                    else 0 end) AS nb_prj_pdiag,
+                SUM(case
+                    when substring(org.project_status,1,1) = '3' then 1
+                    else 0 end) AS nb_prj_accomp,
+                SUM(case
+                    when substring(org.project_status,1,1) = '4' then 1
+                    else 0 end) AS nb_prj_adh,
+                SUM(case
+                    when substring(org.project_status,1,1) = '5' then 1
+                    else 0 end) AS nb_prj_soumis,
+                count(org.id) as nb_prj_tot,
+                0 as nb_fc_scop,
+                0 as nb_fc_scic,
+                0 as nb_fc_co47,
+                0 as nb_coop_cae,
+                0 as nb_coop_adh,
+                0 as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 as rev_5y,
+                0 as rev_5ys,
+                0 as rev_5ys23,
+                0 as rev_todo,
+                0 as rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+            FROM
+                res_partner org
+            WHERE
+                (org.active=TRUE) and
+                (org.is_cooperative = TRUE)and
+                substring(org.project_status,1,1) in ('1','2','3','4','5')
+            GROUP BY
+                org.creation_delegate_id
+        """
+        return query
+
+    # ------------------------------------------------------
+    # Dashboard cooperative
+    # ------------------------------------------------------
+    @api.model
+    def _select_coop(self):
+        try:
+            form_scop = self.env.ref("cgscop_partner.form_scop").id
+        except Exception:
+            form_scop = 0
+        try:
+            form_scic = self.env.ref("cgscop_partner.form_scic").id
+
+        except Exception:
+            form_scic = 0
+        try:
+            form_co47 = self.env.ref("cgscop_partner.form_coop47").id
+        except Exception:
+            form_co47 = 0
+
+        query = """
+            SELECT
+                CONCAT('2', org.followup_delegate_id) AS id,
+                org.followup_delegate_id as dlg_id,
+                'Coopératives suivies' AS name,
+                '2' as dash_type,
+                0 as nb_prj_info,
+                0 as nb_prj_pdiag,
+                0 as nb_prj_accomp,
+                0 as nb_prj_adh,
+                0 as nb_prj_soumis,
+                0 as nb_prj_tot,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_scop,
+                SUM(case when
+                    org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_scic,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_co47,
+                SUM(case
+                    when org.cae is true then 1
+                    else 0 end) AS nb_coop_cae,
+                SUM(case
+                    when date_part('year', adh.start) = date_part('year', CURRENT_DATE) then 1
+                    else 0 end) AS nb_coop_adh,
+                count(org.id) as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 as rev_5y,
+                0 as rev_5ys,
+                0 as rev_5ys23,
+                0 as rev_todo,
+                0 as rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+            FROM res_partner org
+            LEFT JOIN
+                scop_membership_period as adh on adh.partner_id = org.id
+                and adh.start=(select max(start)
+                from scop_membership_period where partner_id=org.id and type_id=1)
+                and type_id=1
+            WHERE
+                (org.active=TRUE) and
+                (org.is_cooperative = TRUE) and
+                (org.membership_status = 'member')
+            GROUP BY
+                org.followup_delegate_id
+            """ % (
+            form_scop,
+            form_scic,
+            form_co47,
+        )
+
+        return query
+
+    # ------------------------------------------------------
+    # Dashboard revision
+    # ------------------------------------------------------
+    @api.model
+    def _select_rev(self):
+
+        query = """
+            SELECT
+                id,
+                dlg_id,
+                CONCAT('Révisions année ',date_part('year', CURRENT_DATE)) AS name,
+                '3' as dash_type,
+                0 as nb_prj_info,
+                0 as nb_prj_pdiag,
+                0 as nb_prj_accomp,
+                0 as nb_prj_adh,
+                0 as nb_prj_soumis,
+                0 as nb_prj_tot,
+                0 as nb_fc_scop,
+                0 as nb_fc_scic,
+                0 as nb_fc_co47,
+                0 as nb_coop_cae,
+                0 as nb_coop_adh,
+                0 as nb_coop_tot,
+                SUM(wrev.rev_done) as rev_done,
+                SUM(wrev.rev_1y) AS rev_1y,
+                SUM(wrev.rev_5y) AS rev_5y,
+                SUM(wRev.rev_5ys) AS rev_5ys,
+                SUM(wrev.rev_5ys23) AS rev_5ys23,
+                (SUM(wrev.rev_1y) + SUM(wrev.rev_5y) + SUM(wRev.rev_5ys) +
+                 SUM(wrev.rev_5ys23)) AS rev_todo,
+                SUM(wrev.rev_done) + SUM(wrev.rev_1y) + SUM(wrev.rev_5y) +
+                SUM(wRev.rev_5ys) + SUM(wrev.rev_5ys23) AS rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+                FROM
+                (
+                    SELECT
+                    CONCAT(org.revision_person_id, org.revision_next_year) AS id,
+                    org.revision_person_id as dlg_id,
+                    0 AS rev_done,
+                    case when org.revision_type = '1y' then 1 else 0 end AS rev_1y,
+                    case when org.revision_type = '5y' then 1 else 0 end AS rev_5y,
+                    case when org.revision_type = '5ys' then 1 else 0 end AS rev_5ys,
+                    case when org.revision_type = '5ys23' then 1 else 0 end AS rev_5ys23
+                    FROM res_partner as org
+                    WHERE (org.revision_next_year = date_part('year', CURRENT_DATE))
+                UNION ALL
+                    SELECT
+                    CONCAT(org.revision_person_id, date_part('year', rev.date)) as id,
+                    org.revision_person_id as dlg_id,
+                    1 AS rev_done,
+                    0 AS rev_1y,
+                    0 AS rev_5y,
+                    0 AS rev_5ys,
+                    0 AS rev_5ys23
+                    FROM scop_revision as rev
+                    JOIN res_partner as org ON (org.id = rev.partner_id)
+                    WHERE (date_part('year', rev.date) = date_part('year', CURRENT_DATE))
+                ) AS wRev
+                GROUP BY wrev.id, wrev.dlg_id
+        """
+        return query
+
+    # ------------------------------------------------------
+    # Dashboard activité
+    # ------------------------------------------------------
+    @api.model
+    def _select_act(self):
+
+        query = """
+                SELECT
+                CONCAT('4', wrk.dlg_id) as id,
+                dlg_id,
+                CONCAT('Activité année ',date_part('year', CURRENT_DATE)) AS name,
+                '4' as dash_type,
+                0 as nb_prj_info,
+                0 as nb_prj_pdiag,
+                0 as nb_prj_accomp,
+                0 as nb_prj_adh,
+                0 as nb_prj_soumis,
+                0 as nb_prj_tot,
+                0 as nb_fc_scop,
+                0 as nb_fc_scic,
+                0 as nb_fc_co47,
+                0 as nb_coop_cae,
+                0 as nb_coop_adh,
+                0 as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 AS rev_5y,
+                0 AS rev_5ys,
+                0 AS rev_5ys23,
+                0 AS rev_todo,
+                0 AS rev_total,
+                sum(wrk.amount_dev) as act_dev,
+                sum(wrk.amount_acc) as act_acc,
+                sum(wrk.amount_rev) as act_rev,
+                sum(wrk.amount_for) as act_for,
+                sum(wrk.amount_theo) as act_acc_theo
+                FROM
+                (
+                    select
+                    ac.user_id as dlg_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    ac.unit_amount as amount_rev,
+                    0 as amount_dev,
+                    0 as amount_acc,
+                    0 as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'R'
+                union all
+                    select
+                    ac.user_id as dlg_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    0 as amount_rev,
+                    ac.unit_amount as amount_dev,
+                    0 as amount_acc,
+                    0 as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'D'
+                union all
+                    select
+                    ac.user_id as dlg_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    0 as amount_rev,
+                    0 as amount_dev,
+                    ac.unit_amount as amount_acc,
+                    0 as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'A'
+                union all
+                    select
+                    ac.user_id as dlg_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    0 as amount_rev,
+                    0 as amount_dev,
+                    0 as amount_acc,
+                    ac.unit_amount as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'F'
+                union all
+                    select
+                    pa.followup_delegate_id as dlg_id,
+                    date_part('year', CURRENT_DATE) as "year",
+                    0 as amount_rev,
+                    0 as amount_dev,
+                    0 as amount_acc,
+                    0 as amount_for,
+                    fo.duree as act_acc_theo
+                    from
+                    res_partner as pa
+                    left join scop_followup_format as fo on fo.id = pa.followup_format_id
+                    where pa.membership_status = 'member'
+                ) as wrk
+                group BY
+                wrk.dlg_id,
+                wrk.year
+        """
+        return query
+
+    def init(self):
+        tools.drop_view_if_exists(self.env.cr, self._table)
+        self.env.cr.execute(
+            "CREATE or REPLACE VIEW %s as (%s)",
+            (AsIs(self._table), AsIs(self._select())),
+        )
+
+    # ------------------------------------------------------
+    # Calcule les données du graphique
+    # ------------------------------------------------------
+    def _compute_graph_values(self):
+        for rec in self:
+
+            if rec.dash_type == 1:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {
+                                    "label": "Information",
+                                    "value": rec.nb_prj_info,
+                                },
+                                {
+                                    "label": "Pré-diag",
+                                    "value": rec.nb_prj_pdiag,
+                                },
+                                {
+                                    "label": "Accompagnement",
+                                    "value": rec.nb_prj_accomp,
+                                },
+                                {"label": "Adhésion", "value": rec.nb_prj_adh},
+                                {
+                                    "label": "Soumis CG",
+                                    "value": rec.nb_prj_soumis,
+                                },
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Prospects en cours",
+                        }
+                    ]
+                )
+
+            if rec.dash_type == 2:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {"label": "Scop", "value": rec.nb_fc_scop},
+                                {"label": "Scic", "value": rec.nb_fc_scic},
+                                {"label": "Coop 47", "value": rec.nb_fc_co47},
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Coopératives adhérentes",
+                        }
+                    ]
+                )
+
+            if rec.dash_type == 3:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {"label": "Annuelle", "value": rec.rev_1y},
+                                {"label": "Quinquennale", "value": rec.rev_5y},
+                                {
+                                    "label": "Quinq. séq. (annuel)",
+                                    "value": rec.rev_5ys,
+                                },
+                                {
+                                    "label": "Quinq. séq. (2 et 3)",
+                                    "value": rec.rev_5ys23,
+                                },
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Nombre de révisions",
+                        }
+                    ]
+                )
+
+            if rec.dash_type == 4:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {
+                                    "label": "Développement (hrs)",
+                                    "value": rec.act_dev,
+                                },
+                                {"label": "Suivi (hrs)", "value": rec.act_acc},
+                                {
+                                    "label": "Révision (hrs)",
+                                    "value": rec.act_rev,
+                                },
+                                {
+                                    "label": "Formation (hrs)",
+                                    "value": rec.act_for,
+                                },
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Découpage de l'activité",
+                        }
+                    ]
+                )
+
+    # ------------------------------------------------------
+    # Calcul le % de révision réalisé
+    # ------------------------------------------------------
+    def _compute_percent_rev(self):
+        for rec in self:
+            if rec.rev_total == 0:
+                rec.rev_percent_done = 0
+            else:
+                rec.rev_percent_done = rec.rev_done / rec.rev_total * 100
+
+    # ------------------------------------------------------
+    # Calcul le % d'accompagnement réalisé
+    # ------------------------------------------------------
+    def _compute_act_acc(self):
+        for rec in self:
+            if rec.act_acc_theo == 0:
+                rec.act_acc_percent_done = 0
+            else:
+                rec.act_acc_percent_done = rec.act_acc / rec.act_acc_theo * 100
+
+    # ------------------------------------------------------
+    # Affichage des projets
+    # ------------------------------------------------------
+    def show_projets(self):
+        return {
+            "name": "Prospects",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "view_type": "form",
+            "view_mode": "kanban,tree,form,activity",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_kanban").id,
+                    "kanban",
+                ),
+                (
+                    self.env.ref("cgscop_partner.view_partner_prospect_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                (
+                    "project_status",
+                    "in",
+                    (
+                        "1_information",
+                        "2_pre-diagnostic",
+                        "3_accompagnement",
+                        "4_adhesion",
+                        "5_cg",
+                        "7_abandonne",
+                    ),
+                ),
+                ("creation_delegate_id", "=", self.env.user.id),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "default_project_status": "1_information",
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage des coop adh
+    # ------------------------------------------------------
+    def show_coop(self):
+        return {
+            "name": "Coopératives adhérentes",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "search_view_id": self.env.ref(
+                "cgscop_partner.scop_partner_view_search"
+            ).id,
+            "view_type": "form",
+            "view_mode": "tree,form,activity",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                ("membership_status", "=", "member"),
+                ("followup_delegate_id", "=", self.env.user.id),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "create": False,
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage des coop à réviser
+    # ------------------------------------------------------
+    def show_rev(self):
+
+        wyear = datetime.datetime.today().year
+
+        return {
+            "name": "Coopérative à réviser",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "view_type": "form",
+            "view_mode": "tree,form,activity",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                ("membership_status", "=", "member"),
+                ("revision_person_id", "=", self.env.user.id),
+                ("revision_next_year", "=", wyear),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "create": False,
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage des coop à suivre
+    # ------------------------------------------------------
+    def show_acc(self):
+
+        return {
+            "name": "Coopérative à suivre",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "search_view_id": (
+                self.env.ref("cgscop_partner.scop_partner_view_search").id,
+            ),
+            "view_type": "form",
+            "view_mode": "tree,form,activity",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner_crm.scop_partner_crm_view_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                ("membership_status", "=", "member"),
+                ("followup_delegate_id", "=", self.env.user.id),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "create": False,
+            },
+        }
diff --git a/views/partner_dashboard_dlg.xml b/report/partner_dashboard_dlg.xml
similarity index 57%
rename from views/partner_dashboard_dlg.xml
rename to report/partner_dashboard_dlg.xml
index 9e61ffc..1db4fa9 100644
--- a/views/partner_dashboard_dlg.xml
+++ b/report/partner_dashboard_dlg.xml
@@ -1,178 +1,236 @@
-<?xml version="1.0" encoding="utf-8"?>
-<odoo>
-    <data>
-
-        <record id="scop_partner_dashboard_dlg_kanban_view" model="ir.ui.view">
-            <field name="name">scop.partner.dashboard.dlg.kanban</field>
-            <field name="model">scop.partner.dashboard.dlg</field>
-            <field name="arch" type="xml">                
-                <kanban create="false" class="oe_background_grey o_kanban_dashboard o_account_kanban" banner_route="/cgscop_partner_dashboard/header_dlg" >
-                    <field name="name"/>
-                    <field name="dlg_id"/>
-                    <field name="dash_type"/>
-                    <field name="nb_prj_tot"/>
-                    <field name="nb_prj_accomp"/>
-                    <field name="nb_prj_adh"/>
-                    <field name="nb_prj_soumis"/>
-                    <templates>
-                        <t t-name="kanban-box">
-                            <div class="container o_kanban_card_content">
-                                <div class="row">
-                                    <div class="col">
-                                        <h2 class="mt16"><field name="name"/></h2>
-                                        <hr/>    
-                                        <p>Délégué : <field name="dlg_id"/></p>
-                                    </div>
-                                </div>
-
-                                <!-- Affiche Dashboard type 1 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 1)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_projets" class="btn btn-info">Voir mes prospects</button>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Prospects en cours :</td>
-                                                    <td><field name="nb_prj_tot"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont phase d'accompagnement :</td>
-                                                    <td><field name="nb_prj_accomp"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont phase d'adhésion :</td>
-                                                    <td><field name="nb_prj_adh"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont soumis CG :</td>
-                                                    <td><field name="nb_prj_soumis"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-
-                                <!-- Affiche Dashboard type 2 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 2)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_coop" class="btn btn-info" >Voir mes coopératives<br/>suivies</button>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Coopératives suivies :</td>
-                                                    <td><field name="nb_coop_tot"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont SCOP :</td>
-                                                    <td><field name="nb_fc_scop"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont SCIC :</td>
-                                                    <td><field name="nb_fc_scic"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont CAE :</td>
-                                                    <td><field name="nb_coop_cae"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Adhésions de l'année :</td>
-                                                    <td><field name="nb_coop_adh"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-                                <!-- Affiche Dashboard type 3 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 3)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_rev" class="btn btn-info">Voir mes coopératives<br/> à réviser</button>
-                                        </div>
-                                        <div class="text-center">
-                                            <field name="rev_percent_done" widget="percentpie"/>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>A réaliser :</td>
-                                                    <td><field name="rev_todo"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>Réalisées :</td>
-                                                    <td><field name="rev_done"/></td>
-                                                </tr><tr>
-                                                    <td><strong>Total :</strong></td>
-                                                    <td><strong><field name="rev_total"/></strong></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-                                <!-- Affiche Dashboard type 4 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 4)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_acc" class="btn btn-info">Voir les coopératives<br/> à suivre</button>
-                                        </div>
-                                        <div class="text-center">
-                                            <field name="act_acc_percent_done" widget="percentpie"/>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Suivi à réaliser (hrs) :</td>
-                                                    <td><field name="act_acc_theo"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>Suivi réalisés (hrs) :</td>
-                                                    <td><field name="act_acc"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-
-                                <!-- Affiche le graph -->
-                                <div class="row">
-                                    <div class="col">
-                                        <field name="graph_values" widget="dashboard_graph" graph_type="bar"/>
-                                    </div>
-                                </div>
-                            </div>
-                        </t>
-                    </templates>
-                </kanban>
-            </field>
-        </record>
-
-        <record model="ir.actions.act_window" id="coop_partner_dashboard_dlg_act" >
-            <field name="name">Dashboard coopératives (Délégué)</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">scop.partner.dashboard.dlg</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">kanban</field>     
-            <field name="domain">[('dlg_id', '=', uid)]</field>       
-        </record>
-
-    </data>
-</odoo>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <data>
+
+        <record id="scop_partner_dashboard_dlg_kanban_view" model="ir.ui.view">
+            <field name="name">scop.partner.dashboard.dlg.kanban</field>
+            <field name="model">scop.partner.dashboard.dlg</field>
+            <field name="arch" type="xml">
+                <kanban
+                    create="false"
+                    class="oe_background_grey o_kanban_dashboard o_account_kanban"
+                    banner_route="/cgscop_partner_dashboard/header_dlg"
+                >
+                    <field name="name" />
+                    <field name="dlg_id" />
+                    <field name="dash_type" />
+                    <field name="nb_prj_tot" />
+                    <field name="nb_prj_accomp" />
+                    <field name="nb_prj_adh" />
+                    <field name="nb_prj_soumis" />
+                    <templates>
+                        <t t-name="kanban-box">
+                            <div class="container o_kanban_card_content">
+                                <div class="row">
+                                    <div class="col">
+                                        <h2 class="mt16"><field name="name" /></h2>
+                                        <hr />
+                                        <p>Délégué : <field name="dlg_id" /></p>
+                                    </div>
+                                </div>
+
+                                <!-- Affiche Dashboard type 1 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 1)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_projets"
+                                                class="btn btn-info"
+                                            >Voir mes prospects</button>
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Prospects en cours :</td>
+                                                    <td><field name="nb_prj_tot" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td
+                                                    >dont phase d'accompagnement :</td>
+                                                    <td><field
+                                                            name="nb_prj_accomp"
+                                                        /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont phase d'adhésion :</td>
+                                                    <td><field name="nb_prj_adh" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont soumis CG :</td>
+                                                    <td><field
+                                                            name="nb_prj_soumis"
+                                                        /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+
+                                <!-- Affiche Dashboard type 2 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 2)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_coop"
+                                                class="btn btn-info"
+                                            >Voir mes coopératives<br />suivies</button>
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Coopératives suivies :</td>
+                                                    <td><field
+                                                            name="nb_coop_tot"
+                                                        /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont SCOP :</td>
+                                                    <td><field name="nb_fc_scop" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont SCIC :</td>
+                                                    <td><field name="nb_fc_scic" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont CAE :</td>
+                                                    <td><field
+                                                            name="nb_coop_cae"
+                                                        /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Adhésions de l'année :</td>
+                                                    <td><field
+                                                            name="nb_coop_adh"
+                                                        /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+                                <!-- Affiche Dashboard type 3 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 3)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_rev"
+                                                class="btn btn-info"
+                                            >Voir mes coopératives<br
+                                                /> à réviser</button>
+                                        </div>
+                                        <div class="text-center">
+                                            <field
+                                                name="rev_percent_done"
+                                                widget="percentpie"
+                                            />
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>A réaliser :</td>
+                                                    <td><field name="rev_todo" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>Réalisées :</td>
+                                                    <td><field name="rev_done" /></td>
+                                                </tr><tr>
+                                                    <td><strong>Total :</strong></td>
+                                                    <td><strong><field
+                                                                name="rev_total"
+                                                            /></strong></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+                                <!-- Affiche Dashboard type 4 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 4)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_acc"
+                                                class="btn btn-info"
+                                            >Voir les coopératives<br
+                                                /> à suivre</button>
+                                        </div>
+                                        <div class="text-center">
+                                            <field
+                                                name="act_acc_percent_done"
+                                                widget="percentpie"
+                                            />
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Suivi à réaliser (hrs) :</td>
+                                                    <td><field
+                                                            name="act_acc_theo"
+                                                        /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>Suivi réalisés (hrs) :</td>
+                                                    <td><field name="act_acc" /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+
+                                <!-- Affiche le graph -->
+                                <div class="row">
+                                    <div class="col">
+                                        <field
+                                            name="graph_values"
+                                            widget="dashboard_graph"
+                                            graph_type="bar"
+                                        />
+                                    </div>
+                                </div>
+                            </div>
+                        </t>
+                    </templates>
+                </kanban>
+            </field>
+        </record>
+
+        <record model="ir.actions.act_window" id="coop_partner_dashboard_dlg_act">
+            <field name="name">Dashboard coopératives (Délégué)</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">scop.partner.dashboard.dlg</field>
+            <field name="view_mode">kanban</field>
+            <field name="domain">[('dlg_id', '=', uid)]</field>
+        </record>
+
+    </data>
+</odoo>
diff --git a/report/partner_dashboard_ur.py b/report/partner_dashboard_ur.py
new file mode 100644
index 0000000..7fbb431
--- /dev/null
+++ b/report/partner_dashboard_ur.py
@@ -0,0 +1,914 @@
+# © 2020 Le Filament (<https://www.le-filament.com>)
+# © 2020 Confédération Générale des Scop (<https://www.les-scop.coop>)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+import datetime
+import json
+
+from psycopg2.extensions import AsIs
+
+from odoo import api, fields, models, tools
+
+
+class ScopPartnerDashboardUr(models.Model):
+    _name = "scop.partner.dashboard.ur"
+    _description = "Dashboard coopératives UR"
+    _order = "dash_type asc"
+    _auto = False
+
+    current_user_ur_id = fields.Many2one(
+        "union.regionale",
+        string="Union Régionale de l'utilisateur",
+        compute="_compute_current_user_ur_id",
+        search="_search_current_user_ur_id",
+    )
+
+    # Vue
+    ur_id = fields.Many2one("union.regionale", string="Union Régionale")
+    name = fields.Char()
+    dash_type = fields.Integer("Type de dashboard")
+    all_ur = fields.Boolean("Affichage de toutes les UR")
+
+    nb_prj_info = fields.Integer("Information")
+    nb_prj_pdiag = fields.Integer("Pre-diag")
+    nb_prj_accomp = fields.Integer("Accompagnement")
+    nb_prj_adh = fields.Integer("Adhésion")
+    nb_prj_soumis = fields.Integer("Soumis")
+    nb_prj_tot = fields.Integer("Projets en cours")
+
+    nb_fc_scop = fields.Integer("Nombre de scop")
+    nb_fc_scic = fields.Integer("Nombre de scic")
+    nb_fc_co47 = fields.Integer("Nombre de coop 47")
+    nb_coop_cae = fields.Integer("Nombre de CAE")
+    nb_coop_adh = fields.Integer("Nombre d'adhésion pour l'année")
+    nb_coop_tot = fields.Integer("Total coop adhérentes")
+
+    rev_todo = fields.Integer("A réviser")
+    rev_done = fields.Integer("Révisées")
+    rev_total = fields.Integer("Total révisions")
+    rev_1y = fields.Integer("Annuelle")
+    rev_5y = fields.Integer("Quinquennale")
+    rev_5ys = fields.Integer("Quinquennale séquencée (annuel)")
+    rev_5ys23 = fields.Integer("Quinquennale séquencée (2 ans et 3 ans)")
+    rev_percent_done = fields.Float("Réalisés", compute="_compute_percent_rev")
+
+    act_dev = fields.Integer("Développement (hrs)")
+    act_acc = fields.Integer("Suivi (hrs)")
+    act_rev = fields.Integer("Révision (hrs)")
+    act_for = fields.Integer("Formation (hrs)")
+    act_acc_theo = fields.Integer("Acc. théorique (hrs)")
+    act_acc_percent_done = fields.Float("Réalisés", compute="_compute_act_acc")
+
+    graph_values = fields.Text(compute="_compute_graph_values")
+
+    # ------------------------------------------------------
+    # Construction de la requete
+    # ------------------------------------------------------
+    @api.model
+    def _select(self):
+        # On récupere l'id de la cgscop
+        cgids = self.env["union.regionale"].search([("name", "ilike", "CGSCOP")])
+        if len(cgids) != 1:
+            cgscop_id = 0
+        else:
+            cgscop_id = cgids[0].id
+
+        # On constitue les requetes
+        qy_projet = self._select_projet(cgscop_id)
+        qy_coop = self._select_coop(cgscop_id)
+        qy_rev = self._select_rev(cgscop_id)
+        qy_act = self._select_act(cgscop_id)
+
+        qy = (
+            qy_projet
+            + " UNION ALL "
+            + qy_coop
+            + " UNION ALL "
+            + qy_rev
+            + " UNION ALL "
+            + qy_act
+        )
+
+        return qy
+
+    # ------------------------------------------------------
+    # Dashboard projets
+    # ------------------------------------------------------
+    @api.model
+    def _select_projet(self, cgscop_id):
+        query = """
+                SELECT
+                CONCAT('1', ur_id) AS id,
+                org.ur_id as ur_id,
+                'Prospects en cours' AS name,
+                '1' as dash_type,
+                0 as all_ur,
+                SUM(case
+                    when substring(org.project_status,1,1) = '1' then 1
+                    else 0 end) AS nb_prj_info,
+                SUM(case
+                    when substring(org.project_status,1,1) = '2' then 1
+                    else 0 end) AS nb_prj_pdiag,
+                SUM(case
+                    when substring(org.project_status,1,1) = '3' then 1
+                    else 0 end) AS nb_prj_accomp,
+                SUM(case
+                    when substring(org.project_status,1,1) = '4' then 1
+                    else 0 end) AS nb_prj_adh,
+                SUM(case when
+                    substring(org.project_status,1,1) = '5' then 1
+                    else 0 end) AS nb_prj_soumis,
+                count(org.id) as nb_prj_tot,
+                0 as nb_fc_scop,
+                0 as nb_fc_scic,
+                0 as nb_fc_co47,
+                0 as nb_coop_cae,
+                0 as nb_coop_adh,
+                0 as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 as rev_5y,
+                0 as rev_5ys,
+                0 as rev_5ys23,
+                0 as rev_todo,
+                0 as rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+                FROM res_partner org
+                where
+                (org.ur_id <> %d) and
+                (org.active=TRUE) and
+                (org.is_cooperative = TRUE)and
+                substring(org.project_status,1,1) in ('1','2','3','4','5')
+                group by
+                org.ur_id
+                UNION ALL
+                SELECT
+                '1CGSCOP' AS id,
+                '%d' as ur_id,
+                'Prospects en cours' AS name,
+                '1' as dash_type,
+                1 as all_ur,
+                SUM(case
+                    when substring(org.project_status,1,1) = '1' then 1
+                    else 0 end) AS nb_prj_info,
+                SUM(case
+                    when substring(org.project_status,1,1) = '2' then 1
+                    else 0 end) AS nb_prj_pdiag,
+                SUM(case
+                    when substring(org.project_status,1,1) = '3' then 1
+                    else 0 end) AS nb_prj_accomp,
+                SUM(case
+                    when substring(org.project_status,1,1) = '4' then 1
+                    else 0 end) AS nb_prj_adh,
+                SUM(case
+                    when substring(org.project_status,1,1) = '5' then 1
+                    else 0 end) AS nb_prj_soumis,
+                count(org.id) as nb_prj_tot,
+                0 as nb_fc_scop,
+                0 as nb_fc_scic,
+                0 as nb_fc_co47,
+                0 as nb_coop_cae,
+                0 as nb_coop_adh,
+                0 as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 as rev_5y,
+                0 as rev_5ys,
+                0 as rev_5ys23,
+                0 as rev_todo,
+                0 as rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+                FROM res_partner org
+                where
+                (org.active=TRUE) and
+                (org.is_cooperative = TRUE)and
+                substring(org.project_status,1,1) in ('1','2','3','4','5')
+                """ % (
+            cgscop_id,
+            cgscop_id,
+        )
+
+        return query
+
+    # ------------------------------------------------------
+    # Dashboard cooperative
+    # ------------------------------------------------------
+    @api.model
+    def _select_coop(self, cgscop_id):
+
+        try:
+            form_scop = self.env.ref("cgscop_partner.form_scop").id
+        except Exception:
+            form_scop = 0
+
+        try:
+            form_scic = self.env.ref("cgscop_partner.form_scic").id
+        except Exception:
+            form_scic = 0
+
+        try:
+            form_co47 = self.env.ref("cgscop_partner.form_coop47").id
+        except Exception:
+            form_co47 = 0
+
+        query = """
+                SELECT
+                CONCAT('2', ur_id) AS id,
+                org.ur_id as ur_id,
+                'Coopératives adhérentes' AS name,
+                '2' as dash_type,
+                0 as all_ur,
+                0 as nb_prj_info,
+                0 as nb_prj_pdiag,
+                0 as nb_prj_accomp,
+                0 as nb_prj_adh,
+                0 as nb_prj_soumis,
+                0 as nb_prj_tot,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_scop,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_scic,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_co47,
+                SUM(case
+                    when org.cae is true then 1
+                    else 0 end) AS nb_coop_cae,
+                SUM(case
+                    when date_part('year', adh.start) = date_part('year', CURRENT_DATE) then 1
+                    else 0 end) AS nb_coop_adh,
+                count(org.id) as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 as rev_5y,
+                0 as rev_5ys,
+                0 as rev_5ys23,
+                0 as rev_todo,
+                0 as rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+                FROM res_partner org
+                left join scop_membership_period as adh
+                on adh.partner_id = org.id
+                and adh.start=(select max(start)
+                from scop_membership_period where partner_id=org.id and type_id=1)
+                and type_id=1
+                where
+                (org.ur_id <> %d) and
+                (org.active=TRUE) and
+                (org.is_cooperative = TRUE) and
+                (org.membership_status = 'member')
+                group by
+                org.ur_id
+                UNION ALL
+                SELECT
+                '2CGSCOP' AS id,
+                '%d' as ur_id,
+                'Coopératives adhérentes' AS name,
+                '2' as dash_type,
+                1 as all_ur,
+                0 as nb_prj_info,
+                0 as nb_prj_pdiag,
+                0 as nb_prj_accomp,
+                0 as nb_prj_adh,
+                0 as nb_prj_soumis,
+                0 as nb_prj_tot,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_scop,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_scic,
+                SUM(case
+                    when org.cooperative_form_id = %d then 1
+                    else 0 end) AS nb_fc_co47,
+                SUM(case
+                    when org.cae is true then 1
+                    else 0 end) AS nb_coop_cae,
+                SUM(case
+                    when date_part('year', adh.start) = date_part('year', CURRENT_DATE) then 1
+                    else 0 end) AS nb_coop_adh,
+                count(org.id) as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 as rev_5y,
+                0 as rev_5ys,
+                0 as rev_5ys23,
+                0 as rev_todo,
+                0 as rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+                FROM res_partner org
+                left join scop_membership_period as adh
+                on adh.partner_id = org.id
+                and adh.start=(select max(start)
+                from scop_membership_period where partner_id=org.id and type_id=1)
+                and type_id=1
+                where
+                (org.active=TRUE) and
+                (org.is_cooperative = TRUE) and
+                (org.membership_status = 'member')
+                """ % (
+            form_scop,
+            form_scic,
+            form_co47,
+            cgscop_id,
+            cgscop_id,
+            form_scop,
+            form_scic,
+            form_co47,
+        )
+
+        return query
+
+    # ------------------------------------------------------
+    # Dashboard revision
+    # ------------------------------------------------------
+    @api.model
+    def _select_rev(self, cgscop_id):
+
+        query = """
+                SELECT
+                id,
+                ur_id,
+                CONCAT('Révisions année ',date_part('year', CURRENT_DATE)) AS name,
+                '3' as dash_type,
+                0 as all_ur,
+                0 as nb_prj_info,
+                0 as nb_prj_pdiag,
+                0 as nb_prj_accomp,
+                0 as nb_prj_adh,
+                0 as nb_prj_soumis,
+                0 as nb_prj_tot,
+                0 as nb_fc_scop,
+                0 as nb_fc_scic,
+                0 as nb_fc_co47,
+                0 as nb_coop_cae,
+                0 as nb_coop_adh,
+                0 as nb_coop_tot,
+                SUM(wrev.rev_done) as rev_done,
+                SUM(wrev.rev_1y) AS rev_1y,
+                SUM(wrev.rev_5y) AS rev_5y,
+                SUM(wRev.rev_5ys) AS rev_5ys,
+                SUM(wrev.rev_5ys23) AS rev_5ys23,
+                SUM(wrev.rev_1y) + SUM(wrev.rev_5y) + SUM(wRev.rev_5ys) +
+                SUM(wrev.rev_5ys23) AS rev_todo,
+                SUM(wrev.rev_done) + SUM(wrev.rev_1y) + SUM(wrev.rev_5y) +
+                SUM(wRev.rev_5ys) + SUM(wrev.rev_5ys23) AS rev_total,
+                0 as act_dev,
+                0 as act_acc,
+                0 as act_rev,
+                0 as act_for,
+                0 as act_acc_theo
+                FROM
+                (
+                    SELECT
+                    CONCAT(org.ur_id, org.revision_next_year) AS id,
+                    org.ur_id as ur_id,
+                    0 AS rev_done,
+                    case when org.revision_type = '1y' then 1 else 0 end AS rev_1y,
+                    case when org.revision_type = '5y' then 1 else 0 end AS rev_5y,
+                    case when org.revision_type = '5ys' then 1 else 0 end AS rev_5ys,
+                    case when org.revision_type = '5ys23' then 1 else 0 end AS rev_5ys23
+                    FROM res_partner as org
+                    WHERE (org.revision_next_year = date_part('year', CURRENT_DATE))
+                UNION ALL
+                    SELECT
+                    CONCAT(org.ur_id, date_part('year', rev.date)) as id,
+                    org.ur_id as ur_id,
+                    1 AS rev_done,
+                    0 AS rev_1y,
+                    0 AS rev_5y,
+                    0 AS rev_5ys,
+                    0 AS rev_5ys23
+                    FROM scop_revision as rev
+                    JOIN res_partner as org ON (org.id = rev.partner_id)
+                    WHERE (date_part('year', rev.date) = date_part('year', CURRENT_DATE))
+                ) AS wRev
+                GROUP BY wrev.id, wrev.ur_id
+        """
+        return query
+
+    # ------------------------------------------------------
+    # Dashboard activité
+    # ------------------------------------------------------
+    @api.model
+    def _select_act(self, cgscop_id):
+
+        query = """
+                SELECT
+                CONCAT('4', ur_id) as id,
+                ur_id,
+                CONCAT('Activité année ',date_part('year', CURRENT_DATE)) AS name,
+                '4' as dash_type,
+                0 as all_ur,
+                0 as nb_prj_info,
+                0 as nb_prj_pdiag,
+                0 as nb_prj_accomp,
+                0 as nb_prj_adh,
+                0 as nb_prj_soumis,
+                0 as nb_prj_tot,
+                0 as nb_fc_scop,
+                0 as nb_fc_scic,
+                0 as nb_fc_co47,
+                0 as nb_coop_cae,
+                0 as nb_coop_adh,
+                0 as nb_coop_tot,
+                0 as rev_done,
+                0 as rev_1y,
+                0 AS rev_5y,
+                0 AS rev_5ys,
+                0 AS rev_5ys23,
+                0 AS rev_todo,
+                0 AS rev_total,
+                sum(wrk.amount_dev) as act_dev,
+                sum(wrk.amount_acc) as act_acc,
+                sum(wrk.amount_rev) as act_rev,
+                sum(wrk.amount_for) as act_for,
+                sum(wrk.amount_theo) as act_acc_theo
+                FROM
+                (
+                    select
+                    ac.ur_id as ur_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    ac.unit_amount as amount_rev,
+                    0 as amount_dev,
+                    0 as amount_acc,
+                    0 as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'R'
+                union all
+                    select
+                    ac.ur_id as ur_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    0 as amount_rev,
+                    ac.unit_amount as amount_dev,
+                    0 as amount_acc,
+                    0 as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'D'
+                union all
+                    select
+                    ac.ur_id as ur_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    0 as amount_rev,
+                    0 as amount_dev,
+                    ac.unit_amount as amount_acc,
+                    0 as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'A'
+                union all
+                    select
+                    ac.ur_id as ur_id,
+                    EXTRACT(YEAR FROM ac.date) as "year",
+                    0 as amount_rev,
+                    0 as amount_dev,
+                    0 as amount_acc,
+                    ac.unit_amount as amount_for,
+                    0 as amount_theo
+                    from
+                    account_analytic_line as ac
+                    left join project_project as pu on pu.id = ac.project_id
+                    left join cgscop_timesheet_code as pn on pn.id = pu.cgscop_timesheet_code_id
+                    where
+                    (date_part('year', ac.date) = date_part('year', CURRENT_DATE))
+                    and pn.domain = 'F'
+                union all
+                    select
+                    pa.ur_id as ur_id,
+                    date_part('year', CURRENT_DATE) as "year",
+                    0 as amount_rev,
+                    0 as amount_dev,
+                    0 as amount_acc,
+                    0 as amount_for,
+                    fo.duree as act_acc_theo
+                    from
+                    res_partner as pa
+                    left join scop_followup_format as fo on fo.id = pa.followup_format_id
+                    where pa.membership_status = 'member'
+                ) as wrk
+                group BY
+                wrk.ur_id,
+                wrk.year
+        """
+        return query
+
+    def init(self):
+        tools.drop_view_if_exists(self.env.cr, self._table)
+        self.env.cr.execute(
+            "CREATE or REPLACE VIEW %s as (%s)",
+            (AsIs(self._table), AsIs(self._select())),
+        )
+
+    # ------------------------------------------------------
+    # Récupère l'ur de l'utilisateur connecté
+    # ------------------------------------------------------
+    @api.model
+    def _compute_current_user_ur_id(self):
+        for partner in self:
+            partner.current_user_ur_id = self.env.user.company_id.ur_id.id
+
+    def _search_current_user_ur_id(self, operator, value):
+        return [("ur_id", "=", self.env.user.company_id.ur_id.id)]
+
+    # ------------------------------------------------------
+    # Calcule les données du graphique
+    # ------------------------------------------------------
+    def _compute_graph_values(self):
+        for rec in self:
+            if rec.dash_type == 1:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {
+                                    "label": "Information",
+                                    "value": rec.nb_prj_info,
+                                },
+                                {
+                                    "label": "Pré-diag",
+                                    "value": rec.nb_prj_pdiag,
+                                },
+                                {
+                                    "label": "Accompagnement",
+                                    "value": rec.nb_prj_accomp,
+                                },
+                                {"label": "Adhésion", "value": rec.nb_prj_adh},
+                                {
+                                    "label": "Soumis CG",
+                                    "value": rec.nb_prj_soumis,
+                                },
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Prospects en cours",
+                        }
+                    ]
+                )
+
+            if rec.dash_type == 2:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {"label": "Scop", "value": rec.nb_fc_scop},
+                                {"label": "Scic", "value": rec.nb_fc_scic},
+                                {"label": "Coop 47", "value": rec.nb_fc_co47},
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Coopératives adhérentes",
+                        }
+                    ]
+                )
+
+            if rec.dash_type == 3:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {"label": "Annuelle", "value": rec.rev_1y},
+                                {"label": "Quinquennale", "value": rec.rev_5y},
+                                {
+                                    "label": "Quinq. séq. (annuel)",
+                                    "value": rec.rev_5ys,
+                                },
+                                {
+                                    "label": "Quinq. séq. (2 et 3)",
+                                    "value": rec.rev_5ys23,
+                                },
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Nombre de révisions",
+                        }
+                    ]
+                )
+
+            if rec.dash_type == 4:
+                rec.graph_values = json.dumps(
+                    [
+                        {
+                            "values": [
+                                {
+                                    "label": "Développement (hrs)",
+                                    "value": rec.act_dev,
+                                },
+                                {"label": "Suivi (hrs)", "value": rec.act_acc},
+                                {
+                                    "label": "Révision (hrs)",
+                                    "value": rec.act_rev,
+                                },
+                                {
+                                    "label": "Formation (hrs)",
+                                    "value": rec.act_for,
+                                },
+                            ],
+                            "area": True,
+                            "title": "",
+                            "key": "Découpage de l'activité",
+                        }
+                    ]
+                )
+
+    # ------------------------------------------------------
+    # Calcul le % de révision réalisé
+    # ------------------------------------------------------
+    def _compute_percent_rev(self):
+        for rec in self:
+            if rec.rev_total == 0:
+                rec.rev_percent_done = 0
+            else:
+                rec.rev_percent_done = rec.rev_done / rec.rev_total * 100
+
+    # ------------------------------------------------------
+    # Calcul le % d'accompagnement réalisé
+    # ------------------------------------------------------
+    def _compute_act_acc(self):
+        for rec in self:
+            if rec.act_acc_theo == 0:
+                rec.act_acc_percent_done = 0
+            else:
+                rec.act_acc_percent_done = rec.act_acc / rec.act_acc_theo * 100
+
+    # ------------------------------------------------------
+    # Affichage des projets de l'ur
+    # ------------------------------------------------------
+    def show_projets(self):
+        return {
+            "name": "Prospects",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "view_type": "form",
+            "view_mode": "kanban,tree,form",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_kanban").id,
+                    "kanban",
+                ),
+                (
+                    self.env.ref("cgscop_partner.view_partner_prospect_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                (
+                    "project_status",
+                    "in",
+                    (
+                        "1_information",
+                        "2_pre-diagnostic",
+                        "3_accompagnement",
+                        "4_adhesion",
+                        "5_cg",
+                        "7_abandonne",
+                    ),
+                ),
+                ("current_user_ur_id", "=", "ur_id"),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "default_project_status": "1_information",
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage de tous les projets
+    # ------------------------------------------------------
+    def show_all_projets(self):
+        return {
+            "name": "Tous les Prospects",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "view_type": "form",
+            "view_mode": "kanban,tree,form",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_kanban").id,
+                    "kanban",
+                ),
+                (
+                    self.env.ref("cgscop_partner.view_partner_prospect_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                (
+                    "project_status",
+                    "in",
+                    (
+                        "1_information",
+                        "2_pre-diagnostic",
+                        "3_accompagnement",
+                        "4_adhesion",
+                        "5_cg",
+                        "7_abandonne",
+                    ),
+                ),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "default_project_status": "1_information",
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage des coop adh de l'ur
+    # ------------------------------------------------------
+    def show_coop(self):
+        return {
+            "name": "Coopératives adhérentes",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "search_view_id": (
+                self.env.ref("cgscop_partner.scop_partner_view_search").id,
+            ),
+            "view_type": "form",
+            "view_mode": "tree,form",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                ("membership_status", "=", "member"),
+                ("current_user_ur_id", "=", "ur_id"),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "create": False,
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage de toutes les coop adh
+    # ------------------------------------------------------
+    def show_all_coop(self):
+        return {
+            "name": "Toutes les coopératives adhérentes",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "search_view_id": (
+                self.env.ref("cgscop_partner.scop_partner_view_search").id,
+            ),
+            "view_type": "form",
+            "view_mode": "tree,form",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                ("membership_status", "=", "member"),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "create": False,
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage des coop à réviser
+    # ------------------------------------------------------
+    def show_rev(self):
+
+        wyear = datetime.datetime.today().year
+
+        return {
+            "name": "Coopérative à réviser",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "view_type": "form",
+            "view_mode": "tree",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner.view_partner_cooperative_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                ("membership_status", "=", "member"),
+                ("current_user_ur_id", "=", "ur_id"),
+                ("revision_next_year", "=", wyear),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "create": False,
+            },
+        }
+
+    # ------------------------------------------------------
+    # Affichage des coop à suivre
+    # ------------------------------------------------------
+    def show_acc(self):
+
+        datetime.datetime.today().year
+
+        return {
+            "name": "Coopérative à suivre",
+            "type": "ir.actions.act_window",
+            "res_model": "res.partner",
+            "search_view_id": (
+                self.env.ref("cgscop_partner.scop_partner_view_search").id,
+            ),
+            "view_type": "form",
+            "view_mode": "tree",
+            "views": [
+                (
+                    self.env.ref("cgscop_partner_crm.scop_partner_crm_view_tree").id,
+                    "tree",
+                ),
+                (
+                    self.env.ref("cgscop_partner.scop_contact_view_form").id,
+                    "form",
+                ),
+            ],
+            "target": "current",
+            "domain": [
+                ("is_cooperative", "=", True),
+                ("membership_status", "=", "member"),
+                ("current_user_ur_id", "=", "ur_id"),
+            ],
+            "context": {
+                "default_is_company": True,
+                "default_is_cooperative": True,
+                "default_company_type": "company",
+                "create": False,
+            },
+        }
diff --git a/views/partner_dashboard_ur.xml b/report/partner_dashboard_ur.xml
similarity index 54%
rename from views/partner_dashboard_ur.xml
rename to report/partner_dashboard_ur.xml
index 48e10fe..fb29a19 100644
--- a/views/partner_dashboard_ur.xml
+++ b/report/partner_dashboard_ur.xml
@@ -1,185 +1,256 @@
-<?xml version="1.0" encoding="utf-8"?>
-<odoo>
-    <data>
-
-        <record id="scop_partner_dashboard_ur_kanban_view" model="ir.ui.view">
-            <field name="name">scop.partner.dashboard.ur.kanban</field>
-            <field name="model">scop.partner.dashboard.ur</field>
-            <field name="arch" type="xml">
-                <kanban create="false" class="oe_background_grey o_kanban_dashboard o_account_kanban" >
-                    <field name="name"/>
-                    <field name="ur_id"/>
-                    <field name="dash_type"/>
-                    <field name="nb_prj_tot"/>
-                    <field name="nb_prj_accomp"/>
-                    <field name="nb_prj_adh"/>
-                    <field name="nb_prj_soumis"/>
-                    <field name="all_ur"/>
-                    <templates>
-                        <t t-name="kanban-box">
-                            <div class="container o_kanban_card_content">
-                                <div class="row">
-                                    <div class="col">
-                                        <h2 class="mt16"><field name="name"/></h2>
-                                        <hr/>    
-                                        <p>Union régionale : <field name="ur_id"/></p>
-                                    </div>
-                                </div>
-
-                                <!-- Affiche Dashboard type 1 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 1)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_projets" class="btn btn-info" attrs="{'invisible': [('all_ur', '=', True)]}">Voir les prospects</button>
-                                        </div>
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_all_projets" class="btn btn-info" attrs="{'invisible': [('all_ur', '!=', True)]}">Voir tous les prospects</button>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Prospects en cours :</td>
-                                                    <td><field name="nb_prj_tot"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont phase d'accompagnement :</td>
-                                                    <td><field name="nb_prj_accomp"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont phase d'adhésion :</td>
-                                                    <td><field name="nb_prj_adh"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont soumis CG :</td>
-                                                    <td><field name="nb_prj_soumis"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-
-                                <!-- Affiche Dashboard type 2 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 2)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_coop" class="btn btn-info" attrs="{'invisible': [('all_ur', '=', True)]}">Voir les coopératives<br/> adhérentes</button>
-                                        </div>
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_all_coop" class="btn btn-info" attrs="{'invisible': [('all_ur', '!=', True)]}">Voir toutes les coopératives<br/> adhérentes</button>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Coopératives adhérentes :</td>
-                                                    <td><field name="nb_coop_tot"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont SCOP :</td>
-                                                    <td><field name="nb_fc_scop"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont SCIC :</td>
-                                                    <td><field name="nb_fc_scic"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>dont CAE :</td>
-                                                    <td><field name="nb_coop_cae"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Adhésions de l'année :</td>
-                                                    <td><field name="nb_coop_adh"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-                                <!-- Affiche Dashboard type 3 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 3)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_rev" class="btn btn-info">Voir les coopératives<br/> à réviser</button>
-                                        </div>
-                                        <div class="text-center">
-                                            <field name="rev_percent_done" widget="percentpie"/>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>A réaliser :</td>
-                                                    <td><field name="rev_todo"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>Réalisées :</td>
-                                                    <td><field name="rev_done"/></td>
-                                                </tr><tr>
-                                                    <td><strong>Total :</strong></td>
-                                                    <td><strong><field name="rev_total"/></strong></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-                                <!-- Affiche Dashboard type 4 -->
-                                <div class="row" attrs="{'invisible': [('dash_type', '!=', 4)]}">
-                                    <div class="col-6">
-                                        <div class="text-center mb32">
-                                            <button type="object" name="show_acc" class="btn btn-info">Voir les coopératives<br/> à suivre</button>
-                                        </div>
-                                        <div class="text-center">
-                                            <field name="act_acc_percent_done" widget="percentpie"/>
-                                        </div>
-                                    </div>
-                                    <div class="col-6">
-                                        <table class="table table-bordered">
-                                            <tbody>
-                                                <tr>
-                                                    <td>Suivi à réaliser (hrs) :</td>
-                                                    <td><field name="act_acc_theo"/></td>
-                                                </tr>
-                                                <tr>
-                                                    <td>Suivi réalisés (hrs) :</td>
-                                                    <td><field name="act_acc"/></td>
-                                                </tr>
-                                            </tbody>
-                                        </table>
-                                    </div>
-                                </div>
-
-
-                                <!-- Affiche le graph -->
-                                <div class="row">
-                                    <div class="col">
-                                        <field name="graph_values" widget="dashboard_graph" graph_type="bar"/>
-                                    </div>
-                                </div>
-                            </div>
-                        </t>
-                    </templates>
-                </kanban>
-            </field>
-        </record>
-
-        <record model="ir.actions.act_window" id="coop_partner_dashboard_ur_act" >
-            <field name="name">Dashboard coopératives (Union régionale)</field>
-            <field name="type">ir.actions.act_window</field>
-            <field name="res_model">scop.partner.dashboard.ur</field>
-            <field name="view_type">form</field>
-            <field name="view_mode">kanban</field>     
-            <field name="domain" eval="[('current_user_ur_id', '=', 'ur_id')]"/>      
-        </record>
-
-    </data>
-</odoo>
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" ?>
+<odoo>
+    <data>
+
+        <record id="scop_partner_dashboard_ur_kanban_view" model="ir.ui.view">
+            <field name="name">scop.partner.dashboard.ur.kanban</field>
+            <field name="model">scop.partner.dashboard.ur</field>
+            <field name="arch" type="xml">
+                <kanban
+                    create="false"
+                    class="oe_background_grey o_kanban_dashboard o_account_kanban"
+                >
+                    <field name="name" />
+                    <field name="ur_id" />
+                    <field name="dash_type" />
+                    <field name="nb_prj_tot" />
+                    <field name="nb_prj_accomp" />
+                    <field name="nb_prj_adh" />
+                    <field name="nb_prj_soumis" />
+                    <field name="all_ur" />
+                    <templates>
+                        <t t-name="kanban-box">
+                            <div class="container o_kanban_card_content">
+                                <div class="row">
+                                    <div class="col">
+                                        <h2 class="mt16"><field name="name" /></h2>
+                                        <hr />
+                                        <p>Union régionale : <field name="ur_id" /></p>
+                                    </div>
+                                </div>
+
+                                <!-- Affiche Dashboard type 1 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 1)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_projets"
+                                                class="btn btn-info"
+                                                attrs="{'invisible': [('all_ur', '=', True)]}"
+                                            >Voir les prospects</button>
+                                        </div>
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_all_projets"
+                                                class="btn btn-info"
+                                                attrs="{'invisible': [('all_ur', '!=', True)]}"
+                                            >Voir tous les prospects</button>
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Prospects en cours :</td>
+                                                    <td><field name="nb_prj_tot" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td
+                                                    >dont phase d'accompagnement :</td>
+                                                    <td><field
+                                                            name="nb_prj_accomp"
+                                                        /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont phase d'adhésion :</td>
+                                                    <td><field name="nb_prj_adh" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont soumis CG :</td>
+                                                    <td><field
+                                                            name="nb_prj_soumis"
+                                                        /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+
+                                <!-- Affiche Dashboard type 2 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 2)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_coop"
+                                                class="btn btn-info"
+                                                attrs="{'invisible': [('all_ur', '=', True)]}"
+                                            >Voir les coopératives<br
+                                                /> adhérentes</button>
+                                        </div>
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_all_coop"
+                                                class="btn btn-info"
+                                                attrs="{'invisible': [('all_ur', '!=', True)]}"
+                                            >Voir toutes les coopératives<br
+                                                /> adhérentes</button>
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Coopératives adhérentes :</td>
+                                                    <td><field
+                                                            name="nb_coop_tot"
+                                                        /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont SCOP :</td>
+                                                    <td><field name="nb_fc_scop" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont SCIC :</td>
+                                                    <td><field name="nb_fc_scic" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>dont CAE :</td>
+                                                    <td><field
+                                                            name="nb_coop_cae"
+                                                        /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Adhésions de l'année :</td>
+                                                    <td><field
+                                                            name="nb_coop_adh"
+                                                        /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+                                <!-- Affiche Dashboard type 3 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 3)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_rev"
+                                                class="btn btn-info"
+                                            >Voir les coopératives<br
+                                                /> à réviser</button>
+                                        </div>
+                                        <div class="text-center">
+                                            <field
+                                                name="rev_percent_done"
+                                                widget="percentpie"
+                                            />
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>A réaliser :</td>
+                                                    <td><field name="rev_todo" /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>Réalisées :</td>
+                                                    <td><field name="rev_done" /></td>
+                                                </tr><tr>
+                                                    <td><strong>Total :</strong></td>
+                                                    <td><strong><field
+                                                                name="rev_total"
+                                                            /></strong></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+                                <!-- Affiche Dashboard type 4 -->
+                                <div
+                                    class="row"
+                                    attrs="{'invisible': [('dash_type', '!=', 4)]}"
+                                >
+                                    <div class="col-6">
+                                        <div class="text-center mb32">
+                                            <button
+                                                type="object"
+                                                name="show_acc"
+                                                class="btn btn-info"
+                                            >Voir les coopératives<br
+                                                /> à suivre</button>
+                                        </div>
+                                        <div class="text-center">
+                                            <field
+                                                name="act_acc_percent_done"
+                                                widget="percentpie"
+                                            />
+                                        </div>
+                                    </div>
+                                    <div class="col-6">
+                                        <table class="table table-bordered">
+                                            <tbody>
+                                                <tr>
+                                                    <td>Suivi à réaliser (hrs) :</td>
+                                                    <td><field
+                                                            name="act_acc_theo"
+                                                        /></td>
+                                                </tr>
+                                                <tr>
+                                                    <td>Suivi réalisés (hrs) :</td>
+                                                    <td><field name="act_acc" /></td>
+                                                </tr>
+                                            </tbody>
+                                        </table>
+                                    </div>
+                                </div>
+
+
+                                <!-- Affiche le graph -->
+                                <div class="row">
+                                    <div class="col">
+                                        <field
+                                            name="graph_values"
+                                            widget="dashboard_graph"
+                                            graph_type="bar"
+                                        />
+                                    </div>
+                                </div>
+                            </div>
+                        </t>
+                    </templates>
+                </kanban>
+            </field>
+        </record>
+
+        <record model="ir.actions.act_window" id="coop_partner_dashboard_ur_act">
+            <field name="name">Dashboard coopératives (Union régionale)</field>
+            <field name="type">ir.actions.act_window</field>
+            <field name="res_model">scop.partner.dashboard.ur</field>
+            <field name="view_mode">kanban</field>
+            <field name="domain" eval="[('current_user_ur_id', '=', 'ur_id')]" />
+        </record>
+
+    </data>
+</odoo>
diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv
index fa51d84..f2d434b 100644
--- a/security/ir.model.access.csv
+++ b/security/ir.model.access.csv
@@ -1,5 +1,6 @@
-id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-access_scop_partner_dashboard_ur,access_scop_partner_dashboard_ur,model_scop_partner_dashboard_ur,base.group_user,1,0,0,0
-admin_access_scop_partner_dashboard_ur,admin_scop_partner_dashboard_ur,model_scop_partner_dashboard_ur,cgscop_partner.group_cg_administrator,1,1,1,1
-access_scop_partner_dashboard_dlg,access_scop_partner_dashboard_dlg,model_scop_partner_dashboard_dlg,base.group_user,1,0,0,0
-admin_access_scop_partner_dashboard_dlg,admin_scop_partner_dashboard_dlg,model_scop_partner_dashboard_dlg,cgscop_partner.group_cg_administrator,1,1,1,1
\ No newline at end of file
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_scop_partner_dashboard_ur,access_scop_partner_dashboard_ur,model_scop_partner_dashboard_ur,base.group_user,1,0,0,0
+admin_access_scop_partner_dashboard_ur,admin_scop_partner_dashboard_ur,model_scop_partner_dashboard_ur,cgscop_partner.group_cg_administrator,1,1,1,1
+access_scop_partner_dashboard_dlg,access_scop_partner_dashboard_dlg,model_scop_partner_dashboard_dlg,base.group_user,1,0,0,0
+admin_access_scop_partner_dashboard_dlg,admin_scop_partner_dashboard_dlg,model_scop_partner_dashboard_dlg,cgscop_partner.group_cg_administrator,1,1,1,1
+access_scop_partner_dashboard_dlg_selection_wizard,access_scop_partner_dashboard_dlg_selection_wizard,model_scop_partner_dashboard_dlg_selection_wizard,base.group_user,1,1,1,1
diff --git a/security/security_rules.xml b/security/security_rules.xml
index 82d5c9d..dd7f420 100644
--- a/security/security_rules.xml
+++ b/security/security_rules.xml
@@ -1,8 +1,7 @@
 <odoo>
-    <data noupdate="0">
-        <record model="res.groups" id="partner_dashboard_dlg_selection_group" >
+    <data>
+        <record model="res.groups" id="partner_dashboard_dlg_selection_group">
             <field name="name">Dashboard coopératives, choix du délégué</field>
         </record>
-
     </data>
 </odoo>
diff --git a/static/description/icon.png b/static/description/icon.png
index 7c4b282f22fa37ed748c5e23f644205ad340af1f..9002f6179b6459cee4ea49e69e8b5114e2f5d3d0 100644
GIT binary patch
literal 13973
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
JWt~$(69BC){|f*B

literal 9296
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

diff --git a/templates/header_dlg_template.xml b/templates/header_dlg_template.xml
index 14038e6..10bf3df 100644
--- a/templates/header_dlg_template.xml
+++ b/templates/header_dlg_template.xml
@@ -1,12 +1,19 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8" ?>
 <odoo>
-    <template id="header_dlg_template" name="cgscop_partner_dashboard.header_dlg_template">
+    <template
+        id="header_dlg_template"
+        name="cgscop_partner_dashboard.header_dlg_template"
+    >
         <div id="dash" style="background-color: #fff; padding: 16px ">
-            <div >
+            <div>
                 <div class="row">
                     <div class="col-12">
-                        <a type="action" data-method="action_open_wizard_selection" data-model="scop.partner.dashboard.dlg.selection.wizard"
-                           class="btn btn-secondary">
+                        <a
+                            type="action"
+                            data-method="action_open_wizard_selection"
+                            data-model="scop.partner.dashboard.dlg.selection.wizard"
+                            class="btn btn-secondary"
+                        >
                             Sélectionner un collaborateur
                         </a>
                     </div>
@@ -14,4 +21,4 @@
             </div>
         </div>
     </template>
-</odoo>
\ No newline at end of file
+</odoo>
diff --git a/views/res_partner.xml b/views/res_partner.xml
index b7e935c..2342af8 100644
--- a/views/res_partner.xml
+++ b/views/res_partner.xml
@@ -1,28 +1,34 @@
-<?xml version="1.0"?>
-<!-- Copyright 2020 Le Filament
-     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
-
-<odoo>
-    <data>
-            <menuitem id="contacts.menu_contacts"
-                action="coop_partner_dashboard_ur_act"
-            />
-
-            <menuitem id="res_partner_menu_dashboard"
-            name="Dashboard"
-            parent="contacts.menu_contacts"
-            sequence="05"/>
-
-            <menuitem id="res_partner_menu_dashboard_ur"
-            name="Dashboard union régionale"
-            parent="res_partner_menu_dashboard"
-            action="coop_partner_dashboard_ur_act"
-            sequence="10"/>
-
-            <menuitem id="res_partner_menu_dashboard_dlg"
-            name="Dashboard délégué"
-            parent="res_partner_menu_dashboard"
-            action="coop_partner_dashboard_dlg_act"
-            sequence="20"/>
-    </data>
-</odoo>
+<?xml version="1.0" ?>
+<!-- Copyright 2020 Le Filament
+     License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
+<odoo>
+    <data>
+            <menuitem
+            id="contacts.menu_contacts"
+            action="coop_partner_dashboard_ur_act"
+        />
+
+            <menuitem
+            id="res_partner_menu_dashboard"
+            name="Dashboard"
+            parent="contacts.menu_contacts"
+            sequence="05"
+        />
+
+            <menuitem
+            id="res_partner_menu_dashboard_ur"
+            name="Dashboard union régionale"
+            parent="res_partner_menu_dashboard"
+            action="coop_partner_dashboard_ur_act"
+            sequence="10"
+        />
+
+            <menuitem
+            id="res_partner_menu_dashboard_dlg"
+            name="Dashboard délégué"
+            parent="res_partner_menu_dashboard"
+            action="coop_partner_dashboard_dlg_act"
+            sequence="20"
+        />
+    </data>
+</odoo>
diff --git a/wizard/partner_dashboard_dlg_selection_wizard.py b/wizard/partner_dashboard_dlg_selection_wizard.py
index 25cb003..1e38b04 100644
--- a/wizard/partner_dashboard_dlg_selection_wizard.py
+++ b/wizard/partner_dashboard_dlg_selection_wizard.py
@@ -1,49 +1,51 @@
 # © 2019 Le Filament (<http://www.le-filament.com>)
+# © 2020 Confédération Générale des Scop (<https://www.les-scop.coop>)
 # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
 
-from odoo import fields, models, api
+from odoo import api, fields, models
 
 
 class ScopPartnerDashboardDlgSelectiontWizard(models.TransientModel):
-    _name = 'scop.partner.dashboard.dlg.selection.wizard'
+    _name = "scop.partner.dashboard.dlg.selection.wizard"
     _description = "Wizard de sélection du délégué"
 
     @api.model
     def _getUserDomain(self):
-        if self.env.user.has_group('cgscop_partner_dashboard.partner_dashboard_dlg_selection_group'):
-            return [('ur_id', '=',  self.env.user.company_id.ur_id.id)]
+        if self.env.user.has_group(
+            "cgscop_partner_dashboard.partner_dashboard_dlg_selection_group"
+        ):
+            return [("ur_id", "=", self.env.user.company_id.ur_id.id)]
         else:
-            return [('id', '=',  self.env.user.id)]
+            return [("id", "=", self.env.user.id)]
 
     # Fields common
     dlg_id = fields.Many2one(
-        comodel_name='res.users',
-        domain=_getUserDomain,
-        string='Collaborateur')
+        comodel_name="res.users", domain=_getUserDomain, string="Collaborateur"
+    )
 
-
-    #....................................................................................
+    # ....................................................................................
     # Affichage du wizard
-    #....................................................................................
+    # ....................................................................................
     @api.model
     def action_open_wizard_selection(self):
         action = self.env.ref(
-            'cgscop_partner_dashboard.scop_partner_dashboard_dlg_selection_act').read()[
-            0]
+            "cgscop_partner_dashboard.scop_partner_dashboard_dlg_selection_act"
+        ).read()[0]
         return action
 
-    #....................................................................................
+    # ....................................................................................
     # Affichage de la demande
-    #....................................................................................
+    # ....................................................................................
     def valid_wizard(self):
         form_id = self.env.ref(
-                    "cgscop_partner_dashboard.scop_partner_dashboard_dlg_kanban_view")
+            "cgscop_partner_dashboard.scop_partner_dashboard_dlg_kanban_view"
+        )
         return {
-            'name': 'Dashboard coopératives : '+self.dlg_id.name,
-            'type': 'ir.actions.act_window',
-            'res_model': 'scop.partner.dashboard.dlg',
-            'view_mode': 'kanban',
-            'views': [[form_id.id, 'kanban']],
-            'target': 'main',
-            'domain': [('dlg_id', '=', self.dlg_id.id)]
-        }
\ No newline at end of file
+            "name": "Dashboard coopératives : " + self.dlg_id.name,
+            "type": "ir.actions.act_window",
+            "res_model": "scop.partner.dashboard.dlg",
+            "view_mode": "kanban",
+            "views": [[form_id.id, "kanban"]],
+            "target": "main",
+            "domain": [("dlg_id", "=", self.dlg_id.id)],
+        }
diff --git a/wizard/partner_dashboard_dlg_selection_wizard.xml b/wizard/partner_dashboard_dlg_selection_wizard.xml
index 5ef6872..5970f87 100644
--- a/wizard/partner_dashboard_dlg_selection_wizard.xml
+++ b/wizard/partner_dashboard_dlg_selection_wizard.xml
@@ -1,28 +1,41 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8" ?>
 <odoo>
     <!-- WIZARD FORM -->
-    <record model="ir.ui.view" id="scop_partner_dashboard_dlg_selection_wizard" >
+    <record model="ir.ui.view" id="scop_partner_dashboard_dlg_selection_wizard">
         <field name="name">scop_partner_dashboard_dlg_selection_wizard</field>
         <field name="model">scop.partner.dashboard.dlg.selection.wizard</field>
         <field name="arch" type="xml">
             <form string="Sélection du collaborateur">
                 <group string="Collaborateur" col="2">
-                    <field name="dlg_id" options="{'no_create_edit': True, 'no_open': True}" required="1"/>
+                    <field
+                        name="dlg_id"
+                        options="{'no_create_edit': True, 'no_open': True}"
+                        required="1"
+                    />
                 </group>
                 <footer>
-                    <button class="btn btn-sm btn-primary" name="valid_wizard" string="Validation" type="object"/>
-                    <button class="btn btn-sm btn-default" special="cancel" string="Close"/>
+                    <button
+                        class="btn btn-sm btn-primary"
+                        name="valid_wizard"
+                        string="Validation"
+                        type="object"
+                    />
+                    <button
+                        class="btn btn-sm btn-default"
+                        special="cancel"
+                        string="Close"
+                    />
                 </footer>
             </form>
         </field>
     </record>
 
-    <record model="ir.actions.act_window" id="scop_partner_dashboard_dlg_selection_act" >
+    <record model="ir.actions.act_window" id="scop_partner_dashboard_dlg_selection_act">
         <field name="name">Sélection du collaborateur</field>
         <field name="type">ir.actions.act_window</field>
         <field name="res_model">scop.partner.dashboard.dlg.selection.wizard</field>
         <field name="view_mode">form</field>
-        <field name="view_id" ref="scop_partner_dashboard_dlg_selection_wizard"/>
+        <field name="view_id" ref="scop_partner_dashboard_dlg_selection_wizard" />
         <field name="target">new</field>
     </record>
 
-- 
GitLab