diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..bfd7ac53df9f103f6dc8853738c63fd364445fde --- /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 0000000000000000000000000000000000000000..d4cc423ccda9db9691205c9da83307af97b2670f --- /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 0000000000000000000000000000000000000000..e397e8ed4e3e7f7fe7785dd391bb80aa6d85575e --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..818770fb1bdc0a144e924c9a5940f0b035df8a0d --- /dev/null +++ b/.gitignore @@ -0,0 +1,75 @@ +# 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 0000000000000000000000000000000000000000..0ec187efd1bf802844749f508cda0c8f138970f9 --- /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 0000000000000000000000000000000000000000..8a5999af4419f630dda23d9366b51967b8322ed3 --- /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 0000000000000000000000000000000000000000..5b6d4b361ace92f3877993bf2848fac190d8fab6 --- /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 0000000000000000000000000000000000000000..dc6270e15be0c08da00e768a570f27c785d8630e --- /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 0000000000000000000000000000000000000000..43ea23947166ff8080219007cfae43ec54a28f8e --- /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/README.rst b/README.rst old mode 100755 new mode 100644 diff --git a/__init__.py b/__init__.py old mode 100755 new mode 100644 diff --git a/__manifest__.py b/__manifest__.py old mode 100755 new mode 100644 index 9ff98a8e160e52c689f84f05bbd6b3b47a370533..00e1c4d5e1d47c4f16098f8175122c1ca3ac9652 --- a/__manifest__.py +++ b/__manifest__.py @@ -2,24 +2,22 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { - 'name': "CG Scop - Account ARESCOP", - 'summary': "Gestion de la Facturation ARESCOP National", - 'author': "Le Filament", - 'website': "https://www.le-filament.com", - 'version': '12.0.1.0.2', - 'license': "AGPL-3", - 'depends': [ - 'cgscop_account', 'cgscop_cotisation' - ], - 'data': [ + "name": "CG Scop - Account ARESCOP", + "summary": "Gestion de la Facturation ARESCOP National", + "author": "Le Filament", + "website": "https://www.le-filament.com", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "depends": ["cgscop_account", "cgscop_cotisation"], + "data": [ # Security - 'security/ir.model.access.csv', - 'security/security_group.xml', + "security/ir.model.access.csv", + "security/security_group.xml", # Datas - 'datas/res_company_data.xml', + "datas/res_company_data.xml", # Views - 'views/account_invoice.xml', - 'views/product.xml', - 'views/res_users.xml', + "views/account_move.xml", + "views/product.xml", + "views/res_users.xml", ], } diff --git a/datas/res_company_data.xml b/datas/res_company_data.xml old mode 100755 new mode 100644 index c64dc9d05beda711f2f304d009b5818030f965ef..2c07e65cdbd338430a9a18b9624255517433f880 --- a/datas/res_company_data.xml +++ b/datas/res_company_data.xml @@ -1,11 +1,10 @@ -<?xml version="1.0"?> +<?xml version="1.0" ?> <!-- Copyright 2021 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - <odoo> - <data noupdate="1"> - <record id="company_arescop" model="res.company"> - <field name="name">ARESCOP Nationale</field> - </record> - </data> -</odoo> \ No newline at end of file + <data noupdate="1"> + <record id="company_arescop" model="res.company"> + <field name="name">ARESCOP Nationale</field> + </record> + </data> +</odoo> diff --git a/models/__init__.py b/models/__init__.py old mode 100755 new mode 100644 index 5cb9155cb957ae6d07c90ca04cf4a04f3f427b49..61996b0ed2648b97aca8a049e78bf73c17268a48 --- a/models/__init__.py +++ b/models/__init__.py @@ -2,7 +2,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import scop_arescop_group -from . import account_invoice +from . import account_move from . import ir_ui_menu from . import product from . import res_users diff --git a/models/account_invoice.py b/models/account_invoice.py deleted file mode 100755 index 7f133fe0f2d1c08ab5f4d3709e58c9ea4d4ac593..0000000000000000000000000000000000000000 --- a/models/account_invoice.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2020 Le Filament (<http://www.le-filament.com>) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). - -from odoo import models, fields, api - - -class AccountInvoice(models.Model): - _inherit = "account.invoice" - - @api.model - def _default_arescop_group_id(self): - if self.env.user.company_id == self.env.ref('cgscop_account_arescop.company_arescop'): - return self.env.user.arescop_group_id.id - - arescop_group_id = fields.Many2one( - comodel_name='scop.arescop.group', - string='Groupe ARESCOP', - default=_default_arescop_group_id - ) - is_arescop_invoiced = fields.Boolean( - string="Re-facturé ARESCOP", - default=False, - track_visibility="onchange" - ) diff --git a/models/account_move.py b/models/account_move.py new file mode 100644 index 0000000000000000000000000000000000000000..ab65990008a63f76e7f379d1e6fb2d0daf725343 --- /dev/null +++ b/models/account_move.py @@ -0,0 +1,28 @@ +# Copyright 2020 Le Filament (<http://www.le-filament.com>) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class AccountMove(models.Model): + _inherit = "account.move" + + @api.model + def _default_arescop_group_id(self): + try: + company_id = self.env.ref("cgscop_account_arescop.company_arescop") + if company_id.id in self._context.get("allowed_company_ids"): + return self.env.user.arescop_group_id.id + else: + return False + except Exception: + return False + + arescop_group_id = fields.Many2one( + comodel_name="scop.arescop.group", + string="Groupe ARESCOP", + default=_default_arescop_group_id, + ) + is_arescop_invoiced = fields.Boolean( + string="Re-facturé ARESCOP", default=False, tracking=1 + ) diff --git a/models/ir_ui_menu.py b/models/ir_ui_menu.py index ebc6f160907a4aaa753733244df46563f2a46159..447549ba1eaee8f03d34f70973a882ac9ac0bb9e 100644 --- a/models/ir_ui_menu.py +++ b/models/ir_ui_menu.py @@ -1,14 +1,14 @@ # Copyright 2021 Le Filament # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import models, api, tools +from odoo import api, models, tools class IrUiMenuArescop(models.Model): - _inherit = 'ir.ui.menu' + _inherit = "ir.ui.menu" @api.model - @tools.ormcache('frozenset(self.env.user.groups_id.ids)', 'debug') + @tools.ormcache("frozenset(self.env.user.groups_id.ids)", "debug") def _visible_menu_ids(self, debug=False): """ Remove account menu for ARESCOP users @@ -18,8 +18,10 @@ class IrUiMenuArescop(models.Model): menus = super(IrUiMenuArescop, self)._visible_menu_ids(debug) menu_ids = self.browse(list(menus)) visible_menu_ids = menu_ids - arescop_company_id = self.env.ref('cgscop_account_arescop.company_arescop') - if self.env.user.company_id == arescop_company_id and self.env.user.has_group('cgscop_account_arescop.group_cg_arescop_ur'): - visible_menu_ids = visible_menu_ids - self.env.ref('account.menu_finance') + arescop_company_id = self.env.ref("cgscop_account_arescop.company_arescop") + if self.env.user.company_id == arescop_company_id and self.env.user.has_group( + "cgscop_account_arescop.group_cg_arescop_ur" + ): + visible_menu_ids = visible_menu_ids - self.env.ref("account.menu_finance") return set(visible_menu_ids.ids) diff --git a/models/product.py b/models/product.py old mode 100755 new mode 100644 index 127c625bd4f5d75146206881171caf1f5cd48d89..d525dff1bba9361c5442dd2f9866fc978f3de2c0 --- a/models/product.py +++ b/models/product.py @@ -1,7 +1,7 @@ # Copyright 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api +from odoo import api, fields, models class Product(models.Model): @@ -9,11 +9,17 @@ class Product(models.Model): @api.model def _default_arescop_group_id(self): - if self.env.user.company_id == self.env.ref('cgscop_account_arescop.company_arescop'): - return self.env.user.arescop_group_id.id + try: + company_id = self.env.ref("cgscop_account_arescop.company_arescop") + if company_id.id in self._context.get("allowed_company_ids"): + return self.env.user.arescop_group_id.id + else: + return False + except Exception: + return False arescop_group_id = fields.Many2one( - comodel_name='scop.arescop.group', - string='Groupe ARESCOP', - default=_default_arescop_group_id + comodel_name="scop.arescop.group", + string="Groupe ARESCOP", + default=_default_arescop_group_id, ) diff --git a/models/res_users.py b/models/res_users.py old mode 100755 new mode 100644 index b1b79ab2875791d6228ae239a986c5081d5258f0..2d46765a78f39b30a0035ae0f4525e1b4073f174 --- a/models/res_users.py +++ b/models/res_users.py @@ -1,15 +1,13 @@ # Copyright 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api +from odoo import fields, models class ResUsers(models.Model): _inherit = "res.users" arescop_group_id = fields.Many2one( - comodel_name='scop.arescop.group', - string='Groupe ARESCOP', + comodel_name="scop.arescop.group", + string="Groupe ARESCOP", ) - - diff --git a/models/scop_arescop_group.py b/models/scop_arescop_group.py old mode 100755 new mode 100644 index 5c8e3c3adf30ca715b31a4b3f8a07afb61350bc4..e59ea5826e9325ca1b6d0a82a40c26e97a7bf8ac --- a/models/scop_arescop_group.py +++ b/models/scop_arescop_group.py @@ -1,11 +1,11 @@ # Copyright 2020 Le Filament (<http://www.le-filament.com>) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api +from odoo import fields, models class ScopArescopGroup(models.Model): _name = "scop.arescop.group" _description = "Groupes de facturation ARESCOP" - name = fields.Char('Nom', required=True, index=True) + name = fields.Char("Nom", required=True, index=True) diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv old mode 100755 new mode 100644 index 4bc8e050cf6cd357a61cb8f89bb2c7b636af383a..8d4add04a2ec107069b85fe245a2a29aa0f388b8 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,3 +1,3 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_scop_arescop_group,access_scop_arescop_group,model_scop_arescop_group,base.group_user,1,0,0,0 -access_scop_arescop_group_admin,access_scop_arescop_group_admin,model_scop_arescop_group,cgscop_partner.group_cg_administrator,1,1,1,1 \ No newline at end of file +access_scop_arescop_group_admin,access_scop_arescop_group_admin,model_scop_arescop_group,cgscop_partner.group_cg_administrator,1,1,1,1 diff --git a/security/security_group.xml b/security/security_group.xml index 2ab66dde4f8695d602f46bb701597ceb8adac902..f1eeffe24b157b1d85547a5dc0b2f5c70ae293c2 100644 --- a/security/security_group.xml +++ b/security/security_group.xml @@ -1,66 +1,79 @@ -<?xml version="1.0"?> +<?xml version="1.0" ?> <!-- Copyright 2019 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - <odoo> - <data noupdate="0"> + <data> <!-- Categories & Groups --> - <!-- Add Liasse Fiscale category --> - <record model="ir.module.category" id="cgscop_account_arescop_module_category_1"> - <field name="name">Facturation ARESCOP National</field> + <!-- Add Category --> + <record + model="ir.module.category" + id="cgscop_account_arescop_module_category_1" + > + <field name="name">Facturation ARESCOP National</field> + <field name="parent_id" ref="cgscop_partner.module_cgscop_category" /> </record> <!-- Add ARESCOP groups --> <record id="group_cg_arescop_ur" model="res.groups"> <field name="name">UR utilisateur seulement</field> - <field name="category_id" ref="cgscop_account_arescop_module_category_1"/> - <field name="implied_ids" eval="[(6, 0, [ref('account.group_account_user')])]"/> + <field name="category_id" ref="cgscop_account_arescop_module_category_1" /> + <field + name="implied_ids" + eval="[(6, 0, [ref('account.group_account_user')])]" + /> </record> <record id="group_cg_arescop_cg" model="res.groups"> <field name="name">Toutes les UR</field> - <field name="category_id" ref="cgscop_account_arescop_module_category_1"/> - <field name="implied_ids" eval="[(6, 0, [ref('account.group_account_user')])]"/> + <field name="category_id" ref="cgscop_account_arescop_module_category_1" /> + <field + name="implied_ids" + eval="[(6, 0, [ref('account.group_account_user')])]" + /> </record> <!-- Rules --> <record id="scop_account_arescop_ur" model="ir.rule"> <field name="name">ARESCOP : Factures de son UR</field> - <field name="model_id" ref="account.model_account_invoice"/> - <field name="domain_force">['|', ('arescop_group_id', '=', False), ('arescop_group_id', '=', user.arescop_group_id.id)]</field> - <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_ur')])]"/> - <field name="perm_read" eval="True"/> - <field name="perm_write" eval="True"/> - <field name="perm_create" eval="True"/> - <field name="perm_unlink" eval="True"/> + <field name="model_id" ref="account.model_account_move" /> + <field + name="domain_force" + >['|', ('arescop_group_id', '=', False), ('arescop_group_id', '=', user.arescop_group_id.id)]</field> + <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_ur')])]" /> + <field name="perm_read" eval="True" /> + <field name="perm_write" eval="True" /> + <field name="perm_create" eval="True" /> + <field name="perm_unlink" eval="True" /> </record> <record id="scop_account_arescop_cg" model="ir.rule"> <field name="name">ARESCOP : Toutes les factures</field> - <field name="model_id" ref="account.model_account_invoice"/> + <field name="model_id" ref="account.model_account_move" /> <field name="domain_force">[(1, '=', 1)]</field> - <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_cg')])]"/> + <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_cg')])]" /> </record> <record id="scop_product_arescop_ur" model="ir.rule"> <field name="name">ARESCOP : Produits de son UR</field> - <field name="model_id" ref="product.model_product_product"/> - <field name="domain_force">['|', ('arescop_group_id', '=', False), ('arescop_group_id', '=', user.arescop_group_id.id)]</field> - <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_ur')])]"/> - <field name="perm_read" eval="True"/> - <field name="perm_write" eval="True"/> - <field name="perm_create" eval="True"/> - <field name="perm_unlink" eval="True"/> + <field name="model_id" ref="product.model_product_product" /> + <field + name="domain_force" + >['|', ('arescop_group_id', '=', False), ('arescop_group_id', '=', user.arescop_group_id.id)]</field> + <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_ur')])]" /> + <field name="perm_read" eval="True" /> + <field name="perm_write" eval="True" /> + <field name="perm_create" eval="True" /> + <field name="perm_unlink" eval="True" /> </record> <record id="scop_product_arescop_cg" model="ir.rule"> <field name="name">ARESCOP : Tous les produits</field> - <field name="model_id" ref="product.model_product_product"/> + <field name="model_id" ref="product.model_product_product" /> <field name="domain_force">[(1, '=', 1)]</field> - <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_cg')])]"/> + <field name="groups" eval="[(6, 0, [ref('group_cg_arescop_cg')])]" /> </record> </data> -</odoo> \ No newline at end of file +</odoo> diff --git a/static/description/icon.png b/static/description/icon.png old mode 100755 new mode 100644 index 82ef47760a441cf229b5009f0a18ccf3842fbfa5..499652a2c9c0307f875bafc145b6fbafa133da72 Binary files a/static/description/icon.png and b/static/description/icon.png differ diff --git a/views/account_invoice.xml b/views/account_invoice.xml deleted file mode 100755 index 9e7d8a9a9915af018254735ea0ad1efd9fe93863..0000000000000000000000000000000000000000 --- a/views/account_invoice.xml +++ /dev/null @@ -1,93 +0,0 @@ -<?xml version="1.0"?> -<!-- Copyright 2020 Le Filament - License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - -<odoo> - <data> - <!-- FORM --> - <record id="account_invoice_arescop_form" model="ir.ui.view"> - <field name="name">account.invoice.arescop.form</field> - <field name="model">account.invoice</field> - <field name="inherit_id" ref="account.invoice_form"/> - <field name="arch" type="xml"> - <xpath expr="//field[@name='user_id']" position="after"> - <field name="is_arescop_invoiced" attrs="{'invisible': [('company_id', '!=', %(cgscop_account_arescop.company_arescop)d)]}"/> - <field name="arescop_group_id" - options="{'no_create': 1, 'no_edit': 1}" - attrs="{'invisible': [('company_id', '!=', %(cgscop_account_arescop.company_arescop)d)]}" - groups="cgscop_account_arescop.group_cg_arescop_cg"/> - </xpath> - </field> - </record> - - <!-- SEARCH --> - <record id="view_account_invoice_arescop_filter" model="ir.ui.view"> - <field name="name">account.invoice.arescop.search</field> - <field name="model">account.invoice</field> - <field name="arch" type="xml"> - <search string="Search Invoice"> - <field name="number" string="Facture" context="{'active_test': False}" filter_domain="['|','|','|', ('number','ilike',self), ('origin','ilike',self), ('reference', 'ilike', self), ('partner_id', 'child_of', self)]"/> - <filter domain="[('user_id','=',uid)]" name="myinvoices" help="Mes factures"/> - <separator/> - <filter name="draft" string="Brouillon" domain="[('state','=','draft')]"/> - <filter name="unpaid" string="Ouvert" domain="[('state', '=', 'open')]"/> - <filter name="in_payment" string="En Paiement" domain="[('state', '=', 'in_payment')]"/> - <filter name="paid" string="Payé" domain="[('state', '=', 'paid')]"/> - <filter name="late" string="En Retard" domain="['&', ('date_due', '<', time.strftime('%%Y-%%m-%%d')), ('state', '=', 'open')]" help="Overdue invoices, maturity date passed"/> - <separator/> - <filter name="to_invoice_arescop" string="À facturer à ARESCOP" domain="[('is_arescop_invoiced', '=', False),('state', '=', 'paid')]"/> - <filter name="invoiced_arescop" string="Facturé à ARESCOP" domain="[('is_arescop_invoiced', '=', True),('state', '=', 'paid')]"/> - <field name="partner_id" operator="child_of"/> - <field name="user_id" string="Vendeur" domain="[('share','=', False)]"/> - <field name="date" string="Period"/> - <group expand="0" string="Group By"> - <filter name="group_by_partner_id" string="Client" context="{'group_by':'commercial_partner_id'}"/> - <filter string="Vendeur" name="salesperson" context="{'group_by':'user_id'}"/> - <filter name="status" string="Statut" context="{'group_by':'state'}"/> - <separator/> - <filter string="Date de Facturation" name="invoicedate" context="{'group_by':'date_invoice'}"/> - <filter string="Due d'Echéance" name="duedate" context="{'group_by':'date_due'}"/> - </group> - </search> - </field> - </record> - - - <!-- ACTION --> - <record id="action_arescop_invoice" model="ir.actions.act_window"> - <field name="name">Factures</field> - <field name="res_model">account.invoice</field> - <field name="view_type">form</field> - <field name="view_mode">tree,kanban,form,calendar,pivot,graph,activity</field> - <field name="view_id" ref="account.invoice_tree"/> - <field name="domain">[('type','in',('out_invoice', 'out_refund'))]</field> - <field name="context">{'type':'out_invoice', 'journal_type': 'sale'}</field> - <field name="search_view_id" ref="cgscop_account_arescop.view_account_invoice_arescop_filter"/> - </record> - <record id="action_invoice_customer_tree" model="ir.actions.act_window.view"> - <field eval="1" name="sequence"/> - <field name="view_mode">tree</field> - <field name="view_id" ref="account.invoice_tree"/> - <field name="act_window_id" ref="action_arescop_invoice"/> - </record> - <record id="action_invoice_customer_form" model="ir.actions.act_window.view"> - <field eval="2" name="sequence"/> - <field name="view_mode">form</field> - <field name="view_id" ref="account.invoice_form"/> - <field name="act_window_id" ref="action_arescop_invoice"/> - </record> - - <!-- MENU --> - <menuitem id="menu_scop_arescop_root" - name="Facturation ARESCOP" - sequence="70" - groups="cgscop_account_arescop.group_cg_arescop_ur" - web_icon="cgscop_account_arescop,static/description/arescop.png"/> - <menuitem id="menu_scop_arescop_invoice" - parent="menu_scop_arescop_root" - action="action_arescop_invoice" - sequence="10"/> - - - </data> -</odoo> diff --git a/views/account_move.xml b/views/account_move.xml new file mode 100644 index 0000000000000000000000000000000000000000..4202fc64f5634ff56fc363f2f70e559592fb97f1 --- /dev/null +++ b/views/account_move.xml @@ -0,0 +1,168 @@ +<?xml version="1.0" ?> +<!-- Copyright 2020 Le Filament + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> +<odoo> + <data> + <!-- FORM --> + <record id="account_move_arescop_form" model="ir.ui.view"> + <field name="name">account.move.arescop.form</field> + <field name="model">account.move</field> + <field name="inherit_id" ref="account.view_move_form" /> + <field name="arch" type="xml"> + <xpath expr="//field[@name='user_id']" position="after"> + <field + name="is_arescop_invoiced" + attrs="{'invisible': [('company_id', '!=', %(cgscop_account_arescop.company_arescop)d)]}" + /> + <field + name="arescop_group_id" + options="{'no_create': 1, 'no_edit': 1}" + attrs="{'invisible': [('company_id', '!=', %(cgscop_account_arescop.company_arescop)d)]}" + groups="cgscop_account_arescop.group_cg_arescop_cg" + /> + </xpath> + </field> + </record> + + <!-- SEARCH --> + <record id="view_account_move_arescop_filter" model="ir.ui.view"> + <field name="name">account.move.arescop.search</field> + <field name="model">account.move</field> + <field name="arch" type="xml"> + <search string="Search Invoice"> + <field + name="name" + string="Facture" + context="{'active_test': False}" + filter_domain="['|','|','|', ('name','ilike',self), ('invoice_origin','ilike',self), ('reference', 'ilike', self), ('partner_id', 'child_of', self)]" + /> + <field name="partner_id" operator="child_of" /> + <field + name="invoice_user_id" + string="Salesperson" + domain="[('share', '=', False)]" + /> + <field name="date" string="Period" /> + <filter + domain="[('invoice_user_id','=',uid)]" + name="myinvoices" + help="Mes factures" + /> + <separator /> + <filter + name="draft" + string="Brouillon" + domain="[('state','=','draft')]" + /> + <filter + name="unpaid" + string="Ouvert" + domain="[('state', '=', 'posted'),('payment_state', '=', 'not_paid')]" + /> + <filter + name="in_payment" + string="En Paiement" + domain="[('state', '=', 'posted'),('payment_state', '=', 'in_payment')]" + /> + <filter + name="paid" + string="Payé" + domain="[('state', '=', 'posted'),('payment_state', '=', 'paid')]" + /> + <filter + name="late" + string="En Retard" + domain="['&', ('invoice_date_due', '<', time.strftime('%%Y-%%m-%%d')), ('state', '=', 'posted'), ('payment_state', 'in', ('not_paid', 'partial'))]" + help="Overdue invoices, maturity date passed" + /> + <separator /> + <filter + name="to_invoice_arescop" + string="À facturer à ARESCOP" + domain="[('is_arescop_invoiced', '=', False),('state', '=', 'posted')]" + /> + <filter + name="invoiced_arescop" + string="Facturé à ARESCOP" + domain="[('is_arescop_invoiced', '=', True),('state', '=', 'posted')]" + /> + <group expand="0" string="Group By"> + <filter + name="group_by_partner_id" + string="Client" + context="{'group_by':'commercial_partner_id'}" + /> + <filter + string="Vendeur" + name="salesperson" + context="{'group_by':'user_id'}" + /> + <filter + name="status" + string="Statut" + context="{'group_by':'state'}" + /> + <separator /> + <filter + string="Date de Facturation" + name="invoicedate" + context="{'group_by':'invoice_date'}" + /> + <filter + string="Due d'Echéance" + name="duedate" + context="{'group_by':'invoice_date_due'}" + /> + </group> + </search> + </field> + </record> + + + <!-- ACTION --> + <record id="action_arescop_account_move" model="ir.actions.act_window"> + <field name="name">Factures</field> + <field name="res_model">account.move</field> + <field name="view_mode">tree,kanban,form,pivot,graph</field> + <field + name="domain" + >[('move_type','in',('out_invoice', 'out_refund'))]</field> + <field + name="context" + >{'move_type':'out_invoice', 'journal_type': 'sale'}</field> + <field + name="search_view_id" + ref="cgscop_account_arescop.view_account_move_arescop_filter" + /> + </record> + <record id="action_invoice_customer_tree" model="ir.actions.act_window.view"> + <field eval="1" name="sequence" /> + <field name="view_mode">tree</field> + <field name="view_id" ref="account.view_out_invoice_tree" /> + <field name="act_window_id" ref="action_arescop_account_move" /> + </record> + <record id="action_invoice_customer_form" model="ir.actions.act_window.view"> + <field eval="2" name="sequence" /> + <field name="view_mode">form</field> + <field name="view_id" ref="account.view_move_form" /> + <field name="act_window_id" ref="action_arescop_account_move" /> + </record> + + <!-- MENU --> + <menuitem + id="menu_scop_arescop_root" + name="Facturation ARESCOP" + sequence="70" + groups="cgscop_account_arescop.group_cg_arescop_ur" + web_icon="cgscop_account_arescop,static/description/arescop.png" + /> + <menuitem + id="menu_scop_arescop_move" + parent="menu_scop_arescop_root" + action="action_arescop_account_move" + sequence="10" + /> + + + </data> +</odoo> diff --git a/views/product.xml b/views/product.xml old mode 100755 new mode 100644 index fa0eaad95584e594993060911a3ae9623f96c2b8..21f416baac86d0eea666f00215dadd67b4e88092 --- a/views/product.xml +++ b/views/product.xml @@ -1,20 +1,21 @@ -<?xml version="1.0"?> +<?xml version="1.0" ?> <!-- Copyright 2020 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - <odoo> <data> <!-- FORM --> <record id="product_arescop_form_view" model="ir.ui.view"> <field name="name">product.arescop.form</field> <field name="model">product.product</field> - <field name="inherit_id" ref="product.product_normal_form_view"/> + <field name="inherit_id" ref="product.product_normal_form_view" /> <field name="arch" type="xml"> <xpath expr="//field[@name='company_id']" position="after"> - <field name="arescop_group_id" - options="{'no_create': 1, 'no_edit': 1}" - attrs="{'invisible': [('company_id', '!=', %(cgscop_account_arescop.company_arescop)d)]}" - groups="cgscop_account_arescop.group_cg_arescop_cg"/> + <field + name="arescop_group_id" + options="{'no_create': 1, 'no_edit': 1}" + attrs="{'invisible': [('company_id', '!=', %(cgscop_account_arescop.company_arescop)d)]}" + groups="cgscop_account_arescop.group_cg_arescop_cg" + /> </xpath> </field> </record> @@ -33,9 +34,11 @@ </record> <!-- MENU --> - <menuitem id="menu_scop_arescop_product" - parent="menu_scop_arescop_root" - action="action_arescop_product" - sequence="10"/> + <menuitem + id="menu_scop_arescop_product" + parent="menu_scop_arescop_root" + action="action_arescop_product" + sequence="10" + /> </data> </odoo> diff --git a/views/res_users.xml b/views/res_users.xml old mode 100755 new mode 100644 index 1a5496396f577b7dbff566ee3f319e2e0ecd319f..55cc9f8d5557ad9085a98858cc97e405061303c6 --- a/views/res_users.xml +++ b/views/res_users.xml @@ -1,7 +1,6 @@ -<?xml version="1.0"?> +<?xml version="1.0" ?> <!-- Copyright 2020 Le Filament License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). --> - <odoo> <data> <!-- FORM --> @@ -9,10 +8,13 @@ <record id="scop_arescop_user" model="ir.ui.view"> <field name="name">res.users.arescop.form</field> <field name="model">res.users</field> - <field name="inherit_id" ref="base.view_users_form"/> + <field name="inherit_id" ref="base.view_users_form" /> <field name="arch" type="xml"> <xpath expr="//field[@name='companies_count']" position="after"> - <field name="arescop_group_id" options="{'no_create': 1, 'no_edit': 1}"/> + <field + name="arescop_group_id" + options="{'no_create': 1, 'no_edit': 1}" + /> </xpath> </field> </record> @@ -25,10 +27,12 @@ </record> <!-- MENU --> - <menuitem id="menu_scop_arescop_groups" - parent="base.menu_users" - action="action_arescop_groups" - sequence="80"/> + <menuitem + id="menu_scop_arescop_groups" + parent="base.menu_users" + action="action_arescop_groups" + sequence="80" + /> </data>