From b1910f0e99c7fcd60f052e40319c641d7bf0dc0d Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Fri, 10 Apr 2020 16:50:12 +0200 Subject: [PATCH 01/29] setup travis --- .eslintrc | 291 ++++++++++++++++++++++++++++++++++++++++ .flake8 | 10 ++ .gitignore | 27 +++- .isort.cfg | 12 ++ .pre-commit-config.yaml | 69 ++++++++++ .pylintrc | 86 ++++++++++++ .pylintrc-mandatory | 64 +++++++++ .travis.yml | 36 +++++ 8 files changed, 589 insertions(+), 6 deletions(-) create mode 100644 .eslintrc create mode 100644 .flake8 create mode 100644 .isort.cfg create mode 100644 .pre-commit-config.yaml create mode 100644 .pylintrc create mode 100644 .pylintrc-mandatory create mode 100644 .travis.yml diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..28a0808 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,291 @@ +{ + "globals": { + "$": false, + "_": false, + "fuzzy": false, + "jQuery": false, + "moment": false, + "odoo": false, + "openerp": false, + "self": false + }, + "env": { + "browser": true + }, + "rules": { + "no-alert": "warn", + "no-array-constructor": "warn", + "no-bitwise": "off", + "no-caller": "warn", + "no-case-declarations": "warn", + "no-catch-shadow": "warn", + "no-class-assign": "warn", + "no-cond-assign": "warn", + "no-confusing-arrow": "warn", + "no-console": "off", + "no-const-assign": "warn", + "no-constant-condition": "warn", + "no-continue": "off", + "no-control-regex": "warn", + "no-debugger": "warn", + "no-delete-var": "warn", + "no-div-regex": "warn", + "no-dupe-args": "warn", + "no-dupe-class-members": "warn", + "no-dupe-keys": "warn", + "no-duplicate-case": "warn", + "no-duplicate-imports": "warn", + "no-else-return": "warn", + "no-empty": "warn", + "no-empty-character-class": "warn", + "no-empty-function": "warn", + "no-empty-pattern": "warn", + "no-eq-null": "warn", + "no-eval": "warn", + "no-ex-assign": "warn", + "no-extend-native": "warn", + "no-extra-bind": "warn", + "no-extra-boolean-cast": "warn", + "no-extra-label": "warn", + "no-extra-parens": "warn", + "no-extra-semi": "warn", + "no-fallthrough": "warn", + "no-floating-decimal": "warn", + "no-func-assign": "warn", + "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-invalid-this": "off", + "no-irregular-whitespace": "warn", + "no-iterator": "warn", + "no-label-var": "warn", + "no-labels": "warn", + "no-lone-blocks": "warn", + "no-lonely-if": "warn", + "no-loop-func": "off", + "no-magic-numbers": "off", + "no-mixed-operators": "warn", + "no-mixed-requires": "warn", + "no-mixed-spaces-and-tabs": "warn", + "no-multi-spaces": "warn", + "no-multi-str": "warn", + "no-multiple-empty-lines": "warn", + "no-native-reassign": "warn", + "no-negated-condition": "warn", + "no-negated-in-lhs": "warn", + "no-nested-ternary": "off", + "no-new": "warn", + "no-new-func": "warn", + "no-new-object": "warn", + "no-new-require": "warn", + "no-new-symbol": "warn", + "no-new-wrappers": "warn", + "no-obj-calls": "warn", + "no-octal": "warn", + "no-octal-escape": "warn", + "no-param-reassign": "warn", + "no-path-concat": "warn", + "no-plusplus": "off", + "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": "warn", + "no-script-url": "warn", + "no-self-assign": "warn", + "no-self-compare": "warn", + "no-sequences": "warn", + "no-shadow": "warn", + "no-shadow-restricted-names": "warn", + "no-whitespace-before-property": "warn", + "no-spaced-func": "warn", + "no-sparse-arrays": "warn", + "no-sync": "warn", + "no-tabs": "warn", + "no-ternary": "off", + "no-trailing-spaces": "warn", + "no-this-before-super": "warn", + "no-throw-literal": "warn", + "no-undef": "warn", + "no-undef-init": "warn", + "no-undefined": "off", + "no-unexpected-multiline": "warn", + "no-underscore-dangle": "off", + "no-unmodified-loop-condition": "warn", + "no-unneeded-ternary": "warn", + "no-unreachable": "warn", + "no-unsafe-finally": "warn", + "no-unused-expressions": "warn", + "no-unused-labels": "warn", + "no-unused-vars": "warn", + "no-use-before-define": "warn", + "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-var": "off", + "no-warning-comments": "off", + "no-with": "warn", + "array-bracket-spacing": "off", + "array-callback-return": "warn", + "arrow-body-style": "warn", + "arrow-parens": "warn", + "arrow-spacing": "off", + "accessor-pairs": "warn", + "block-scoped-var": "off", + "block-spacing": ["warn", "always"], + "brace-style": "warn", + "callback-return": "warn", + "camelcase": "off", + "capitalized-comments": ["warn", "always", { + "ignoreConsecutiveComments": true, + "ignoreInlineComments": true + }], + "comma-dangle": ["warn", "always-multiline"], + "comma-spacing": ["warn", { + "before": false, + "after": true + }], + "comma-style": "warn", + "complexity": [ + "warn", + 15 + ], + "computed-property-spacing": "off", + "consistent-return": "off", + "consistent-this": "off", + "constructor-super": "warn", + "curly": "warn", + "default-case": "off", + "dot-location": ["warn", "property"], + "dot-notation": "warn", + "eol-last": "warn", + "eqeqeq": "warn", + "func-names": "off", + "func-style": "off", + "generator-star-spacing": "off", + "global-require": "warn", + "guard-for-in": "off", + "handle-callback-err": "warn", + "id-blacklist": "warn", + "id-length": "off", + "id-match": "warn", + "indent": "warn", + "init-declarations": "warn", + "jsx-quotes": "warn", + "key-spacing": "off", + "keyword-spacing": "warn", + "linebreak-style": [ + "warn", + "unix" + ], + "lines-around-comment": "warn", + "max-depth": "warn", + "max-len": ["warn", { + "code": 88, + "ignorePattern": "odoo\\.define\\(", + "tabWidth": 4 + }], + "max-lines": "off", + "max-nested-callbacks": "warn", + "max-params": "off", + "max-statements": "off", + "max-statements-per-line": "warn", + "multiline-ternary": "off", + "new-cap": "off", + "new-parens": "warn", + "newline-after-var": "off", + "newline-before-return": "off", + "newline-per-chained-call": "off", + "object-curly-newline": ["warn", { "consistent": true }], + "object-curly-spacing": ["warn", "never"], + "object-property-newline": ["warn", { + "allowAllPropertiesOnSameLine": true + }], + "object-shorthand": "off", + "one-var": "off", + "one-var-declaration-per-line": "off", + "operator-assignment": "warn", + "operator-linebreak": "warn", + "padded-blocks": "off", + "prefer-arrow-callback": "off", + "prefer-const": "warn", + "prefer-reflect": "off", + "prefer-rest-params": "off", + "prefer-spread": "off", + "prefer-template": "off", + "quote-props": "off", + "quotes": "off", + "radix": "warn", + "require-yield": "warn", + "rest-spread-spacing": "off", + "semi": [ + "warn", + "always" + ], + "semi-spacing": "warn", + "sort-imports": "warn", + "sort-vars": "off", + "space-before-blocks": "warn", + "space-before-function-paren": "warn", + "space-in-parens": "off", + "space-infix-ops": "off", + "space-unary-ops": "off", + "spaced-comment": ["warn", "always"], + "strict": ["warn", "function"], + "template-curly-spacing": "off", + "unicode-bom": "warn", + "use-isnan": "warn", + "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", + "vars-on-top": "off", + "wrap-iife": "warn", + "wrap-regex": "warn", + "yield-star-spacing": "off", + "yoda": "warn" + }, + "parserOptions": { + "ecmaVersion": 2017 + } +} diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..2cac7e9 --- /dev/null +++ b/.flake8 @@ -0,0 +1,10 @@ +[flake8] +max-line-length = 79 +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 diff --git a/.gitignore b/.gitignore index 72364f9..894a44c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,6 @@ __pycache__/ # Distribution / packaging .Python -env/ build/ develop-eggs/ dist/ @@ -20,9 +19,11 @@ lib64/ parts/ sdist/ var/ +wheels/ *.egg-info/ .installed.cfg *.egg +MANIFEST # PyInstaller # Usually these files are written by a python script from a template @@ -42,8 +43,9 @@ htmlcov/ .cache nosetests.xml coverage.xml -*,cover +*.cover .hypothesis/ +.pytest_cache/ # Translations *.mo @@ -52,6 +54,7 @@ coverage.xml # Django stuff: *.log local_settings.py +db.sqlite3 # Flask stuff: instance/ @@ -66,7 +69,7 @@ docs/_build/ # PyBuilder target/ -# IPython Notebook +# Jupyter Notebook .ipynb_checkpoints # pyenv @@ -75,15 +78,27 @@ target/ # celery beat schedule file celerybeat-schedule -# dotenv -.env +# SageMath parsed files +*.sage.py -# virtualenv +# Environments +.env +.venv +env/ venv/ ENV/ +env.bak/ +venv.bak/ # Spyder project settings .spyderproject +.spyproject # Rope project settings .ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..ed8c868 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,12 @@ +[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=79 +known_odoo=odoo +known_odoo_addons=odoo.addons +sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER +known_third_party=dateutil,phonenumbers diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..3ce9088 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,69 @@ +exclude: "^setup/|/static/lib/|/static/src/lib/" +default_language_version: + python: python3 +repos: +- repo: https://github.com/psf/black + rev: 19.3b0 + hooks: + - id: black + args: [-l 79] +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.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: flake8 + name: flake8 except __init__.py + exclude: /__init__\.py$ + additional_dependencies: ["flake8-bugbear==19.8.0"] + - id: flake8 + name: flake8 only __init__.py + args: ["--extend-ignore=F401"] # ignore unused imports in __init__.py + files: /__init__\.py$ + additional_dependencies: ["flake8-bugbear==19.8.0"] + - id: fix-encoding-pragma + args: ["--remove"] + - id: check-case-conflict + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-merge-conflict + - id: check-symlinks + - id: check-xml + - id: mixed-line-ending + args: ["--fix=lf"] +- repo: https://github.com/pre-commit/mirrors-pylint + rev: v2.3.1 + hooks: + - id: pylint + name: pylint with optional checks + args: ["--rcfile=.pylintrc", "--exit-zero"] + verbose: true + additional_dependencies: ["pylint-odoo==3.0.3"] + - id: pylint + name: pylint with mandatory checks + args: ["--rcfile=.pylintrc-mandatory"] + additional_dependencies: ["pylint-odoo==3.0.3"] +- repo: https://github.com/asottile/pyupgrade + rev: v1.24.0 + hooks: + - id: pyupgrade +- repo: https://github.com/asottile/seed-isort-config + rev: v1.9.3 + hooks: + - id: seed-isort-config +- repo: https://github.com/pre-commit/mirrors-isort + rev: v4.3.21 + hooks: + - id: isort + name: isort except __init__.py + exclude: /__init__\.py$ +- repo: https://github.com/pre-commit/mirrors-eslint + rev: v6.5.1 + hooks: + - id: eslint + verbose: true diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..7e89f0e --- /dev/null +++ b/.pylintrc @@ -0,0 +1,86 @@ +[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= +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=12.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, + 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-key, + manifest-version-format, + method-compute, + method-inverse, + method-required-super, + method-search, + missing-import-error, + missing-manifest-dependency, + 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-newline-extrafiles, + missing-readme, + 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..a39913f --- /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= +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=12.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, + 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-key, + manifest-version-format, + method-compute, + method-inverse, + method-required-super, + method-search, + missing-import-error, + missing-manifest-dependency, + 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/.travis.yml b/.travis.yml new file mode 100644 index 0000000..708a9aa --- /dev/null +++ b/.travis.yml @@ -0,0 +1,36 @@ +language: python +sudo: false +cache: pip + +python: + - "3.5" + +addons: + postgresql: "9.6" + apt: + packages: + - expect-dev # provides unbuffer utility + +env: + global: + - VERSION="12.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0" + + matrix: + - LINT_CHECK="1" + - TESTS="1" ODOO_REPO="OCA/OCB" + - TESTS="1" ODOO_REPO="OCA/OCB" UNIT_TEST="1" + + +install: + - git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools + # Disable manifest-required-author for this repository + - sed '/manifest-required-author,/d' ${HOME}/maintainer-quality-tools/travis/cfg/travis_run_pylint_pr.cfg -i + - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} + - travis_install_nightly + - pip install unidecode + +script: + - travis_run_tests + +after_success: + - travis_after_tests_success From 9ae59380f610afa83c5cdd42e50e936fbfab9731 Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Fri, 10 Apr 2020 18:20:29 +0200 Subject: [PATCH 02/29] [REM] easy_my_coop_online_payment : not in v12 --- easy_my_coop_online_payment/__init__.py | 2 - easy_my_coop_online_payment/__openerp__.py | 40 ------- .../controllers/__init__.py | 1 - .../controllers/main.py | 112 ------------------ easy_my_coop_online_payment/i18n/fr.po | 65 ---------- .../models/__init__.py | 2 - easy_my_coop_online_payment/models/coop.py | 26 ---- .../models/payment_transaction.py | 47 -------- .../views/online_payment_template.xml | 25 ---- .../views/subscription_request_view.xml | 28 ----- 10 files changed, 348 deletions(-) delete mode 100644 easy_my_coop_online_payment/__init__.py delete mode 100644 easy_my_coop_online_payment/__openerp__.py delete mode 100644 easy_my_coop_online_payment/controllers/__init__.py delete mode 100644 easy_my_coop_online_payment/controllers/main.py delete mode 100644 easy_my_coop_online_payment/i18n/fr.po delete mode 100644 easy_my_coop_online_payment/models/__init__.py delete mode 100644 easy_my_coop_online_payment/models/coop.py delete mode 100644 easy_my_coop_online_payment/models/payment_transaction.py delete mode 100644 easy_my_coop_online_payment/views/online_payment_template.xml delete mode 100644 easy_my_coop_online_payment/views/subscription_request_view.xml diff --git a/easy_my_coop_online_payment/__init__.py b/easy_my_coop_online_payment/__init__.py deleted file mode 100644 index af57e79..0000000 --- a/easy_my_coop_online_payment/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import models -from . import controllers \ No newline at end of file diff --git a/easy_my_coop_online_payment/__openerp__.py b/easy_my_coop_online_payment/__openerp__.py deleted file mode 100644 index d2eb18f..0000000 --- a/easy_my_coop_online_payment/__openerp__.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2013-2017 Open Architects Consulting SPRL. -# Copyright (C) 2018- Coop IT Easy SCRLfs. -# -# 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 . -# -############################################################################## -{ - "name": "Easy My Coop Online Payment", - "version": "1.0", - "depends": ["easy_my_coop", - "website_payment", - "payment_paypal"], - "author": "Houssine BAKKALI ", - "category": "Cooperative management", - 'website': "www.coopiteasy.be", - "description": """ - This module allows the cooperator to pay the subscribed shares online - during the subscription process - """, - 'data': [ - "views/online_payment_template.xml", - "views/subscription_request_view.xml", - ], - 'installable': False, - 'application': False, -} diff --git a/easy_my_coop_online_payment/controllers/__init__.py b/easy_my_coop_online_payment/controllers/__init__.py deleted file mode 100644 index 12a7e52..0000000 --- a/easy_my_coop_online_payment/controllers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import main diff --git a/easy_my_coop_online_payment/controllers/main.py b/easy_my_coop_online_payment/controllers/main.py deleted file mode 100644 index f32f746..0000000 --- a/easy_my_coop_online_payment/controllers/main.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- - -from openerp import http -from openerp.http import request -from openerp.tools.translate import _ - -from openerp.addons.easy_my_coop.controllers.main import WebsiteSubscription -from openerp.addons.website_payment.controllers.main import website_payment - - -class SubscriptionOnlinePayment(WebsiteSubscription): - - def fill_values(self, values, is_company, load_from_user=False): - values = super(SubscriptionOnlinePayment, self).fill_values(values, is_company, load_from_user) - fields_desc = request.env['subscription.request'].sudo().fields_get(['payment_type']) - values['payment_types'] = fields_desc['payment_type']['selection'] - - return values - - def get_subscription_response(self, values, kwargs): - subscription = values.get('subscription_id', False) - if kwargs.get('payment_type') == 'online': - invoice = subscription.validate_subscription_request()[0] - acquirer = request.env['payment.acquirer'].search([('website_published', '=', True)])[0] - return website_payment().pay(reference=invoice.number, amount=invoice.residual, currency_id=invoice.currency_id.id, acquirer_id=acquirer.id) - else: - values = self.preRenderThanks(values, kwargs) - return request.website.render(kwargs.get("view_callback", "easy_my_coop.cooperator_thanks"), values) - - return True - - -class SubscriptionWebsitePayment(website_payment): - - @http.route(['/website_payment/transaction'], - type='json', - auth="public", website=True) - def transaction(self, reference, amount, currency_id, acquirer_id): - inv_obj = request.env['account.invoice'] - partner_id = request.env.user.partner_id.id if request.env.user.partner_id != request.website.partner_id else False - capital_release_request = inv_obj.sudo().search([('release_capital_request', '=', True), - ('number', '=', reference)]) - - values = { - 'acquirer_id': int(acquirer_id), - 'reference': reference, - 'amount': float(amount), - 'currency_id': int(currency_id), - 'partner_id': partner_id, - 'release_capital_request': capital_release_request.id, - } - - if len(capital_release_request) > 0: - values['partner_id'] = capital_release_request.partner_id.id - values['release_capital_request'] = capital_release_request.id - - tx = request.env['payment.transaction'].sudo().create(values) - request.session['website_payment_tx_id'] = tx.id - return tx.id - - @http.route(['/website_payment/confirm'], - type='http', - auth='public', website=True) - def confirm(self, **kw): - tx_id = request.session.pop('website_payment_tx_id', False) - if tx_id: - tx = request.env['payment.transaction'].sudo().browse(tx_id) - status = (tx.state == 'done' and 'success') or 'danger' - message = (tx.state == 'done' and 'Your payment was successful! It may take some time to be validated on our end.') or 'OOps! There was a problem with your payment.' - return request.website.render('website_payment.confirm', {'tx': tx, 'status': status, 'message': message}) - else: - return request.redirect('/my/home') - - @http.route(['/website_payment/pay'], - type='http', - auth='public', website=True) - def pay(self, reference='', amount=False, currency_id=None, - acquirer_id=None, **kw): - env = request.env - user = env.user.sudo() - - currency_id = currency_id and int(currency_id) or user.company_id.currency_id.id - currency = env['res.currency'].browse(currency_id) - - # Try default one then fallback on first - acquirer_id = acquirer_id and int(acquirer_id) or \ - env['ir.values'].get_default('payment.transaction', 'acquirer_id', company_id=user.company_id.id) or \ - env['payment.acquirer'].search([('website_published', '=', True), ('company_id', '=', user.company_id.id)])[0].id - - acquirer = env['payment.acquirer'].with_context(submit_class='btn btn-primary pull-right', - submit_txt=_('Pay Now')).browse(acquirer_id) - # auto-increment reference with a number suffix if the reference already exists - reference = request.env['payment.transaction'].get_next_reference(reference) - - partner_id = user.partner_id.id if user.partner_id.id != request.website.partner_id.id else False - capital_release_request = request.env['account.invoice'].sudo().search( - [('release_capital_request', '=', True), - ('number', '=', reference)] - ) - - if len(capital_release_request) > 0: - partner_id = capital_release_request.partner_id.id - - payment_form = acquirer.sudo().render(reference, float(amount), currency.id, values={'return_url': '/website_payment/confirm', 'partner_id': partner_id})[0] - values = { - 'reference': reference, - 'acquirer': acquirer, - 'currency': currency, - 'amount': float(amount), - 'payment_form': payment_form, - } - return request.website.render('website_payment.pay', values) diff --git a/easy_my_coop_online_payment/i18n/fr.po b/easy_my_coop_online_payment/i18n/fr.po deleted file mode 100644 index f5342f8..0000000 --- a/easy_my_coop_online_payment/i18n/fr.po +++ /dev/null @@ -1,65 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * easy_my_coop_online_payment -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 9.0c\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-18 21:56+0000\n" -"PO-Revision-Date: 2017-01-18 23:19+0100\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 1.6.5\n" -"Language: fr\n" - -#. module: easy_my_coop_online_payment -#: model:ir.ui.view,arch_db:easy_my_coop_online_payment.SubscriptionOnlinePayment -msgid " Pay Now" -msgstr " Pay Now" - -#. module: easy_my_coop_online_payment -#: selection:subscription.request,payment_type:0 -msgid "Deferred" -msgstr "Différé" - -#. module: easy_my_coop_online_payment -#: selection:subscription.request,payment_type:0 -msgid "Online" -msgstr "En ligne" - -#. module: easy_my_coop_online_payment -#: code:addons/easy_my_coop_online_payment/controllers/main.py:86 -#: model:ir.ui.view,arch_db:easy_my_coop_online_payment.SubscriptionOnlinePayment -#, python-format -msgid "Pay Now" -msgstr "Payer Maintenant" - -#. module: easy_my_coop_online_payment -#: model:ir.model,name:easy_my_coop_online_payment.model_payment_transaction -msgid "Payment Transaction" -msgstr "Transaction" - -#. module: easy_my_coop_online_payment -#: model:ir.model.fields,field_description:easy_my_coop_online_payment.field_subscription_request_payment_type -msgid "Payment Type" -msgstr "Type de paiement" - -#. module: easy_my_coop_online_payment -#: model:ir.ui.view,arch_db:easy_my_coop_online_payment.subscription_payment_type -msgid "Payment type" -msgstr "Type de paiement" - -#. module: easy_my_coop_online_payment -#: model:ir.model.fields,field_description:easy_my_coop_online_payment.field_payment_transaction_release_capital_request -msgid "Release Capital request" -msgstr "Demande de libération de capital" - -#. module: easy_my_coop_online_payment -#: model:ir.model,name:easy_my_coop_online_payment.model_subscription_request -msgid "Subscription Request" -msgstr "Demande de souscription" diff --git a/easy_my_coop_online_payment/models/__init__.py b/easy_my_coop_online_payment/models/__init__.py deleted file mode 100644 index 2e8c044..0000000 --- a/easy_my_coop_online_payment/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import payment_transaction -from . import coop diff --git a/easy_my_coop_online_payment/models/coop.py b/easy_my_coop_online_payment/models/coop.py deleted file mode 100644 index 3bf7aa8..0000000 --- a/easy_my_coop_online_payment/models/coop.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -from openerp import fields, models - - -class SubscriptionRequest(models.Model): - _inherit = 'subscription.request' - - payment_type = fields.Selection([('online', 'Online'), - ('deferred', 'Deferred')], - string='Payment Type', - default="deferred") - - def send_capital_release_request(self, inv): - if self.payment_type == 'deferred': - super(SubscriptionRequest, self).send_capital_release_request(inv) - return True - - -class AccountInvoice(models.Model): - _inherit = 'account.invoice' - - def post_process_confirm_paid(self, effective_date): - if self.subscription_request.payment_type == 'deferred': - self.set_cooperator_effective(effective_date) - - return True diff --git a/easy_my_coop_online_payment/models/payment_transaction.py b/easy_my_coop_online_payment/models/payment_transaction.py deleted file mode 100644 index 312177e..0000000 --- a/easy_my_coop_online_payment/models/payment_transaction.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -from datetime import datetime -import logging - -from openerp import api, fields, models - -_logger = logging.getLogger(__name__) - - -class PaymentTransaction(models.Model): - - _inherit = 'payment.transaction' - - release_capital_request = fields.Many2one('account.invoice', - string="Release Capital request") - - @api.model - def process_online_payment_reception(self, tx): - release_capital_request = tx.release_capital_request - release_capital_request.subscription_request[0].state = 'paid' - effective_date = datetime.now().strftime("%d/%m/%Y") - release_capital_request.sudo().set_cooperator_effective(effective_date) - - return True - - @api.v7 - def _paypal_form_validate(self, cr, uid, tx, data, context=None): - status = data.get('payment_status') - res = { - 'acquirer_reference': data.get('txn_id'), - 'paypal_txn_type': data.get('payment_type'), - } - if status in ['Completed', 'Processed']: - _logger.info('Validated Paypal payment for tx %s: set as done' % (tx.reference)) - res.update(state='done', date_validate=fields.Datetime.now()) - result = tx.write(res) - self.process_online_payment_reception(cr, uid, tx) - return result - elif status in ['Pending', 'Expired']: - _logger.info('Received notification for Paypal payment %s: set as pending' % (tx.reference)) - res.update(state='pending', state_message=data.get('pending_reason', '')) - return tx.write(res) - else: - error = 'Received unrecognized status for Paypal payment %s: %s, set as error' % (tx.reference, status) - _logger.info(error) - res.update(state='error', state_message=error) - return tx.write(res) diff --git a/easy_my_coop_online_payment/views/online_payment_template.xml b/easy_my_coop_online_payment/views/online_payment_template.xml deleted file mode 100644 index a447e9a..0000000 --- a/easy_my_coop_online_payment/views/online_payment_template.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - diff --git a/easy_my_coop_online_payment/views/subscription_request_view.xml b/easy_my_coop_online_payment/views/subscription_request_view.xml deleted file mode 100644 index ffcb357..0000000 --- a/easy_my_coop_online_payment/views/subscription_request_view.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - subscription.request.tree - subscription.request - - - - - - - - - - subscription.request.tree - subscription.request - - - - - - - - - - \ No newline at end of file From f3b3dca82d99493ee3af2f5f81815bd75e4e27f2 Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Fri, 10 Apr 2020 18:21:11 +0200 Subject: [PATCH 03/29] [REM] easy_my_coop_recompute_coop_number: not in v12 --- .../__init__.py | 1 - .../__openerp__.py | 37 ------------------- .../wizard/__init__.py | 2 - .../wizard/cooperator_number_wizard.py | 22 ----------- .../wizard/cooperator_number_wizard.xml | 35 ------------------ 5 files changed, 97 deletions(-) delete mode 100644 easy_my_coop_recompute_coop_number/__init__.py delete mode 100644 easy_my_coop_recompute_coop_number/__openerp__.py delete mode 100644 easy_my_coop_recompute_coop_number/wizard/__init__.py delete mode 100644 easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.py delete mode 100644 easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.xml diff --git a/easy_my_coop_recompute_coop_number/__init__.py b/easy_my_coop_recompute_coop_number/__init__.py deleted file mode 100644 index dd1a660..0000000 --- a/easy_my_coop_recompute_coop_number/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import wizard diff --git a/easy_my_coop_recompute_coop_number/__openerp__.py b/easy_my_coop_recompute_coop_number/__openerp__.py deleted file mode 100644 index 47dec52..0000000 --- a/easy_my_coop_recompute_coop_number/__openerp__.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2013-2017 Open Architects Consulting SPRL. -# Copyright (C) 2018- Coop IT Easy SCRLfs. -# -# 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 . -# -############################################################################## -{ - "name": "Easy My Coop Recompute Coop Number", - "version": "1.0", - "depends": ["easy_my_coop"], - "author": "Houssine BAKKALI ", - "category": "Cooperative management", - 'website': "www.coopiteasy.be", - "description": """ - This module allows to recompute the cooperator number subscription - it has to be used carefully. - """, - 'data': [ - 'wizard/cooperator_number_wizard.xml', - ], - 'installable': True, - 'active': False, -} diff --git a/easy_my_coop_recompute_coop_number/wizard/__init__.py b/easy_my_coop_recompute_coop_number/wizard/__init__.py deleted file mode 100644 index 6b43157..0000000 --- a/easy_my_coop_recompute_coop_number/wizard/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -*- coding: utf-8 -*- -from . import cooperator_number_wizard diff --git a/easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.py b/easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.py deleted file mode 100644 index f673614..0000000 --- a/easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -from openerp import models, fields, api - - -class RecomputeWizard(models.TransientModel): - _name = 'register.number.wizard' - - from_number = fields.Integer(string="From number") - to_number = fields.Integer(string="To number") - - @api.one - def compute_register_number(self): - obj_sequence = self.env['ir.sequence'] - sub_reg_obj = self.env['subscription.register'] - - sequence_operation = obj_sequence.search([('name', '=', 'Register Operation')])[0] - subscription_registers = sub_reg_obj.search([('register_number_operation', '>=', self.from_number)]) - for subscription_register in subscription_registers: - sub_reg_operation = sequence_operation.next_by_id() - - subscription_register.write({'name': sub_reg_operation, - 'register_number_operation': int(sub_reg_operation)}) diff --git a/easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.xml b/easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.xml deleted file mode 100644 index 20999ff..0000000 --- a/easy_my_coop_recompute_coop_number/wizard/cooperator_number_wizard.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - Register number wizard - register.number.wizard - -
- - - - -
-
-
-
-
- - - Recompute register number - ir.actions.act_window - register.number.wizard - form - form - - new - True - - - - -
-
From 5553f8b2dc8fef57c9e38a64f02316d22110eb6c Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Mon, 20 Apr 2020 19:04:46 +0200 Subject: [PATCH 04/29] [CNG] easy_my_coop_dividend: not installable --- easy_my_coop_dividend/{__openerp__.py => __manifest__.py} | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename easy_my_coop_dividend/{__openerp__.py => __manifest__.py} (98%) diff --git a/easy_my_coop_dividend/__openerp__.py b/easy_my_coop_dividend/__manifest__.py similarity index 98% rename from easy_my_coop_dividend/__openerp__.py rename to easy_my_coop_dividend/__manifest__.py index 3dd46cc..09307c9 100644 --- a/easy_my_coop_dividend/__openerp__.py +++ b/easy_my_coop_dividend/__manifest__.py @@ -45,5 +45,6 @@ 'data': [ 'security/ir.model.access.csv', 'views/dividend_views.xml', - ] + ], + 'installable': False, } From e5d37aeab3e284f48881e478018c12f427233fde Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Mon, 20 Apr 2020 19:07:19 +0200 Subject: [PATCH 05/29] [CNG] easy_my_coop_export_xlsx: not installable --- easy_my_coop_export_xlsx/{__openerp__.py => __manifest__.py} | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) rename easy_my_coop_export_xlsx/{__openerp__.py => __manifest__.py} (97%) diff --git a/easy_my_coop_export_xlsx/__openerp__.py b/easy_my_coop_export_xlsx/__manifest__.py similarity index 97% rename from easy_my_coop_export_xlsx/__openerp__.py rename to easy_my_coop_export_xlsx/__manifest__.py index b112575..414ce9b 100644 --- a/easy_my_coop_export_xlsx/__openerp__.py +++ b/easy_my_coop_export_xlsx/__manifest__.py @@ -40,5 +40,6 @@ }, 'data': [ 'wizard/export_global_wizard.xml', - ] + ], + 'installable': False, } From fccbea79578619b54aa437386014643f95a95b44 Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Fri, 10 Apr 2020 18:32:33 +0200 Subject: [PATCH 06/29] [ADD] module readmes --- easy_my_coop/README.rst | 58 +++ easy_my_coop/readme/CONTRIBUTORS.rst | 2 + easy_my_coop/readme/DESCRIPTION.rst | 1 + easy_my_coop/static/description/index.html | 414 +++++++++++++++++ easy_my_coop_be/README.rst | 58 +++ easy_my_coop_be/readme/CONTRIBUTORS.rst | 2 + easy_my_coop_be/readme/DESCRIPTION.rst | 1 + easy_my_coop_be/static/description/index.html | 414 +++++++++++++++++ easy_my_coop_ch/README.rst | 55 +++ easy_my_coop_ch/readme/CONTRIBUTORS.rst | 2 + easy_my_coop_ch/readme/DESCRIPTION.rst | 1 + easy_my_coop_ch/static/description/index.html | 414 +++++++++++++++++ easy_my_coop_dividend/README.rst | 62 +++ easy_my_coop_dividend/__manifest__.py | 6 +- easy_my_coop_dividend/readme/CONTRIBUTORS.rst | 3 + easy_my_coop_dividend/readme/DESCRIPTION.rst | 3 + .../static/description/index.html | 419 ++++++++++++++++++ easy_my_coop_export_xlsx/README.rst | 60 +++ easy_my_coop_export_xlsx/__manifest__.py | 2 +- .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 2 + .../static/description/index.html | 417 +++++++++++++++++ easy_my_coop_fr/README.rst | 58 +++ easy_my_coop_fr/readme/CONTRIBUTORS.rst | 2 + easy_my_coop_fr/readme/DESCRIPTION.rst | 1 + easy_my_coop_fr/static/description/index.html | 414 +++++++++++++++++ easy_my_coop_loan/README.rst | 58 +++ easy_my_coop_loan/readme/CONTRIBUTORS.rst | 2 + easy_my_coop_loan/readme/DESCRIPTION.rst | 1 + .../static/description/index.html | 414 +++++++++++++++++ easy_my_coop_loan_website/README.rst | 58 +++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 1 + .../static/description/index.html | 414 +++++++++++++++++ easy_my_coop_taxshelter_report/README.rst | 59 +++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 2 + .../static/description/index.html | 415 +++++++++++++++++ easy_my_coop_website/README.rst | 59 +++ easy_my_coop_website/readme/CONTRIBUTORS.rst | 2 + easy_my_coop_website/readme/DESCRIPTION.rst | 2 + .../static/description/index.html | 419 ++++++++++++++++++ easy_my_coop_website_portal/README.rst | 58 +++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 1 + .../static/description/index.html | 414 +++++++++++++++++ easy_my_coop_website_taxshelter/README.rst | 58 +++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 1 + .../static/description/index.html | 414 +++++++++++++++++ partner_age/README.rst | 58 +++ partner_age/readme/CONTRIBUTORS.rst | 2 + partner_age/readme/DESCRIPTION.rst | 1 + partner_age/static/description/index.html | 414 +++++++++++++++++ theme_light/README.rst | 57 +++ theme_light/readme/CONTRIBUTORS.rst | 2 + theme_light/readme/DESCRIPTION.rst | 1 + theme_light/static/description/index.html | 416 +++++++++++++++++ website_recaptcha_reloaded/README.rst | 63 +++ .../readme/CONTRIBUTORS.rst | 2 + .../readme/DESCRIPTION.rst | 6 + 61 files changed, 6751 insertions(+), 5 deletions(-) create mode 100644 easy_my_coop/README.rst create mode 100644 easy_my_coop/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop/readme/DESCRIPTION.rst create mode 100644 easy_my_coop/static/description/index.html create mode 100644 easy_my_coop_be/README.rst create mode 100644 easy_my_coop_be/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_be/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_be/static/description/index.html create mode 100644 easy_my_coop_ch/README.rst create mode 100644 easy_my_coop_ch/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_ch/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_ch/static/description/index.html create mode 100644 easy_my_coop_dividend/README.rst create mode 100644 easy_my_coop_dividend/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_dividend/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_dividend/static/description/index.html create mode 100644 easy_my_coop_export_xlsx/README.rst create mode 100644 easy_my_coop_export_xlsx/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_export_xlsx/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_export_xlsx/static/description/index.html create mode 100644 easy_my_coop_fr/README.rst create mode 100644 easy_my_coop_fr/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_fr/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_fr/static/description/index.html create mode 100644 easy_my_coop_loan/README.rst create mode 100644 easy_my_coop_loan/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_loan/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_loan/static/description/index.html create mode 100644 easy_my_coop_loan_website/README.rst create mode 100644 easy_my_coop_loan_website/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_loan_website/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_loan_website/static/description/index.html create mode 100644 easy_my_coop_taxshelter_report/README.rst create mode 100644 easy_my_coop_taxshelter_report/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_taxshelter_report/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_taxshelter_report/static/description/index.html create mode 100644 easy_my_coop_website/README.rst create mode 100644 easy_my_coop_website/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_website/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_website/static/description/index.html create mode 100644 easy_my_coop_website_portal/README.rst create mode 100644 easy_my_coop_website_portal/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_website_portal/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_website_portal/static/description/index.html create mode 100644 easy_my_coop_website_taxshelter/README.rst create mode 100644 easy_my_coop_website_taxshelter/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_website_taxshelter/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_website_taxshelter/static/description/index.html create mode 100644 partner_age/README.rst create mode 100644 partner_age/readme/CONTRIBUTORS.rst create mode 100644 partner_age/readme/DESCRIPTION.rst create mode 100644 partner_age/static/description/index.html create mode 100644 theme_light/README.rst create mode 100644 theme_light/readme/CONTRIBUTORS.rst create mode 100644 theme_light/readme/DESCRIPTION.rst create mode 100644 theme_light/static/description/index.html create mode 100644 website_recaptcha_reloaded/README.rst create mode 100644 website_recaptcha_reloaded/readme/CONTRIBUTORS.rst create mode 100644 website_recaptcha_reloaded/readme/DESCRIPTION.rst diff --git a/easy_my_coop/README.rst b/easy_my_coop/README.rst new file mode 100644 index 0000000..de5f272 --- /dev/null +++ b/easy_my_coop/README.rst @@ -0,0 +1,58 @@ +============ +Easy My Coop +============ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This module allows to manage the cooperator subscription and all the cooperative business processes. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop/readme/CONTRIBUTORS.rst b/easy_my_coop/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop/readme/DESCRIPTION.rst b/easy_my_coop/readme/DESCRIPTION.rst new file mode 100644 index 0000000..a9ff162 --- /dev/null +++ b/easy_my_coop/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows to manage the cooperator subscription and all the cooperative business processes. diff --git a/easy_my_coop/static/description/index.html b/easy_my_coop/static/description/index.html new file mode 100644 index 0000000..0f649e9 --- /dev/null +++ b/easy_my_coop/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop + + + +
+

Easy My Coop

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

This module allows to manage the cooperator subscription and all the cooperative business processes.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_be/README.rst b/easy_my_coop_be/README.rst new file mode 100644 index 0000000..8182f06 --- /dev/null +++ b/easy_my_coop_be/README.rst @@ -0,0 +1,58 @@ +==================== +Easy My Coop Belgium +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_be + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This is the belgian localization for the easy my coop module. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_be/readme/CONTRIBUTORS.rst b/easy_my_coop_be/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_be/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_be/readme/DESCRIPTION.rst b/easy_my_coop_be/readme/DESCRIPTION.rst new file mode 100644 index 0000000..c9f0550 --- /dev/null +++ b/easy_my_coop_be/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This is the belgian localization for the easy my coop module. diff --git a/easy_my_coop_be/static/description/index.html b/easy_my_coop_be/static/description/index.html new file mode 100644 index 0000000..4071fcf --- /dev/null +++ b/easy_my_coop_be/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop Belgium + + + +
+

Easy My Coop Belgium

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

This is the belgian localization for the easy my coop module.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_ch/README.rst b/easy_my_coop_ch/README.rst new file mode 100644 index 0000000..e6b7622 --- /dev/null +++ b/easy_my_coop_ch/README.rst @@ -0,0 +1,55 @@ +======================== +Easy My Coop Switzerland +======================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_ch + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| + +This is the swiss localization for the easy my coop module + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Houssine BAKKALI + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_ch/readme/CONTRIBUTORS.rst b/easy_my_coop_ch/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..7b9a955 --- /dev/null +++ b/easy_my_coop_ch/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs +* Houssine BAKKALI diff --git a/easy_my_coop_ch/readme/DESCRIPTION.rst b/easy_my_coop_ch/readme/DESCRIPTION.rst new file mode 100644 index 0000000..54b9f50 --- /dev/null +++ b/easy_my_coop_ch/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This is the swiss localization for the easy my coop module diff --git a/easy_my_coop_ch/static/description/index.html b/easy_my_coop_ch/static/description/index.html new file mode 100644 index 0000000..cc73b0a --- /dev/null +++ b/easy_my_coop_ch/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop Switzerland + + + +
+

Easy My Coop Switzerland

+ + +

Beta coopiteasy/vertical-cooperative

+

This is the swiss localization for the easy my coop module

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+ +
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_dividend/README.rst b/easy_my_coop_dividend/README.rst new file mode 100644 index 0000000..9fdfc28 --- /dev/null +++ b/easy_my_coop_dividend/README.rst @@ -0,0 +1,62 @@ +============================ +Easy My Coop Dividend Engine +============================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_dividend + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + + This module allows to calculate the dividend to give to a cooperator base + on the amount of his shares, the percentage allocated and for how long the + shares have been owned on prorata temporis calculation. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Houssine BAKKALI +* + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs +* Houssine BAKKALI, + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_dividend/__manifest__.py b/easy_my_coop_dividend/__manifest__.py index 09307c9..76e72c0 100644 --- a/easy_my_coop_dividend/__manifest__.py +++ b/easy_my_coop_dividend/__manifest__.py @@ -25,10 +25,8 @@ 'summary': """ Manage the dividend calculation for a fiscal year. """, - 'description': """ - This module allows to calculate the dividend to give to a cooperator base - on the amount of his shares, the percentage allocated and for how long the - shares have been owned on prorata temporis calculation. + 'summary': """ + This module allows to calculate the dividend of the cooperative. """, 'author': 'Houssine BAKKALI, ', diff --git a/easy_my_coop_dividend/readme/CONTRIBUTORS.rst b/easy_my_coop_dividend/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..f46b967 --- /dev/null +++ b/easy_my_coop_dividend/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Coop IT Easy SCRLfs +* Houssine BAKKALI, + diff --git a/easy_my_coop_dividend/readme/DESCRIPTION.rst b/easy_my_coop_dividend/readme/DESCRIPTION.rst new file mode 100644 index 0000000..8ba1ff5 --- /dev/null +++ b/easy_my_coop_dividend/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ + This module allows to calculate the dividend to give to a cooperator base + on the amount of his shares, the percentage allocated and for how long the + shares have been owned on prorata temporis calculation. diff --git a/easy_my_coop_dividend/static/description/index.html b/easy_my_coop_dividend/static/description/index.html new file mode 100644 index 0000000..a90457f --- /dev/null +++ b/easy_my_coop_dividend/static/description/index.html @@ -0,0 +1,419 @@ + + + + + + +Easy My Coop Dividend Engine + + + +
+

Easy My Coop Dividend Engine

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+
+This module allows to calculate the dividend to give to a cooperator base +on the amount of his shares, the percentage allocated and for how long the +shares have been owned on prorata temporis calculation.
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+ +
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_export_xlsx/README.rst b/easy_my_coop_export_xlsx/README.rst new file mode 100644 index 0000000..2ca3f8f --- /dev/null +++ b/easy_my_coop_export_xlsx/README.rst @@ -0,0 +1,60 @@ +======================== +Easy My Coop Export XLSX +======================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_export_xlsx + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + + Generate a xlsx file with information on current state of subscription + request, cooperators and capital release request. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs +* Houssine BAKKALI, + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_export_xlsx/__manifest__.py b/easy_my_coop_export_xlsx/__manifest__.py index 414ce9b..119703f 100644 --- a/easy_my_coop_export_xlsx/__manifest__.py +++ b/easy_my_coop_export_xlsx/__manifest__.py @@ -25,7 +25,7 @@ Generate a xlsx file with information on current state of subscription request, cooperators and capital release request. """, - 'author': 'Houssine BAKKALI, ', + "author": "Coop IT Easy SCRLfs", 'license': 'AGPL-3', 'version': '9.0.1.0', 'website': "www.coopiteasy.be", diff --git a/easy_my_coop_export_xlsx/readme/CONTRIBUTORS.rst b/easy_my_coop_export_xlsx/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..f46b967 --- /dev/null +++ b/easy_my_coop_export_xlsx/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* Coop IT Easy SCRLfs +* Houssine BAKKALI, + diff --git a/easy_my_coop_export_xlsx/readme/DESCRIPTION.rst b/easy_my_coop_export_xlsx/readme/DESCRIPTION.rst new file mode 100644 index 0000000..04bba43 --- /dev/null +++ b/easy_my_coop_export_xlsx/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ + Generate a xlsx file with information on current state of subscription + request, cooperators and capital release request. diff --git a/easy_my_coop_export_xlsx/static/description/index.html b/easy_my_coop_export_xlsx/static/description/index.html new file mode 100644 index 0000000..e5e5914 --- /dev/null +++ b/easy_my_coop_export_xlsx/static/description/index.html @@ -0,0 +1,417 @@ + + + + + + +Easy My Coop Export XLSX + + + +
+

Easy My Coop Export XLSX

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+
+Generate a xlsx file with information on current state of subscription +request, cooperators and capital release request.
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_fr/README.rst b/easy_my_coop_fr/README.rst new file mode 100644 index 0000000..0fc0495 --- /dev/null +++ b/easy_my_coop_fr/README.rst @@ -0,0 +1,58 @@ +=============== +Easy My Coop Fr +=============== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_fr + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This is the french localization for the easy my coop module + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Houssine BAKKALI + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_fr/readme/CONTRIBUTORS.rst b/easy_my_coop_fr/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_fr/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_fr/readme/DESCRIPTION.rst b/easy_my_coop_fr/readme/DESCRIPTION.rst new file mode 100644 index 0000000..ab4fc65 --- /dev/null +++ b/easy_my_coop_fr/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This is the french localization for the easy my coop module diff --git a/easy_my_coop_fr/static/description/index.html b/easy_my_coop_fr/static/description/index.html new file mode 100644 index 0000000..c2efd20 --- /dev/null +++ b/easy_my_coop_fr/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop Fr + + + +
+

Easy My Coop Fr

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

This is the french localization for the easy my coop module

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+ +
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_loan/README.rst b/easy_my_coop_loan/README.rst new file mode 100644 index 0000000..68c3665 --- /dev/null +++ b/easy_my_coop_loan/README.rst @@ -0,0 +1,58 @@ +============================================== +Easy My Coop Bond and Subordinated Loan Issues +============================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_loan + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This module allows to manage the bonds and subordinated loans subscription life cycle. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_loan/readme/CONTRIBUTORS.rst b/easy_my_coop_loan/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_loan/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_loan/readme/DESCRIPTION.rst b/easy_my_coop_loan/readme/DESCRIPTION.rst new file mode 100644 index 0000000..c4995a8 --- /dev/null +++ b/easy_my_coop_loan/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows to manage the bonds and subordinated loans subscription life cycle. diff --git a/easy_my_coop_loan/static/description/index.html b/easy_my_coop_loan/static/description/index.html new file mode 100644 index 0000000..ffd4e8b --- /dev/null +++ b/easy_my_coop_loan/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop Bond and Subordinated Loan Issues + + + +
+

Easy My Coop Bond and Subordinated Loan Issues

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

This module allows to manage the bonds and subordinated loans subscription life cycle.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_loan_website/README.rst b/easy_my_coop_loan_website/README.rst new file mode 100644 index 0000000..7fe6393 --- /dev/null +++ b/easy_my_coop_loan_website/README.rst @@ -0,0 +1,58 @@ +================================ +Easy My Coop Loan Issues Website +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_loan_website + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This module implements the subscription page for bonds and subordinated loans. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_loan_website/readme/CONTRIBUTORS.rst b/easy_my_coop_loan_website/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_loan_website/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_loan_website/readme/DESCRIPTION.rst b/easy_my_coop_loan_website/readme/DESCRIPTION.rst new file mode 100644 index 0000000..3fa6e0b --- /dev/null +++ b/easy_my_coop_loan_website/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module implements the subscription page for bonds and subordinated loans. diff --git a/easy_my_coop_loan_website/static/description/index.html b/easy_my_coop_loan_website/static/description/index.html new file mode 100644 index 0000000..d92cf89 --- /dev/null +++ b/easy_my_coop_loan_website/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop Loan Issues Website + + + +
+

Easy My Coop Loan Issues Website

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

This module implements the subscription page for bonds and subordinated loans.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_taxshelter_report/README.rst b/easy_my_coop_taxshelter_report/README.rst new file mode 100644 index 0000000..a028fec --- /dev/null +++ b/easy_my_coop_taxshelter_report/README.rst @@ -0,0 +1,59 @@ +=============================== +Easy My Coop tax shelter report +=============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_taxshelter_report + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This module allows you to create a fiscal declaration year and to print +tax shelter declaration for each cooperator. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Houssine BAKKALI + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_taxshelter_report/readme/CONTRIBUTORS.rst b/easy_my_coop_taxshelter_report/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_taxshelter_report/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_taxshelter_report/readme/DESCRIPTION.rst b/easy_my_coop_taxshelter_report/readme/DESCRIPTION.rst new file mode 100644 index 0000000..20e84d5 --- /dev/null +++ b/easy_my_coop_taxshelter_report/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module allows you to create a fiscal declaration year and to print +tax shelter declaration for each cooperator. diff --git a/easy_my_coop_taxshelter_report/static/description/index.html b/easy_my_coop_taxshelter_report/static/description/index.html new file mode 100644 index 0000000..9b3b9d9 --- /dev/null +++ b/easy_my_coop_taxshelter_report/static/description/index.html @@ -0,0 +1,415 @@ + + + + + + +Easy My Coop tax shelter report + + + +
+

Easy My Coop tax shelter report

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

This module allows you to create a fiscal declaration year and to print +tax shelter declaration for each cooperator.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+ +
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_website/README.rst b/easy_my_coop_website/README.rst new file mode 100644 index 0000000..5754a44 --- /dev/null +++ b/easy_my_coop_website/README.rst @@ -0,0 +1,59 @@ +==================== +Easy My Coop Website +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_website + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + + This module adds the cooperator subscription form allowing to subscribe for + shares online. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_website/readme/CONTRIBUTORS.rst b/easy_my_coop_website/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_website/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_website/readme/DESCRIPTION.rst b/easy_my_coop_website/readme/DESCRIPTION.rst new file mode 100644 index 0000000..b827278 --- /dev/null +++ b/easy_my_coop_website/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ + This module adds the cooperator subscription form allowing to subscribe for + shares online. diff --git a/easy_my_coop_website/static/description/index.html b/easy_my_coop_website/static/description/index.html new file mode 100644 index 0000000..64a8424 --- /dev/null +++ b/easy_my_coop_website/static/description/index.html @@ -0,0 +1,419 @@ + + + + + + +Easy My Coop Website + + + +
+

Easy My Coop Website

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+
+
+
This module adds the cooperator subscription form allowing to subscribe for
+
shares online.
+
+
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_website_portal/README.rst b/easy_my_coop_website_portal/README.rst new file mode 100644 index 0000000..66e76fd --- /dev/null +++ b/easy_my_coop_website_portal/README.rst @@ -0,0 +1,58 @@ +=========================== +Easy My Coop Website Portal +=========================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_website_portal + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +Show cooperator information in the website portal. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_website_portal/readme/CONTRIBUTORS.rst b/easy_my_coop_website_portal/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_website_portal/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_website_portal/readme/DESCRIPTION.rst b/easy_my_coop_website_portal/readme/DESCRIPTION.rst new file mode 100644 index 0000000..7799424 --- /dev/null +++ b/easy_my_coop_website_portal/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Show cooperator information in the website portal. diff --git a/easy_my_coop_website_portal/static/description/index.html b/easy_my_coop_website_portal/static/description/index.html new file mode 100644 index 0000000..119e3c6 --- /dev/null +++ b/easy_my_coop_website_portal/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop Website Portal + + + +
+

Easy My Coop Website Portal

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

Show cooperator information in the website portal.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/easy_my_coop_website_taxshelter/README.rst b/easy_my_coop_website_taxshelter/README.rst new file mode 100644 index 0000000..3e07172 --- /dev/null +++ b/easy_my_coop_website_taxshelter/README.rst @@ -0,0 +1,58 @@ +================================ +Easy My Coop Tax Shelter Website +================================ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_website_taxshelter + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +Give access to Tax Shelter Report in the website portal. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_website_taxshelter/readme/CONTRIBUTORS.rst b/easy_my_coop_website_taxshelter/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/easy_my_coop_website_taxshelter/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/easy_my_coop_website_taxshelter/readme/DESCRIPTION.rst b/easy_my_coop_website_taxshelter/readme/DESCRIPTION.rst new file mode 100644 index 0000000..570ae50 --- /dev/null +++ b/easy_my_coop_website_taxshelter/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Give access to Tax Shelter Report in the website portal. diff --git a/easy_my_coop_website_taxshelter/static/description/index.html b/easy_my_coop_website_taxshelter/static/description/index.html new file mode 100644 index 0000000..8f127ce --- /dev/null +++ b/easy_my_coop_website_taxshelter/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Easy My Coop Tax Shelter Website + + + +
+

Easy My Coop Tax Shelter Website

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

Give access to Tax Shelter Report in the website portal.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/partner_age/README.rst b/partner_age/README.rst new file mode 100644 index 0000000..598626a --- /dev/null +++ b/partner_age/README.rst @@ -0,0 +1,58 @@ +=========== +Partner Age +=========== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/partner_age + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This module computes the age of the partner. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Houssine BAKKALI + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/partner_age/readme/CONTRIBUTORS.rst b/partner_age/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/partner_age/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/partner_age/readme/DESCRIPTION.rst b/partner_age/readme/DESCRIPTION.rst new file mode 100644 index 0000000..cb9c614 --- /dev/null +++ b/partner_age/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module computes the age of the partner. diff --git a/partner_age/static/description/index.html b/partner_age/static/description/index.html new file mode 100644 index 0000000..5885de6 --- /dev/null +++ b/partner_age/static/description/index.html @@ -0,0 +1,414 @@ + + + + + + +Partner Age + + + +
+

Partner Age

+ + +

Beta License: AGPL-3 coopiteasy/vertical-cooperative

+

This module computes the age of the partner.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+ +
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/theme_light/README.rst b/theme_light/README.rst new file mode 100644 index 0000000..b8748d7 --- /dev/null +++ b/theme_light/README.rst @@ -0,0 +1,57 @@ +=========== +Theme light +=========== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/theme_light + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| + +Extract of the theme zen. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Benjamin Dugardin +* Houssine BAKKALI +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/theme_light/readme/CONTRIBUTORS.rst b/theme_light/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/theme_light/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/theme_light/readme/DESCRIPTION.rst b/theme_light/readme/DESCRIPTION.rst new file mode 100644 index 0000000..235931a --- /dev/null +++ b/theme_light/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +Extract of the theme zen. diff --git a/theme_light/static/description/index.html b/theme_light/static/description/index.html new file mode 100644 index 0000000..89c4bd6 --- /dev/null +++ b/theme_light/static/description/index.html @@ -0,0 +1,416 @@ + + + + + + +Theme light + + + +
+

Theme light

+ + +

Beta coopiteasy/vertical-cooperative

+

Extract of the theme zen.

+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Benjamin Dugardin
  • +
  • Houssine BAKKALI
  • +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/website_recaptcha_reloaded/README.rst b/website_recaptcha_reloaded/README.rst new file mode 100644 index 0000000..139e6b1 --- /dev/null +++ b/website_recaptcha_reloaded/README.rst @@ -0,0 +1,63 @@ +========================== +Website reCAPTCHA Reloaded +========================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/website_recaptcha_reloaded + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| |badge3| + +This modules allows you to integrate Google reCAPTCHA v2.0 to your website +forms. You can configure your Google reCAPTCHA site and public keys +in "Settings" -> "Website Settings" + +You will need to install various website__recaptcha modules +to use it in your pages. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Tech Receptives + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/website_recaptcha_reloaded/readme/CONTRIBUTORS.rst b/website_recaptcha_reloaded/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..cd0a487 --- /dev/null +++ b/website_recaptcha_reloaded/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Coop IT Easy SCRLfs + diff --git a/website_recaptcha_reloaded/readme/DESCRIPTION.rst b/website_recaptcha_reloaded/readme/DESCRIPTION.rst new file mode 100644 index 0000000..a322e5a --- /dev/null +++ b/website_recaptcha_reloaded/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +This modules allows you to integrate Google reCAPTCHA v2.0 to your website +forms. You can configure your Google reCAPTCHA site and public keys +in "Settings" -> "Website Settings" + +You will need to install various website__recaptcha modules +to use it in your pages. From b2d3b80ca6ccac9901d933f18448f46950b2f3e5 Mon Sep 17 00:00:00 2001 From: Vincent Van Rossem Date: Wed, 15 Apr 2020 12:55:46 +0200 Subject: [PATCH 07/29] [12.0][MIG] easy_my_coop_eater: adaptation to 12.0 - followed oca guidelines - tested on odoo 12.0 --- easy_my_coop_eater/{__openerp__.py => __manifest__.py} | 5 ++--- easy_my_coop_eater/models/coop.py | 3 +-- easy_my_coop_eater/models/product.py | 3 +-- easy_my_coop_eater/view/product_view.xml | 2 +- 4 files changed, 5 insertions(+), 8 deletions(-) rename easy_my_coop_eater/{__openerp__.py => __manifest__.py} (92%) diff --git a/easy_my_coop_eater/__openerp__.py b/easy_my_coop_eater/__manifest__.py similarity index 92% rename from easy_my_coop_eater/__openerp__.py rename to easy_my_coop_eater/__manifest__.py index 7c22295..b69e7f6 100644 --- a/easy_my_coop_eater/__openerp__.py +++ b/easy_my_coop_eater/__manifest__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- ############################################################################## # # Copyright (C) 2013-2017 Open Architects Consulting SPRL. @@ -20,9 +19,9 @@ ############################################################################## { "name": "Easy My Coop Eater/worker", - "version": "1.0", + "version": "12.0.1.0.0", "depends": ["easy_my_coop", "partner_age"], - "author": "Houssine BAKKALI ", + "author": "Coop IT Easy SCRLfs", "category": "Cooperative management", 'website': "www.coopiteasy.be", "description": """ diff --git a/easy_my_coop_eater/models/coop.py b/easy_my_coop_eater/models/coop.py index 34ac9b5..3ce4d7f 100644 --- a/easy_my_coop_eater/models/coop.py +++ b/easy_my_coop_eater/models/coop.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -from openerp import api, models +from odoo import api, models class SubscriptionRequest(models.Model): diff --git a/easy_my_coop_eater/models/product.py b/easy_my_coop_eater/models/product.py index a19225f..d9a20ce 100644 --- a/easy_my_coop_eater/models/product.py +++ b/easy_my_coop_eater/models/product.py @@ -1,5 +1,4 @@ -# -*- coding: utf-8 -*- -from openerp import fields, models +from odoo import fields, models class ProductTemplate(models.Model): diff --git a/easy_my_coop_eater/view/product_view.xml b/easy_my_coop_eater/view/product_view.xml index 6dbd670..ab1ff8d 100644 --- a/easy_my_coop_eater/view/product_view.xml +++ b/easy_my_coop_eater/view/product_view.xml @@ -3,7 +3,7 @@ product.template.share.form product.template - + From 5dc5bd6b50e60a7b85ac60f3ddee4837a7fcd2c6 Mon Sep 17 00:00:00 2001 From: Vincent Van Rossem Date: Wed, 15 Apr 2020 12:57:34 +0200 Subject: [PATCH 08/29] [IMP] easy_my_coop_eater: black formatter --- easy_my_coop_eater/__manifest__.py | 8 +++----- easy_my_coop_eater/models/__init__.py | 2 +- easy_my_coop_eater/models/coop.py | 10 ++++++---- easy_my_coop_eater/models/product.py | 9 +++++---- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/easy_my_coop_eater/__manifest__.py b/easy_my_coop_eater/__manifest__.py index b69e7f6..7d77516 100644 --- a/easy_my_coop_eater/__manifest__.py +++ b/easy_my_coop_eater/__manifest__.py @@ -23,12 +23,10 @@ "depends": ["easy_my_coop", "partner_age"], "author": "Coop IT Easy SCRLfs", "category": "Cooperative management", - 'website': "www.coopiteasy.be", + "website": "www.coopiteasy.be", "description": """ This module allows to manage the activity of the cooperator. """, - 'data': [ - 'view/product_view.xml', - ], - 'installable': True, + "data": ["view/product_view.xml"], + "installable": True, } diff --git a/easy_my_coop_eater/models/__init__.py b/easy_my_coop_eater/models/__init__.py index 8eb5751..2031973 100644 --- a/easy_my_coop_eater/models/__init__.py +++ b/easy_my_coop_eater/models/__init__.py @@ -1,2 +1,2 @@ from . import coop -from . import product \ No newline at end of file +from . import product diff --git a/easy_my_coop_eater/models/coop.py b/easy_my_coop_eater/models/coop.py index 3ce4d7f..a334453 100644 --- a/easy_my_coop_eater/models/coop.py +++ b/easy_my_coop_eater/models/coop.py @@ -2,23 +2,25 @@ from odoo import api, models class SubscriptionRequest(models.Model): - _inherit = 'subscription.request' + _inherit = "subscription.request" def get_eater_vals(self, partner, share_product_id): vals = {} eater = share_product_id.eater if partner.is_company or partner.age < 18: - eater = 'eater' + eater = "eater" - vals['eater'] = eater + vals["eater"] = eater return vals @api.one def validate_subscription_request(self): - invoice = super(SubscriptionRequest, self).validate_subscription_request()[0] + invoice = super( + SubscriptionRequest, self + ).validate_subscription_request()[0] partner = invoice.partner_id vals = self.get_eater_vals(partner, self.share_product_id) diff --git a/easy_my_coop_eater/models/product.py b/easy_my_coop_eater/models/product.py index d9a20ce..8d0e9c1 100644 --- a/easy_my_coop_eater/models/product.py +++ b/easy_my_coop_eater/models/product.py @@ -2,8 +2,9 @@ from odoo import fields, models class ProductTemplate(models.Model): - _inherit = 'product.template' + _inherit = "product.template" - eater = fields.Selection([('eater', 'Eater'), - ('worker_eater', 'Worker and Eater')], - string="Eater/Worker") + eater = fields.Selection( + [("eater", "Eater"), ("worker_eater", "Worker and Eater")], + string="Eater/Worker", + ) From 20eab7a654cadee448e60ceecdedca51a0da8844 Mon Sep 17 00:00:00 2001 From: Vincent Van Rossem Date: Wed, 15 Apr 2020 14:30:23 +0200 Subject: [PATCH 09/29] [IMP] easy_my_coop_eater: license and website --- easy_my_coop_eater/README.rst | 54 +++ easy_my_coop_eater/__manifest__.py | 29 +- easy_my_coop_eater/readme/CONTRIBUTORS.rst | 1 + easy_my_coop_eater/readme/DESCRIPTION.rst | 1 + .../static/description/index.html | 415 ++++++++++++++++++ 5 files changed, 478 insertions(+), 22 deletions(-) create mode 100644 easy_my_coop_eater/README.rst create mode 100644 easy_my_coop_eater/readme/CONTRIBUTORS.rst create mode 100644 easy_my_coop_eater/readme/DESCRIPTION.rst create mode 100644 easy_my_coop_eater/static/description/index.html diff --git a/easy_my_coop_eater/README.rst b/easy_my_coop_eater/README.rst new file mode 100644 index 0000000..122f714 --- /dev/null +++ b/easy_my_coop_eater/README.rst @@ -0,0 +1,54 @@ +========================= +Easy My Coop Eater/worker +========================= + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/github-coopiteasy%2Fvertical--cooperative-lightgray.png?logo=github + :target: https://github.com/coopiteasy/vertical-cooperative/tree/12.0/easy_my_coop_eater + :alt: coopiteasy/vertical-cooperative + +|badge1| |badge2| + + This module allows to manage the activity of the cooperator in the supermarket. + +**Table of contents** + +.. contents:: + :local: + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Coop IT Easy SCRLfs + +Contributors +~~~~~~~~~~~~ + +* Coop IT Easy SCRLfs + +Maintainers +~~~~~~~~~~~ + +This module is part of the `coopiteasy/vertical-cooperative `_ project on GitHub. + +You are welcome to contribute. diff --git a/easy_my_coop_eater/__manifest__.py b/easy_my_coop_eater/__manifest__.py index 7d77516..a97c046 100644 --- a/easy_my_coop_eater/__manifest__.py +++ b/easy_my_coop_eater/__manifest__.py @@ -1,31 +1,16 @@ -############################################################################## -# -# Copyright (C) 2013-2017 Open Architects Consulting SPRL. -# Copyright (C) 2018- Coop IT Easy SCRLfs. -# -# 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 . -# -############################################################################## +# Copyright 2013-2017 Open Architects Consulting SPRL. +# Copyright 2018- Coop IT Easy SCRLfs +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { "name": "Easy My Coop Eater/worker", "version": "12.0.1.0.0", "depends": ["easy_my_coop", "partner_age"], "author": "Coop IT Easy SCRLfs", + "license": "AGPL-3", "category": "Cooperative management", - "website": "www.coopiteasy.be", - "description": """ - This module allows to manage the activity of the cooperator. + "website": "https://coopiteasy.be", + "summary": """ + This module allows to manage the activity of the cooperator in the supermarket. """, "data": ["view/product_view.xml"], "installable": True, diff --git a/easy_my_coop_eater/readme/CONTRIBUTORS.rst b/easy_my_coop_eater/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000..b2844f3 --- /dev/null +++ b/easy_my_coop_eater/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Coop IT Easy SCRLfs diff --git a/easy_my_coop_eater/readme/DESCRIPTION.rst b/easy_my_coop_eater/readme/DESCRIPTION.rst new file mode 100644 index 0000000..74854ab --- /dev/null +++ b/easy_my_coop_eater/readme/DESCRIPTION.rst @@ -0,0 +1 @@ + This module allows to manage the activity of the cooperator in the supermarket. diff --git a/easy_my_coop_eater/static/description/index.html b/easy_my_coop_eater/static/description/index.html new file mode 100644 index 0000000..94a17c7 --- /dev/null +++ b/easy_my_coop_eater/static/description/index.html @@ -0,0 +1,415 @@ + + + + + + +Easy My Coop Eater/worker + + + +
+

Easy My Coop Eater/worker

+ + +

Beta coopiteasy/vertical-cooperative

+
+This module allows to manage the activity of the cooperator in the supermarket.
+

Table of contents

+ +
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Contributors

+
    +
  • Coop IT Easy SCRLfs
  • +
+
+
+

Maintainers

+

This module is part of the coopiteasy/vertical-cooperative project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + From 4065207d2ca3b7408bab5b12db8ab6150b03a3e1 Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Tue, 21 Apr 2020 18:22:16 +0200 Subject: [PATCH 10/29] [REF] OCA pre-commit compliance --- .isort.cfg | 2 +- README.md | 42 + easy_my_coop/__manifest__.py | 100 +- .../migrations/8.0.1.0/pre-migration.py | 59 +- easy_my_coop/models/account_invoice.py | 372 ++-- easy_my_coop/models/account_journal.py | 27 +- easy_my_coop/models/company.py | 176 +- easy_my_coop/models/coop.py | 1713 +++++++++-------- easy_my_coop/models/operation_request.py | 767 ++++---- easy_my_coop/models/partner.py | 185 +- easy_my_coop/models/product.py | 78 +- easy_my_coop/models/res_partner_bank.py | 29 +- easy_my_coop/report/account_invoice_report.py | 32 +- easy_my_coop/wizard/account_invoice_refund.py | 10 +- .../create_subscription_from_partner.py | 216 ++- easy_my_coop/wizard/update_partner_info.py | 49 +- easy_my_coop/wizard/update_share_line.py | 44 +- .../wizard/validate_subscription_request.py | 8 +- easy_my_coop_be/__manifest__.py | 19 +- easy_my_coop_be/models/coop.py | 53 +- easy_my_coop_be/models/partner.py | 24 +- easy_my_coop_ch/__manifest__.py | 46 +- easy_my_coop_ch/models/coop.py | 47 +- easy_my_coop_ch/models/partner.py | 34 +- .../views/certificate_template.xml | 63 - easy_my_coop_dividend/__manifest__.py | 37 +- easy_my_coop_dividend/models/dividend.py | 403 ++-- easy_my_coop_export_xlsx/__manifest__.py | 31 +- .../wizard/export_global_wizard.py | 603 +++--- easy_my_coop_fr/__manifest__.py | 17 +- easy_my_coop_fr/models/coop.py | 40 +- easy_my_coop_fr/models/partner.py | 26 +- easy_my_coop_loan/__manifest__.py | 56 +- easy_my_coop_loan/models/interest_line.py | 124 +- easy_my_coop_loan/models/loan.py | 196 +- easy_my_coop_loan/models/loan_issue_line.py | 120 +- easy_my_coop_loan/models/partner.py | 6 +- easy_my_coop_loan/tests/test_emc_loan.py | 7 +- easy_my_coop_loan_website/__manifest__.py | 45 +- easy_my_coop_loan_website/controllers/main.py | 198 +- .../__manifest__.py | 2 +- .../models/mail_template.py | 6 +- .../models/tax_shelter_declaration.py | 82 +- easy_my_coop_website/__manifest__.py | 22 +- easy_my_coop_website/controllers/main.py | 408 ++-- easy_my_coop_website_portal/__manifest__.py | 23 +- .../controllers/main.py | 303 +-- .../__manifest__.py | 33 +- .../controllers/main.py | 122 +- partner_age/__manifest__.py | 16 +- partner_age/models/partner.py | 75 +- theme_light/__manifest__.py | 28 +- website_recaptcha_reloaded/__manifest__.py | 32 +- .../models/res_config.py | 18 +- website_recaptcha_reloaded/website.py | 39 +- 55 files changed, 3943 insertions(+), 3370 deletions(-) delete mode 100644 easy_my_coop_ch/views/certificate_template.xml diff --git a/.isort.cfg b/.isort.cfg index ed8c868..821e287 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -9,4 +9,4 @@ line_length=79 known_odoo=odoo known_odoo_addons=odoo.addons sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER -known_third_party=dateutil,phonenumbers +known_third_party=addons,cStringIO,openerp,requests,werkzeug,xlsxwriter diff --git a/README.md b/README.md index e19d749..51bff9e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,44 @@ # vertical-cooperative This repository gather odoo modules for cooperatives + +# MAKE TRAVIS GREEN AGAIN + +pre-commit still issues these messages. They need to be fixed. + +``` +************* Module easy_my_coop.models.partner +easy_my_coop/models/partner.py:56: [E8103(sql-injection), ResPartner._invoice_total] SQL injection risk. Use parameters if you can. - More info https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst#no-sql-injection +************* Module partner_age.models.partner +partner_age/models/partner.py:13: [E8103(sql-injection), ResPartner._search_age] SQL injection risk. Use parameters if you can. - More info https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst#no-sql-injection +************* Module easy_my_coop_taxshelter_report.models.tax_shelter_declaration +easy_my_coop_taxshelter_report/models/tax_shelter_declaration.py:325: [E8102(invalid-commit), TaxShelterCertificate.send_certificates] Use of cr.commit() directly - More info https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst#never-commit-the-transaction +************* Module easy_my_coop.models.account_invoice +easy_my_coop/models/account_invoice.py:11: [C8104(class-camelcase), account_invoice] Use `CamelCase` "AccountInvoice" in class name "account_invoice". You can use oca-autopep8 of https://github.com/OCA/maintainer-tools to auto fix it. +************* Module easy_my_coop.models.operation_request +easy_my_coop/models/operation_request.py:12: [C8104(class-camelcase), operation_request] Use `CamelCase` "OperationRequest" in class name "operation_request". You can use oca-autopep8 of https://github.com/OCA/maintainer-tools to auto fix it. +************* Module easy_my_coop.models.coop +easy_my_coop/models/coop.py:287: [C8108(method-compute), SubscriptionRequest] Name of compute method should start with "_compute_" +************* Module website_recaptcha_reloaded.models.res_config +website_recaptcha_reloaded/models/res_config.py:7: [C8104(class-camelcase), website_config_settings] Use `CamelCase` "WebsiteConfigSettings" in class name "website_config_settings". You can use oca-autopep8 of https://github.com/OCA/maintainer-tools to auto fix it. +************* Module easy_my_coop.models.company +easy_my_coop/models/company.py:61: [C8108(method-compute), ResCompany] Name of compute method should start with "_compute_" + +pylint with mandatory checks.............................................Failed +- hook id: pylint +- exit code: 18 + +************* Module easy_my_coop.models.partner +easy_my_coop/models/partner.py:56: [E8103(sql-injection), ResPartner._invoice_total] SQL injection risk. Use parameters if you can. - More info https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst#no-sql-injection +************* Module partner_age.models.partner +partner_age/models/partner.py:13: [E8103(sql-injection), ResPartner._search_age] SQL injection risk. Use parameters if you can. - More info https://github.com/OCA/odoo-community.org/blob/master/website/Contribution/CONTRIBUTING.rst#no-sql-injection +************* Module easy_my_coop.models.account_invoice +easy_my_coop/models/account_invoice.py:11: [C8104(class-camelcase), account_invoice] Use `CamelCase` "AccountInvoice" in class name "account_invoice". You can use oca-autopep8 of https://github.com/OCA/maintainer-tools to auto fix it. +************* Module easy_my_coop.models.operation_request +easy_my_coop/models/operation_request.py:12: [C8104(class-camelcase), operation_request] Use `CamelCase` "OperationRequest" in class name "operation_request". You can use oca-autopep8 of https://github.com/OCA/maintainer-tools to auto fix it. +************* Module easy_my_coop.models.coop +easy_my_coop/models/coop.py:287: [C8108(method-compute), SubscriptionRequest] Name of compute method should start with "_compute_" +************* Module website_recaptcha_reloaded.models.res_config +website_recaptcha_reloaded/models/res_config.py:7: [C8104(class-camelcase), website_config_settings] Use `CamelCase` "WebsiteConfigSettings" in class name "website_config_settings". You can use oca-autopep8 of https://github.com/OCA/maintainer-tools to auto fix it. +************* Module easy_my_coop.models.company +easy_my_coop/models/company.py:61: [C8108(method-compute), ResCompany] Name of compute method should start with "_compute_" +``` diff --git a/easy_my_coop/__manifest__.py b/easy_my_coop/__manifest__.py index 89b3073..a6bc9ae 100644 --- a/easy_my_coop/__manifest__.py +++ b/easy_my_coop/__manifest__.py @@ -4,59 +4,53 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - 'name': 'Easy My Coop', - 'version': '12.0.3.0.1', - 'depends': [ - 'base', - 'web', - 'sale', - 'account', - 'base_iban', - 'product', - 'partner_firstname', - 'partner_contact_birthdate', - 'partner_contact_address', - 'email_template_config', + "name": "Easy My Coop", + "summary": "Manage your cooperative shares", + "version": "12.0.3.0.1", + "depends": [ + "base", + "web", + "sale", + "account", + "base_iban", + "product", + "partner_firstname", + "partner_contact_birthdate", + "partner_contact_address", + "email_template_config", ], - 'author': 'Coop IT Easy SCRLfs', - 'category': 'Cooperative management', - 'website': 'https://www.coopiteasy.be', - 'license': 'AGPL-3', - 'description': """ - This module allows to manage the cooperator subscription and all the - cooperative business processes. - """, - 'data': [ - 'data/easy_my_coop_data.xml', - 'data/paperformat.xml', - 'security/res_groups.xml', - 'security/ir.model.access.csv', - 'wizard/create_subscription_from_partner.xml', - 'wizard/update_partner_info.xml', - 'wizard/validate_subscription_request.xml', - 'wizard/update_share_line.xml', - 'views/subscription_request_view.xml', - 'views/email_template_view.xml', - 'views/res_partner_view.xml', - 'views/cooperator_register_view.xml', - 'views/operation_request_view.xml', - 'views/account_invoice_view.xml', - 'views/product_view.xml', - 'views/res_company_view.xml', - 'views/account_journal_view.xml', - 'views/menus.xml', - 'report/easy_my_coop_report.xml', - 'report/layout.xml', - 'report/cooperator_invoice_G002.xml', - 'report/cooperator_certificat_G001.xml', - 'report/cooperator_subscription_G001.xml', - 'report/cooperator_register_G001.xml', - 'data/mail_template_data.xml', # Must be loaded after reports + "author": "Coop IT Easy SCRLfs", + "category": "Cooperative management", + "website": "https://www.coopiteasy.be", + "license": "AGPL-3", + "data": [ + "data/easy_my_coop_data.xml", + "data/paperformat.xml", + "security/res_groups.xml", + "security/ir.model.access.csv", + "wizard/create_subscription_from_partner.xml", + "wizard/update_partner_info.xml", + "wizard/validate_subscription_request.xml", + "wizard/update_share_line.xml", + "views/subscription_request_view.xml", + "views/email_template_view.xml", + "views/res_partner_view.xml", + "views/cooperator_register_view.xml", + "views/operation_request_view.xml", + "views/account_invoice_view.xml", + "views/product_view.xml", + "views/res_company_view.xml", + "views/account_journal_view.xml", + "views/menus.xml", + "report/easy_my_coop_report.xml", + "report/layout.xml", + "report/cooperator_invoice_G002.xml", + "report/cooperator_certificat_G001.xml", + "report/cooperator_subscription_G001.xml", + "report/cooperator_register_G001.xml", + "data/mail_template_data.xml", # Must be loaded after reports ], - 'demo': [ - 'demo/coop.xml', - 'demo/users.xml', - ], - 'installable': True, - 'application': True, + "demo": ["demo/coop.xml", "demo/users.xml"], + "installable": True, + "application": True, } diff --git a/easy_my_coop/migrations/8.0.1.0/pre-migration.py b/easy_my_coop/migrations/8.0.1.0/pre-migration.py index fc9f222..c0776dd 100644 --- a/easy_my_coop/migrations/8.0.1.0/pre-migration.py +++ b/easy_my_coop/migrations/8.0.1.0/pre-migration.py @@ -1,30 +1,29 @@ -# -*- coding: utf-8 -*- - -from openerp.openupgrade import openupgrade -import logging - -logger = logging.getLogger('OpenUpgrade') - -column_renames = { - 'job_sync_line': [ - ('adresse', 'address'), - ('ville', 'city'), - ('codepostal', 'zip'), - ('sync_date','date'), - ], - } - -tables_renames = [ - ('job_sync_line','subscription_request'), - ('job_sync',None), - ('external_db',None), -] - -@openupgrade.migrate() -def migrate(cr, version): - if not version: - return - - openupgrade.rename_columns(cr, column_renames) - openupgrade.rename_tables(cr, tables_renames) - +import logging + +from openerp.openupgrade import openupgrade + +logger = logging.getLogger("OpenUpgrade") + +column_renames = { + "job_sync_line": [ + ("adresse", "address"), + ("ville", "city"), + ("codepostal", "zip"), + ("sync_date", "date"), + ] +} + +tables_renames = [ + ("job_sync_line", "subscription_request"), + ("job_sync", None), + ("external_db", None), +] + + +@openupgrade.migrate() +def migrate(cr, version): + if not version: + return + + openupgrade.rename_columns(cr, column_renames) + openupgrade.rename_tables(cr, tables_renames) diff --git a/easy_my_coop/models/account_invoice.py b/easy_my_coop/models/account_invoice.py index 8b2382e..2961085 100644 --- a/easy_my_coop/models/account_invoice.py +++ b/easy_my_coop/models/account_invoice.py @@ -1,175 +1,197 @@ -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from datetime import datetime - -from odoo import api, fields, models - - -class account_invoice(models.Model): - _inherit = 'account.invoice' - - subscription_request = fields.Many2one('subscription.request', - string='Subscription request') - release_capital_request = fields.Boolean( - string='Release of capital request') - - @api.model - def _prepare_refund(self, invoice, date_invoice=None, date=None, - description=None, journal_id=None): - values = super(account_invoice, self)._prepare_refund( - invoice, date_invoice, date, - description, journal_id) - values['release_capital_request'] = self.release_capital_request - - return values - - def create_user(self, partner): - user_obj = self.env['res.users'] - email = partner.email - - user = user_obj.search([('login', '=', email)]) - if not user: - user = user_obj.search([('login', '=', email), - ('active', '=', False)]) - if user: - user.sudo().write({'active': True}) - else: - user_values = {'partner_id': partner.id, 'login': email} - user = user_obj.sudo()._signup_create_user(user_values) - user.sudo().with_context({'create_user': True}).action_reset_password() - - return user - - def get_mail_template_certificate(self): - if self.partner_id.member: - mail_template = 'easy_my_coop.email_template_certificat_increase' - else: - mail_template = 'easy_my_coop.email_template_certificat' - return self.env.ref(mail_template) - - def get_sequence_register(self): - return self.env.ref('easy_my_coop.sequence_subscription', False) - - def get_sequence_operation(self): - return self.env.ref('easy_my_coop.sequence_register_operation', False) - - def get_share_line_vals(self, line, effective_date): - return { - 'share_number': line.quantity, - 'share_product_id': line.product_id.id, - 'partner_id': self.partner_id.id, - 'share_unit_price': line.price_unit, - 'effective_date': effective_date - } - - def get_subscription_register_vals(self, line, effective_date): - return { - 'partner_id': self.partner_id.id, - 'quantity': line.quantity, - 'share_product_id': line.product_id.id, - 'share_unit_price': line.price_unit, - 'date': effective_date, - 'type': 'subscription' - } - - def get_membership_vals(self): - # flag the partner as an effective member - # if not yet cooperator we generate a cooperator number - vals = {} - if self.partner_id.member is False \ - and self.partner_id.old_member is False: - sequence_id = self.get_sequence_register() - sub_reg_num = sequence_id.next_by_id() - vals = {'member': True, 'old_member': False, - 'cooperator_register_number': int(sub_reg_num) - } - elif self.partner_id.old_member: - vals = {'member': True, 'old_member': False} - - return vals - - def set_membership(self): - vals = self.get_membership_vals() - self.partner_id.write(vals) - - return True - - def send_certificate_email(self, certificate_email_template, sub_reg_line): - # we send the email with the certificate in attachment - certificate_email_template.sudo().send_mail(self.partner_id.id, False) - - def set_cooperator_effective(self, effective_date): - sub_register_obj = self.env['subscription.register'] - share_line_obj = self.env['share.line'] - - certificate_email_template = self.get_mail_template_certificate() - - self.set_membership() - - sequence_operation = self.get_sequence_operation() - sub_reg_operation = sequence_operation.next_by_id() - - for line in self.invoice_line_ids: - sub_reg_vals = self.get_subscription_register_vals(line, - effective_date) - sub_reg_vals['name'] = sub_reg_operation - sub_reg_vals['register_number_operation'] = int(sub_reg_operation) - - sub_reg_line = sub_register_obj.create(sub_reg_vals) - - share_line_vals = self.get_share_line_vals(line, effective_date) - share_line_obj.create(share_line_vals) - - if line.product_id.mail_template: - certificate_email_template = line.product_id.mail_template - - self.send_certificate_email(certificate_email_template, sub_reg_line) - - if self.company_id.create_user: - self.create_user(self.partner_id) - - return True - - def post_process_confirm_paid(self, effective_date): - self.set_cooperator_effective(effective_date) - - return True - - def get_refund_domain(self, invoice): - return [ - ('type', '=', 'out_refund'), - ('origin', '=', invoice.move_name) - ] - - @api.multi - def action_invoice_paid(self): - super(account_invoice, self).action_invoice_paid() - for invoice in self: - # we check if there is an open refund for this invoice. in this - # case we don't run the process_subscription function as the - # invoice has been reconciled with a refund and not a payment. - domain = self.get_refund_domain(invoice) - refund = self.search(domain) - - if invoice.partner_id.cooperator \ - and invoice.release_capital_request \ - and invoice.type == 'out_invoice' and not refund: - # take the effective date from the payment. - # by default the confirmation date is the payment date - effective_date = datetime.now().strftime("%d/%m/%Y") - - if invoice.payment_move_line_ids: - move_line = invoice.payment_move_line_ids[0] - effective_date = move_line.date - - invoice.subscription_request.state = 'paid' - invoice.post_process_confirm_paid(effective_date) - # if there is a open refund we mark the subscription as cancelled - elif invoice.partner_id.cooperator \ - and invoice.release_capital_request \ - and invoice.type == 'out_invoice' and refund: - invoice.subscription_request.state = 'cancelled' - return True +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from datetime import datetime + +from odoo import api, fields, models + + +class AccountInvoice(models.Model): + _inherit = "account.invoice" + + subscription_request = fields.Many2one( + "subscription.request", string="Subscription request" + ) + release_capital_request = fields.Boolean( + string="Release of capital request" + ) + + @api.model + def _prepare_refund( + self, + invoice, + date_invoice=None, + date=None, + description=None, + journal_id=None, + ): + values = super(AccountInvoice, self)._prepare_refund( + invoice, date_invoice, date, description, journal_id + ) + values["release_capital_request"] = self.release_capital_request + + return values + + def create_user(self, partner): + user_obj = self.env["res.users"] + email = partner.email + + user = user_obj.search([("login", "=", email)]) + if not user: + user = user_obj.search( + [("login", "=", email), ("active", "=", False)] + ) + if user: + user.sudo().write({"active": True}) + else: + user_values = {"partner_id": partner.id, "login": email} + user = user_obj.sudo()._signup_create_user(user_values) + user.sudo().with_context( + {"create_user": True} + ).action_reset_password() + + return user + + def get_mail_template_certificate(self): + if self.partner_id.member: + mail_template = "easy_my_coop.email_template_certificat_increase" + else: + mail_template = "easy_my_coop.email_template_certificat" + return self.env.ref(mail_template) + + def get_sequence_register(self): + return self.env.ref("easy_my_coop.sequence_subscription", False) + + def get_sequence_operation(self): + return self.env.ref("easy_my_coop.sequence_register_operation", False) + + def get_share_line_vals(self, line, effective_date): + return { + "share_number": line.quantity, + "share_product_id": line.product_id.id, + "partner_id": self.partner_id.id, + "share_unit_price": line.price_unit, + "effective_date": effective_date, + } + + def get_subscription_register_vals(self, line, effective_date): + return { + "partner_id": self.partner_id.id, + "quantity": line.quantity, + "share_product_id": line.product_id.id, + "share_unit_price": line.price_unit, + "date": effective_date, + "type": "subscription", + } + + def get_membership_vals(self): + # flag the partner as an effective member + # if not yet cooperator we generate a cooperator number + vals = {} + if ( + self.partner_id.member is False + and self.partner_id.old_member is False + ): + sequence_id = self.get_sequence_register() + sub_reg_num = sequence_id.next_by_id() + vals = { + "member": True, + "old_member": False, + "cooperator_register_number": int(sub_reg_num), + } + elif self.partner_id.old_member: + vals = {"member": True, "old_member": False} + + return vals + + def set_membership(self): + vals = self.get_membership_vals() + self.partner_id.write(vals) + + return True + + def send_certificate_email(self, certificate_email_template, sub_reg_line): + # we send the email with the certificate in attachment + certificate_email_template.sudo().send_mail(self.partner_id.id, False) + + def set_cooperator_effective(self, effective_date): + sub_register_obj = self.env["subscription.register"] + share_line_obj = self.env["share.line"] + + certificate_email_template = self.get_mail_template_certificate() + + self.set_membership() + + sequence_operation = self.get_sequence_operation() + sub_reg_operation = sequence_operation.next_by_id() + + for line in self.invoice_line_ids: + sub_reg_vals = self.get_subscription_register_vals( + line, effective_date + ) + sub_reg_vals["name"] = sub_reg_operation + sub_reg_vals["register_number_operation"] = int(sub_reg_operation) + + sub_reg_line = sub_register_obj.create(sub_reg_vals) + + share_line_vals = self.get_share_line_vals(line, effective_date) + share_line_obj.create(share_line_vals) + + if line.product_id.mail_template: + certificate_email_template = line.product_id.mail_template + + self.send_certificate_email(certificate_email_template, sub_reg_line) + + if self.company_id.create_user: + self.create_user(self.partner_id) + + return True + + def post_process_confirm_paid(self, effective_date): + self.set_cooperator_effective(effective_date) + + return True + + def get_refund_domain(self, invoice): + return [ + ("type", "=", "out_refund"), + ("origin", "=", invoice.move_name), + ] + + @api.multi + def action_invoice_paid(self): + super(AccountInvoice, self).action_invoice_paid() + for invoice in self: + # we check if there is an open refund for this invoice. in this + # case we don't run the process_subscription function as the + # invoice has been reconciled with a refund and not a payment. + domain = self.get_refund_domain(invoice) + refund = self.search(domain) + + if ( + invoice.partner_id.cooperator + and invoice.release_capital_request + and invoice.type == "out_invoice" + and not refund + ): + # take the effective date from the payment. + # by default the confirmation date is the payment date + effective_date = datetime.now().strftime("%d/%m/%Y") + + if invoice.payment_move_line_ids: + move_line = invoice.payment_move_line_ids[0] + effective_date = move_line.date + + invoice.subscription_request.state = "paid" + invoice.post_process_confirm_paid(effective_date) + # if there is a open refund we mark the subscription as cancelled + elif ( + invoice.partner_id.cooperator + and invoice.release_capital_request + and invoice.type == "out_invoice" + and refund + ): + invoice.subscription_request.state = "cancelled" + return True diff --git a/easy_my_coop/models/account_journal.py b/easy_my_coop/models/account_journal.py index 9ec7ae1..8c85fa4 100644 --- a/easy_my_coop/models/account_journal.py +++ b/easy_my_coop/models/account_journal.py @@ -1,14 +1,13 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from odoo import fields, models - - -class AccountJournal(models.Model): - _inherit = "account.journal" - - get_cooperator_payment = fields.Boolean('Get cooperator payments?') - get_general_payment = fields.Boolean(string='Get general payments?') +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from odoo import fields, models + + +class AccountJournal(models.Model): + _inherit = "account.journal" + + get_cooperator_payment = fields.Boolean("Get cooperator payments?") + get_general_payment = fields.Boolean(string="Get general payments?") diff --git a/easy_my_coop/models/company.py b/easy_my_coop/models/company.py index 843f5b0..312d315 100644 --- a/easy_my_coop/models/company.py +++ b/easy_my_coop/models/company.py @@ -1,83 +1,93 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from odoo import api, fields, models - - -class ResCompany(models.Model): - _inherit = 'res.company' - - def _get_base_logo(self): - base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - self.logo_url = base_url + "/logo.png" - - coop_email_contact = fields.Char(string="Contact email address for the" - " cooperator") - subscription_maximum_amount = fields.Float(string="Maximum authorised" - " subscription amount") - default_country_id = fields.Many2one('res.country', - string="Default country", - default=lambda self: self.country_id) - default_lang_id = fields.Many2one('res.lang', - string="Default lang") - allow_id_card_upload = fields.Boolean(string="Allow ID Card upload") - create_user = fields.Boolean(string="Create user for cooperator", - default=False) - board_representative = fields.Char(string="Board representative name") - signature_scan = fields.Binary(string="Board representative signature") - property_cooperator_account = fields.Many2one('account.account', - company_dependent=True, - string="Cooperator Account", - domain=[('internal_type', '=', 'receivable'), - ('deprecated', '=', False)], - help="This account will be" - " the default one as the" - " receivable account for the" - " cooperators", - required=True) - unmix_share_type = fields.Boolean(string="Unmix share type", - default=True, - help="If checked, A cooperator will be" - " authorised to have only one type" - " of share") - display_logo1 = fields.Boolean(string="Display logo 1") - display_logo2 = fields.Boolean(string="Display logo 2") - bottom_logo1 = fields.Binary(string="Bottom logo 1") - bottom_logo2 = fields.Binary(string="Bottom logo 2") - logo_url = fields.Char(string="logo url", - compute="_get_base_logo") - display_data_policy_approval = fields.Boolean( - help="Choose to display a data policy checkbox on the cooperator" - " website form." - ) - data_policy_approval_required = fields.Boolean( - string="Is data policy approval required?" - ) - data_policy_approval_text = fields.Html( - translate=True, - help="Text to display aside the checkbox to approve data policy." - ) - display_internal_rules_approval = fields.Boolean( - help="Choose to display an internal rules checkbox on the" - " cooperator website form." - ) - internal_rules_approval_required = fields.Boolean( - string="Is internal rules approval required?" - ) - internal_rules_approval_text = fields.Html( - translate=True, - help="Text to display aside the checkbox to approve internal rules." - ) - - @api.onchange('data_policy_approval_required') - def onchange_data_policy_approval_required(self): - if self.data_policy_approval_required: - self.display_data_policy_approval = True - - @api.onchange('internal_rules_approval_required') - def onchange_internal_rules_approval_required(self): - if self.internal_rules_approval_required: - self.display_internal_rules_approval = True +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from odoo import api, fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + def _get_base_logo(self): + base_url = ( + self.env["ir.config_parameter"].sudo().get_param("web.base.url") + ) + self.logo_url = base_url + "/logo.png" + + coop_email_contact = fields.Char( + string="Contact email address for the" " cooperator" + ) + subscription_maximum_amount = fields.Float( + string="Maximum authorised" " subscription amount" + ) + default_country_id = fields.Many2one( + "res.country", + string="Default country", + default=lambda self: self.country_id, + ) + default_lang_id = fields.Many2one("res.lang", string="Default lang") + allow_id_card_upload = fields.Boolean(string="Allow ID Card upload") + create_user = fields.Boolean( + string="Create user for cooperator", default=False + ) + board_representative = fields.Char(string="Board representative name") + signature_scan = fields.Binary(string="Board representative signature") + property_cooperator_account = fields.Many2one( + "account.account", + company_dependent=True, + string="Cooperator Account", + domain=[ + ("internal_type", "=", "receivable"), + ("deprecated", "=", False), + ], + help="This account will be" + " the default one as the" + " receivable account for the" + " cooperators", + required=True, + ) + unmix_share_type = fields.Boolean( + string="Unmix share type", + default=True, + help="If checked, A cooperator will be" + " authorised to have only one type" + " of share", + ) + display_logo1 = fields.Boolean(string="Display logo 1") + display_logo2 = fields.Boolean(string="Display logo 2") + bottom_logo1 = fields.Binary(string="Bottom logo 1") + bottom_logo2 = fields.Binary(string="Bottom logo 2") + logo_url = fields.Char(string="logo url", compute="_get_base_logo") + display_data_policy_approval = fields.Boolean( + help="Choose to display a data policy checkbox on the cooperator" + " website form." + ) + data_policy_approval_required = fields.Boolean( + string="Is data policy approval required?" + ) + data_policy_approval_text = fields.Html( + translate=True, + help="Text to display aside the checkbox to approve data policy.", + ) + display_internal_rules_approval = fields.Boolean( + help="Choose to display an internal rules checkbox on the" + " cooperator website form." + ) + internal_rules_approval_required = fields.Boolean( + string="Is internal rules approval required?" + ) + internal_rules_approval_text = fields.Html( + translate=True, + help="Text to display aside the checkbox to approve internal rules.", + ) + + @api.onchange("data_policy_approval_required") + def onchange_data_policy_approval_required(self): + if self.data_policy_approval_required: + self.display_data_policy_approval = True + + @api.onchange("internal_rules_approval_required") + def onchange_internal_rules_approval_required(self): + if self.internal_rules_approval_required: + self.display_internal_rules_approval = True diff --git a/easy_my_coop/models/coop.py b/easy_my_coop/models/coop.py index 3b7376d..ce3b1f8 100644 --- a/easy_my_coop/models/coop.py +++ b/easy_my_coop/models/coop.py @@ -1,776 +1,937 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from datetime import datetime - -from odoo import api, fields, models, _ -from addons.base_iban.models.res_partner_bank import validate_iban -from odoo.exceptions import UserError, ValidationError - -_REQUIRED = ['email', - 'firstname', - 'lastname', - 'birthdate', - 'address', - 'share_product_id', - 'ordered_parts', - 'zip_code', - 'city', - 'iban', - 'gender'] - - -@api.model -def _lang_get(self): - languages = self.env['res.lang'].search([]) - return [(language.code, language.name) for language in languages] - - -# todo move to subscription_request.py -class SubscriptionRequest(models.Model): - _name = 'subscription.request' - _description = 'Subscription Request' - - def get_required_field(self): - required_fields = _REQUIRED - company = self.env['res.company']._company_default_get() - if company.data_policy_approval_required: - required_fields.append('data_policy_approved') - if company.internal_rules_approval_required: - required_fields.append('internal_rules_approved') - return required_fields - - def get_mail_template_notif(self, is_company=False): - if is_company: - mail_template = 'easy_my_coop.email_template_confirmation_company' - else: - mail_template = 'easy_my_coop.email_template_confirmation' - return self.env.ref(mail_template, False) - - def is_member(self, vals, cooperator): - if cooperator.member: - vals['type'] = 'increase' - vals['already_cooperator'] = True - return vals - - @api.model - def create(self, vals): - partner_obj = self.env['res.partner'] - - if not vals.get('partner_id'): - cooperator = False - if vals.get('email'): - cooperator = partner_obj.get_cooperator_from_email( - vals.get('email')) - if cooperator: - # TODO remove the following line once it has - # been found a way to avoid double encoding - cooperator = cooperator[0] - vals['type'] = 'subscription' - vals = self.is_member(vals, cooperator) - vals['partner_id'] = cooperator.id - else: - cooperator_id = vals.get('partner_id') - cooperator = partner_obj.browse(cooperator_id) - vals = self.is_member(vals, cooperator) - - if not cooperator.cooperator: - cooperator.write({'cooperator': True}) - subscr_request = super(SubscriptionRequest, self).create(vals) - - mail_template_notif = subscr_request.get_mail_template_notif(False) - mail_template_notif.send_mail(subscr_request.id) - - return subscr_request - - @api.model - def create_comp_sub_req(self, vals): - vals["name"] = vals['company_name'] - if not vals.get('partner_id'): - cooperator = self.env['res.partner'].get_cooperator_from_crn(vals.get('company_register_number')) - if cooperator: - vals['partner_id'] = cooperator.id - vals['type'] = 'increase' - vals['already_cooperator'] = True - subscr_request = super(SubscriptionRequest, self).create(vals) - - confirmation_mail_template = subscr_request.get_mail_template_notif(True) - confirmation_mail_template.send_mail(subscr_request.id) - - return subscr_request - - def check_empty_string(self, value): - if value is None or value is False or value == '': - return False - return True - - def check_iban(self, iban): - try: - if iban: - validate_iban(iban) - return True - else: - return False - except ValidationError: - return False - - @api.multi - @api.depends('iban', 'skip_control_ng') - def _validated_lines(self): - for sub_request in self: - validated = ( - sub_request.skip_control_ng - or self.check_iban(sub_request.iban) - ) - sub_request.validated = validated - - @api.multi - @api.depends('share_product_id', - 'share_product_id.list_price', - 'ordered_parts') - def _compute_subscription_amount(self): - for sub_request in self: - sub_request.subscription_amount = (sub_request.share_product_id. - list_price * - sub_request.ordered_parts) - - already_cooperator = fields.Boolean(string="I'm already cooperator", - readonly=True, - states={'draft': [('readonly', False)]} - ) - name = fields.Char(string='Name', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}) - firstname = fields.Char(string='Firstname', - readonly=True, - states={'draft': [('readonly', False)]}) - lastname = fields.Char(string='Lastname', - readonly=True, - states={'draft': [('readonly', False)]}) - birthdate = fields.Date(string="Birthdate", - readonly=True, - states={'draft': [('readonly', False)]}) - gender = fields.Selection([('male', _('Male')), - ('female', _('Female')), - ('other', _('Other'))], - string='Gender', - readonly=True, - states={'draft': [('readonly', False)]}) - type = fields.Selection([('new', 'New Cooperator'), - ('subscription', 'Subscription'), - ('increase', 'Increase number of share')], - string='Type', default="new", - readonly=True, - states={'draft': [('readonly', False)]}) - state = fields.Selection([('draft', 'Draft'), - ('block', 'Blocked'), - ('done', 'Done'), - ('waiting', 'Waiting'), - ('transfer', 'Transfer'), - ('cancelled', 'Cancelled'), - ('paid', 'paid')], - string='State', required=True, default="draft") - email = fields.Char(string='Email', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}) - iban = fields.Char(string='Account Number', - readonly=True, - states={'draft': [('readonly', False)]}) - partner_id = fields.Many2one('res.partner', - string='Cooperator', - readonly=True, - states={'draft': [('readonly', False)]}) - share_product_id = fields.Many2one('product.product', - string='Share type', - domain=[('is_share', '=', True)], - required=True, - readonly=True, - states={'draft': [('readonly', False)]}) - share_short_name = fields.Char(related='share_product_id.short_name', - string='Share type name', - readonly=True, - states={'draft': [('readonly', False)]}) - share_unit_price = fields.Float(related='share_product_id.list_price', - string='Share price', - readonly=True, - states={'draft': [('readonly', False)]}) - subscription_amount = fields.Monetary( - compute='_compute_subscription_amount', - string='Subscription amount', - currency_field="company_currency_id", - readonly=True, - states={'draft': [('readonly', False)]}, - ) - ordered_parts = fields.Integer(string='Number of Share', - required=True, - readonly=True, - default=1, - states={'draft': [('readonly', False)]}) - address = fields.Char(string='Address', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}) - city = fields.Char(string='City', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}) - zip_code = fields.Char(string='Zip Code', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}) - country_id = fields.Many2one('res.country', - string='Country', - ondelete='restrict', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}) - phone = fields.Char(string='Phone', - readonly=True, - states={'draft': [('readonly', False)]}) - user_id = fields.Many2one('res.users', - string='Responsible', - readonly=True) - # todo rename to valid_subscription_request - validated = fields.Boolean(compute='_validated_lines', - string='Valid Subscription request?', - readonly=True) - skip_control_ng = fields.Boolean(string="Skip control", - help="if this field is checked then no" - " control will be done on the national" - " register number and on the iban bank" - " account. To be done in case of the id" - " card is from abroad or in case of" - " a passport") - lang = fields.Selection(_lang_get, - string='Language', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}, - default=lambda self: self.env['res.company']._company_default_get().default_lang_id.code) - date = fields.Date(string='Subscription date request', - required=True, - readonly=True, - states={'draft': [('readonly', False)]}, - default=lambda self: datetime.strftime(datetime.now(), - '%Y-%m-%d')) - company_id = fields.Many2one('res.company', - string='Company', - required=True, - change_default=True, - readonly=True, - default=lambda self: self.env['res.company']._company_default_get()) - company_currency_id = fields.Many2one( - "res.currency", - related="company_id.currency_id", - string="Company Currency", - readonly=True, - ) - is_company = fields.Boolean(string='Is a company', - readonly=True, - states={'draft': [('readonly', False)]}) - is_operation = fields.Boolean(string='Is an operation', - readonly=True, - states={'draft': [('readonly', False)]}) - company_name = fields.Char(string="Company name", - readonly=True, - states={'draft': [('readonly', False)]}) - company_email = fields.Char(string="Company email", - readonly=True, - states={'draft': [('readonly', False)]}) - company_register_number = fields.Char(string='Company register number', - readonly=True, - states={'draft': [('readonly', False)]}) - company_type = fields.Selection([('', '')], - string="Company type", - readonly=True, - states={'draft': [('readonly', False)]}) - same_address = fields.Boolean(string='Same address', - readonly=True, - states={'draft': [('readonly', False)]}) - activities_address = fields.Char(string='Activities address', - readonly=True, - states={'draft': [('readonly', False)]}) - activities_city = fields.Char(string='Activities city', - readonly=True, - states={'draft': [('readonly', False)]}) - activities_zip_code = fields.Char(string='Activities zip Code', - readonly=True, - states={'draft': [('readonly', False)]}) - activities_country_id = fields.Many2one('res.country', - string='Activities country', - ondelete='restrict', - readonly=True, - states={'draft': [('readonly', False)]}) - contact_person_function = fields.Char(string='Function', - readonly=True, - states={'draft': [('readonly', False)]}) - operation_request_id = fields.Many2one('operation.request', - string="Operation Request", - readonly=True, - states={'draft': [('readonly', False)]}) - capital_release_request = fields.One2many('account.invoice', - 'subscription_request', - string='Capital release request', - readonly=True, - states={'draft': [('readonly', False)]}) - capital_release_request_date = fields.Date(string="Force the capital " - "release request date", - help="Keep empty to use the " - "current date", - copy=False, - readonly=True, - states={'draft': [('readonly', False)]}) - source = fields.Selection([('website', 'Website'), - ('crm', 'CRM'), - ('manual', 'Manual'), - ('operation', 'Operation')], - string="Source", - default="website", - readonly=True, - states={'draft': [('readonly', False)]}) - data_policy_approved = fields.Boolean( - string='Data Policy Approved', - default=False, - ) - internal_rules_approved = fields.Boolean( - string='Approved Internal Rules', - default=False, - ) - _order = "id desc" - - def get_person_info(self, partner): - self.firstname = partner.firstname - self.name = partner.name - self.lastname = partner.lastname - self.email = partner.email - self.birthdate = partner.birthdate_date - self.gender = partner.gender - self.address = partner.street - self.city = partner.city - self.zip_code = partner.zip - self.country_id = partner.country_id - self.phone = partner.phone - self.lang = partner.lang - - @api.onchange('partner_id') - def onchange_partner(self): - partner = self.partner_id - if partner: - self.is_company = partner.is_company - self.already_cooperator = partner.member - if partner.bank_ids: - self.iban = partner.bank_ids[0].acc_number - if partner.member: - self.type = 'increase' - if partner.is_company: - self.company_name = partner.name - self.company_email = partner.email - self.company_register_number = partner.company_register_number - representative = partner.get_representative() - self.get_person_info(representative) - self.contact_person_function = representative.function - else: - self.get_person_info(partner) - - # declare this function in order to be overriden - def get_eater_vals(self, partner, share_product_id): #noqa - return {} - - def _prepare_invoice_line(self, product, partner, qty): - self.ensure_one() - account = product.property_account_income_id \ - or product.categ_id.property_account_income_categ_id - if not account: - raise UserError(_('Please define income account for this product:' - ' "%s" (id:%d) - or for its category: "%s".') % - (product.name, product.id, product.categ_id.name)) - - fpos = partner.property_account_position_id - if fpos: - account = fpos.map_account(account) - - res = { - 'name': product.name, - 'account_id': account.id, - 'price_unit': product.lst_price, - 'quantity': qty, - 'uom_id': product.uom_id.id, - 'product_id': product.id or False, - } - return res - - def get_capital_release_mail_template(self): - template = 'easy_my_coop.email_template_release_capital' - return self.env.ref(template, False) - - def send_capital_release_request(self, invoice): - email_template = self.get_capital_release_mail_template() - - # we send the email with the capital release request in attachment - # TODO remove sudo() and give necessary access right - email_template.sudo().send_mail(invoice.id, True) - invoice.sent = True - - def get_journal(self): - return self.env['account.journal'].search([('code', '=', 'SUBJ')])[0] - - def get_accounting_account(self): - account_obj = self.env['account.account'] - if self.company_id.property_cooperator_account: - account = self.company_id.property_cooperator_account - else: - accounts = account_obj.search([('code', '=', '416000')]) - if accounts: - account = accounts[0] - else: - raise UserError(_( - 'You must set a cooperator account on you company.' - )) - return account - - def get_invoice_vals(self, partner): - return { - 'partner_id': partner.id, - 'journal_id': self.get_journal().id, - 'account_id': self.get_accounting_account().id, - 'type': 'out_invoice', - 'release_capital_request': True, - 'subscription_request': self.id - } - - def create_invoice(self, partner): - # creating invoice and invoice lines - invoice_vals = self.get_invoice_vals(partner) - if self.capital_release_request_date: - invoice_vals['date_invoice'] = self.capital_release_request_date - invoice = self.env['account.invoice'].create(invoice_vals) - vals = self._prepare_invoice_line(self.share_product_id, partner, - self.ordered_parts) - vals['invoice_id'] = invoice.id - self.env['account.invoice.line'].create(vals) - - # validate the capital release request - invoice.action_invoice_open() - - self.send_capital_release_request(invoice) - - return invoice - - def get_partner_company_vals(self): - partner_vals = {'name': self.company_name, - 'last_name': self.company_name, - 'is_company': self.is_company, - 'company_register_number': self.company_register_number, # noqa - 'customer': False, 'cooperator': True, - 'street': self.address, 'zip': self.zip_code, - 'city': self.city, 'email': self.company_email, - 'out_inv_comm_type': 'bba', - 'customer': self.share_product_id.customer, - 'country_id': self.country_id.id, - 'lang': self.lang, - 'data_policy_approved': self.data_policy_approved, - 'internal_rules_approved': self.internal_rules_approved - } - return partner_vals - - def get_partner_vals(self): - partner_vals = {'name': self.name, 'firstname': self.firstname, - 'lastname': self.lastname, 'street': self.address, - 'zip': self.zip_code, 'email': self.email, - 'gender': self.gender, 'cooperator': True, - 'city': self.city, 'phone': self.phone, - 'country_id': self.country_id.id, 'lang': self.lang, - 'birthdate_date': self.birthdate, - 'customer': self.share_product_id.customer, - 'data_policy_approved': self.data_policy_approved, - 'internal_rules_approved': self.internal_rules_approved - } - return partner_vals - - def get_representative_vals(self): - contact_vals = { - 'name': self.name, - 'firstname': self.firstname, - 'lastname': self.lastname, 'customer': False, - 'is_company': False, 'cooperator': True, - 'street': self.address, 'gender': self.gender, - 'zip': self.zip_code, 'city': self.city, - 'phone': self.phone, 'email': self.email, - 'country_id': self.country_id.id, - 'out_inv_comm_type': 'bba', - 'out_inv_comm_algorithm': 'random', - 'lang': self.lang, - 'birthdate_date': self.birthdate, - 'parent_id': self.partner_id.id, - 'representative': True, - 'function': self.contact_person_function, - 'type': 'representative', - 'data_policy_approved': self.data_policy_approved, - 'internal_rules_approved': self.internal_rules_approved - } - return contact_vals - - def create_coop_partner(self): - partner_obj = self.env['res.partner'] - - if self.is_company: - partner_vals = self.get_partner_company_vals() - else: - partner_vals = self.get_partner_vals() - - partner = partner_obj.create(partner_vals) - if self.iban: - self.env['res.partner.bank'].create({ - 'partner_id': partner.id, - 'acc_number': self.iban - }) - return partner - - def set_membership(self): - # To be overridden - return True - - @api.one # todo remove api.one - def validate_subscription_request(self): - # todo rename to validate (careful with iwp dependencies) - partner_obj = self.env['res.partner'] - - if self.ordered_parts <= 0: - raise UserError(_('Number of share must be greater than 0.')) - if self.partner_id: - partner = self.partner_id - else: - partner = None - domain = [] - if self.already_cooperator: - raise UserError(_('The checkbox already cooperator is' - ' checked please select a cooperator.')) - elif self.is_company and self.company_register_number: - domain = [('company_register_number', '=', self.company_register_number)] # noqa - elif not self.is_company and self.email: - domain = [('email', '=', self.email)] - - if domain: - partner = partner_obj.search(domain) - - if not partner: - partner = self.create_coop_partner() - self.partner_id = partner - else: - partner = partner[0] - - partner.cooperator = True - - if self.is_company and not partner.has_representative(): - contact = False - if self.email: - domain = [('email', '=', self.email)] - contact = partner_obj.search(domain) - if contact: - contact.type = 'representative' - if not contact: - contact_vals = self.get_representative_vals() - partner_obj.create(contact_vals) - else: - if len(contact) > 1: - raise UserError(_('There is two different persons with the' - ' same national register number. Please' - ' proceed to a merge before to continue') - ) - if contact.parent_id and contact.parent_id.id != partner.id: - raise UserError(_('This contact person is already defined' - ' for another company. Please select' - ' another contact')) - else: - contact.write({'parent_id': partner.id, - 'representative': True}) - - invoice = self.create_invoice(partner) - self.write({'state': 'done'}) - self.set_membership() - - return invoice - - @api.one # todo remove api.one - def block_subscription_request(self): - self.write({'state': 'block'}) - - @api.one # todo remove api.one - def unblock_subscription_request(self): - self.write({'state': 'draft'}) - - @api.one # todo remove api.one - def cancel_subscription_request(self): - self.write({'state': 'cancelled'}) - - @api.one # todo remove api.one - def put_on_waiting_list(self): - waiting_list_mail_template = self.env.ref('easy_my_coop.email_template_waiting_list', False) - waiting_list_mail_template.send_mail(self.id, True) - self.write({'state': 'waiting'}) - - -# todo move to share_line.py -class ShareLine(models.Model): - _name = 'share.line' - _description = "Share line" - - @api.multi - def _compute_total_line(self): - res = {} - for line in self: - line.total_amount_line = line.share_unit_price * line.share_number - return res - - share_product_id = fields.Many2one('product.product', - string='Share type', - required=True, - readonly=True) - share_number = fields.Integer(string='Number of Share', - required=True, - readonly=True) - share_short_name = fields.Char(related='share_product_id.short_name', - string='Share type name', - readonly=True) - share_unit_price = fields.Monetary( - string='Share price', - currency_field="company_currency_id", - readonly=True, - ) - effective_date = fields.Date(string='Effective Date', - readonly=True) - partner_id = fields.Many2one('res.partner', - string='Cooperator', - required=True, - ondelete='cascade', - readonly=True) - total_amount_line = fields.Monetary( - string='Total amount line', - currency_field="company_currency_id", - compute='_compute_total_line', - ) - company_id = fields.Many2one( - "res.company", - string='Company', - required=True, - change_default=True, readonly=True, - default=lambda self: self.env['res.company']._company_default_get(), - ) - company_currency_id = fields.Many2one( - "res.currency", - string="Company Currency", - related="company_id.currency_id", - readonly=True, - ) - - -# todo move to subscription_register.py -class SubscriptionRegister(models.Model): - _name = 'subscription.register' - _description = "Subscription register" - - @api.multi - def _compute_total_line(self): - for line in self: - line.total_amount_line = line.share_unit_price * line.quantity - - name = fields.Char(string='Number Operation', - required=True, - readonly=True) - register_number_operation = fields.Integer(string='Register Number Operation', - required=True, - readonly=True) - partner_id = fields.Many2one('res.partner', - string='Cooperator', - required=True, - readonly=True) - partner_id_to = fields.Many2one('res.partner', - string='Transfered to', - readonly=True) - date = fields.Date(string='Subscription Date', - required=True, - readonly=True) - quantity = fields.Integer(string='Number of share', - readonly=True) - share_unit_price = fields.Monetary( - string='Share price', - currency_field="company_currency_id", - readonly=True, - ) - total_amount_line = fields.Monetary( - string='Total amount line', - currency_field="company_currency_id", - compute='_compute_total_line', - ) - share_product_id = fields.Many2one('product.product', - string='Share type', - required=True, - readonly=True, - domain=[('is_share', '=', True)]) - share_short_name = fields.Char(related='share_product_id.short_name', - string='Share type name', - readonly=True) - share_to_product_id = fields.Many2one('product.product', - string='Share to type', - readonly=True, - domain=[('is_share', '=', True)]) - share_to_short_name = fields.Char(related='share_to_product_id.short_name', - string='Share to type name', - readonly=True) - quantity_to = fields.Integer(string='Number of share to', - readonly=True) - share_to_unit_price = fields.Monetary( - string='Share to price', - currency_field="company_currency_id", - readonly=True, - ) - type = fields.Selection([('subscription', 'Subscription'), - ('transfer', 'Transfer'), - ('sell_back', 'Sell Back'), - ('convert', 'Conversion')], - string='Operation Type', readonly=True) - company_id = fields.Many2one('res.company', string='Company', - required=True, - change_default=True, readonly=True, - default=lambda self: self.env['res.company']._company_default_get()) - company_currency_id = fields.Many2one( - "res.currency", - related="company_id.currency_id", - string="Company Currency", - readonly=True, - ) - user_id = fields.Many2one('res.users', - string='Responsible', - readonly=True, - default=lambda self: self.env.user) - - _order = "register_number_operation asc" - - @api.model - def read_group(self, domain, fields, groupby, offset=0, limit=None, - orderby=False, - lazy=True): - if 'share_unit_price' in fields: - fields.remove('share_unit_price') - if 'register_number_operation' in fields: - fields.remove('register_number_operation') - res = super(SubscriptionRegister, self).read_group(domain, fields, - groupby, - offset=offset, - limit=limit, - orderby=orderby, - lazy=lazy) - if 'total_amount_line' in fields: - for line in res: - if '__domain' in line: - lines = self.search(line['__domain']) - inv_value = 0.0 - for line2 in lines: - inv_value += line2.total_amount_line - line['total_amount_line'] = inv_value - return res +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from datetime import datetime + +from addons.base_iban.models.res_partner_bank import validate_iban + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError + +_REQUIRED = [ + "email", + "firstname", + "lastname", + "birthdate", + "address", + "share_product_id", + "ordered_parts", + "zip_code", + "city", + "iban", + "gender", +] + + +@api.model +def _lang_get(self): + languages = self.env["res.lang"].search([]) + return [(language.code, language.name) for language in languages] + + +# todo move to subscription_request.py +class SubscriptionRequest(models.Model): + _name = "subscription.request" + _description = "Subscription Request" + + def get_required_field(self): + required_fields = _REQUIRED + company = self.env["res.company"]._company_default_get() + if company.data_policy_approval_required: + required_fields.append("data_policy_approved") + if company.internal_rules_approval_required: + required_fields.append("internal_rules_approved") + return required_fields + + def get_mail_template_notif(self, is_company=False): + if is_company: + mail_template = "easy_my_coop.email_template_confirmation_company" + else: + mail_template = "easy_my_coop.email_template_confirmation" + return self.env.ref(mail_template, False) + + def is_member(self, vals, cooperator): + if cooperator.member: + vals["type"] = "increase" + vals["already_cooperator"] = True + return vals + + @api.model + def create(self, vals): + partner_obj = self.env["res.partner"] + + if not vals.get("partner_id"): + cooperator = False + if vals.get("email"): + cooperator = partner_obj.get_cooperator_from_email( + vals.get("email") + ) + if cooperator: + # TODO remove the following line once it has + # been found a way to avoid double encoding + cooperator = cooperator[0] + vals["type"] = "subscription" + vals = self.is_member(vals, cooperator) + vals["partner_id"] = cooperator.id + else: + cooperator_id = vals.get("partner_id") + cooperator = partner_obj.browse(cooperator_id) + vals = self.is_member(vals, cooperator) + + if not cooperator.cooperator: + cooperator.write({"cooperator": True}) + subscr_request = super(SubscriptionRequest, self).create(vals) + + mail_template_notif = subscr_request.get_mail_template_notif(False) + mail_template_notif.send_mail(subscr_request.id) + + return subscr_request + + @api.model + def create_comp_sub_req(self, vals): + vals["name"] = vals["company_name"] + if not vals.get("partner_id"): + cooperator = self.env["res.partner"].get_cooperator_from_crn( + vals.get("company_register_number") + ) + if cooperator: + vals["partner_id"] = cooperator.id + vals["type"] = "increase" + vals["already_cooperator"] = True + subscr_request = super(SubscriptionRequest, self).create(vals) + + confirmation_mail_template = subscr_request.get_mail_template_notif( + True + ) + confirmation_mail_template.send_mail(subscr_request.id) + + return subscr_request + + def check_empty_string(self, value): + if value is None or value is False or value == "": + return False + return True + + def check_iban(self, iban): + try: + if iban: + validate_iban(iban) + return True + else: + return False + except ValidationError: + return False + + @api.multi + @api.depends("iban", "skip_control_ng") + def _validated_lines(self): + for sub_request in self: + validated = sub_request.skip_control_ng or self.check_iban( + sub_request.iban + ) + sub_request.validated = validated + + @api.multi + @api.depends( + "share_product_id", "share_product_id.list_price", "ordered_parts" + ) + def _compute_subscription_amount(self): + for sub_request in self: + sub_request.subscription_amount = ( + sub_request.share_product_id.list_price + * sub_request.ordered_parts + ) + + already_cooperator = fields.Boolean( + string="I'm already cooperator", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + name = fields.Char( + string="Name", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + firstname = fields.Char( + string="Firstname", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + lastname = fields.Char( + string="Lastname", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + birthdate = fields.Date( + string="Birthdate", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + gender = fields.Selection( + [("male", _("Male")), ("female", _("Female")), ("other", _("Other"))], + string="Gender", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + type = fields.Selection( + [ + ("new", "New Cooperator"), + ("subscription", "Subscription"), + ("increase", "Increase number of share"), + ], + string="Type", + default="new", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("block", "Blocked"), + ("done", "Done"), + ("waiting", "Waiting"), + ("transfer", "Transfer"), + ("cancelled", "Cancelled"), + ("paid", "paid"), + ], + string="State", + required=True, + default="draft", + ) + email = fields.Char( + string="Email", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + iban = fields.Char( + string="Account Number", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + partner_id = fields.Many2one( + "res.partner", + string="Cooperator", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + share_product_id = fields.Many2one( + "product.product", + string="Share type", + domain=[("is_share", "=", True)], + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + share_short_name = fields.Char( + related="share_product_id.short_name", + string="Share type name", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + share_unit_price = fields.Float( + related="share_product_id.list_price", + string="Share price", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + subscription_amount = fields.Monetary( + compute="_compute_subscription_amount", + string="Subscription amount", + currency_field="company_currency_id", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + ordered_parts = fields.Integer( + string="Number of Share", + required=True, + readonly=True, + default=1, + states={"draft": [("readonly", False)]}, + ) + address = fields.Char( + string="Address", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + city = fields.Char( + string="City", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + zip_code = fields.Char( + string="Zip Code", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + country_id = fields.Many2one( + "res.country", + string="Country", + ondelete="restrict", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + phone = fields.Char( + string="Phone", readonly=True, states={"draft": [("readonly", False)]} + ) + user_id = fields.Many2one("res.users", string="Responsible", readonly=True) + # todo rename to valid_subscription_request + validated = fields.Boolean( + compute="_validated_lines", + string="Valid Subscription request?", + readonly=True, + ) + skip_control_ng = fields.Boolean( + string="Skip control", + help="if this field is checked then no" + " control will be done on the national" + " register number and on the iban bank" + " account. To be done in case of the id" + " card is from abroad or in case of" + " a passport", + ) + lang = fields.Selection( + _lang_get, + string="Language", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + default=lambda self: self.env["res.company"] + ._company_default_get() + .default_lang_id.code, + ) + date = fields.Date( + string="Subscription date request", + required=True, + readonly=True, + states={"draft": [("readonly", False)]}, + default=lambda self: datetime.strftime(datetime.now(), "%Y-%m-%d"), + ) + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + change_default=True, + readonly=True, + default=lambda self: self.env["res.company"]._company_default_get(), + ) + company_currency_id = fields.Many2one( + "res.currency", + related="company_id.currency_id", + string="Company Currency", + readonly=True, + ) + is_company = fields.Boolean( + string="Is a company", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + is_operation = fields.Boolean( + string="Is an operation", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + company_name = fields.Char( + string="Company name", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + company_email = fields.Char( + string="Company email", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + company_register_number = fields.Char( + string="Company register number", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + company_type = fields.Selection( + [("", "")], + string="Company type", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + same_address = fields.Boolean( + string="Same address", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + activities_address = fields.Char( + string="Activities address", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + activities_city = fields.Char( + string="Activities city", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + activities_zip_code = fields.Char( + string="Activities zip Code", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + activities_country_id = fields.Many2one( + "res.country", + string="Activities country", + ondelete="restrict", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + contact_person_function = fields.Char( + string="Function", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + operation_request_id = fields.Many2one( + "operation.request", + string="Operation Request", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + capital_release_request = fields.One2many( + "account.invoice", + "subscription_request", + string="Capital release request", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + capital_release_request_date = fields.Date( + string="Force the capital " "release request date", + help="Keep empty to use the " "current date", + copy=False, + readonly=True, + states={"draft": [("readonly", False)]}, + ) + source = fields.Selection( + [ + ("website", "Website"), + ("crm", "CRM"), + ("manual", "Manual"), + ("operation", "Operation"), + ], + string="Source", + default="website", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + data_policy_approved = fields.Boolean( + string="Data Policy Approved", default=False + ) + internal_rules_approved = fields.Boolean( + string="Approved Internal Rules", default=False + ) + _order = "id desc" + + def get_person_info(self, partner): + self.firstname = partner.firstname + self.name = partner.name + self.lastname = partner.lastname + self.email = partner.email + self.birthdate = partner.birthdate_date + self.gender = partner.gender + self.address = partner.street + self.city = partner.city + self.zip_code = partner.zip + self.country_id = partner.country_id + self.phone = partner.phone + self.lang = partner.lang + + @api.onchange("partner_id") + def onchange_partner(self): + partner = self.partner_id + if partner: + self.is_company = partner.is_company + self.already_cooperator = partner.member + if partner.bank_ids: + self.iban = partner.bank_ids[0].acc_number + if partner.member: + self.type = "increase" + if partner.is_company: + self.company_name = partner.name + self.company_email = partner.email + self.company_register_number = partner.company_register_number + representative = partner.get_representative() + self.get_person_info(representative) + self.contact_person_function = representative.function + else: + self.get_person_info(partner) + + # declare this function in order to be overriden + def get_eater_vals(self, partner, share_product_id): # noqa + return {} + + def _prepare_invoice_line(self, product, partner, qty): + self.ensure_one() + account = ( + product.property_account_income_id + or product.categ_id.property_account_income_categ_id + ) + if not account: + raise UserError( + _( + "Please define income account for this product:" + ' "%s" (id:%d) - or for its category: "%s".' + ) + % (product.name, product.id, product.categ_id.name) + ) + + fpos = partner.property_account_position_id + if fpos: + account = fpos.map_account(account) + + res = { + "name": product.name, + "account_id": account.id, + "price_unit": product.lst_price, + "quantity": qty, + "uom_id": product.uom_id.id, + "product_id": product.id or False, + } + return res + + def get_capital_release_mail_template(self): + template = "easy_my_coop.email_template_release_capital" + return self.env.ref(template, False) + + def send_capital_release_request(self, invoice): + email_template = self.get_capital_release_mail_template() + + # we send the email with the capital release request in attachment + # TODO remove sudo() and give necessary access right + email_template.sudo().send_mail(invoice.id, True) + invoice.sent = True + + def get_journal(self): + return self.env["account.journal"].search([("code", "=", "SUBJ")])[0] + + def get_accounting_account(self): + account_obj = self.env["account.account"] + if self.company_id.property_cooperator_account: + account = self.company_id.property_cooperator_account + else: + accounts = account_obj.search([("code", "=", "416000")]) + if accounts: + account = accounts[0] + else: + raise UserError( + _("You must set a cooperator account on you company.") + ) + return account + + def get_invoice_vals(self, partner): + return { + "partner_id": partner.id, + "journal_id": self.get_journal().id, + "account_id": self.get_accounting_account().id, + "type": "out_invoice", + "release_capital_request": True, + "subscription_request": self.id, + } + + def create_invoice(self, partner): + # creating invoice and invoice lines + invoice_vals = self.get_invoice_vals(partner) + if self.capital_release_request_date: + invoice_vals["date_invoice"] = self.capital_release_request_date + invoice = self.env["account.invoice"].create(invoice_vals) + vals = self._prepare_invoice_line( + self.share_product_id, partner, self.ordered_parts + ) + vals["invoice_id"] = invoice.id + self.env["account.invoice.line"].create(vals) + + # validate the capital release request + invoice.action_invoice_open() + + self.send_capital_release_request(invoice) + + return invoice + + def get_partner_company_vals(self): + partner_vals = { + "name": self.company_name, + "last_name": self.company_name, + "is_company": self.is_company, + "company_register_number": self.company_register_number, # noqa + "cooperator": True, + "street": self.address, + "zip": self.zip_code, + "city": self.city, + "email": self.company_email, + "out_inv_comm_type": "bba", + "customer": self.share_product_id.customer, + "country_id": self.country_id.id, + "lang": self.lang, + "data_policy_approved": self.data_policy_approved, + "internal_rules_approved": self.internal_rules_approved, + } + return partner_vals + + def get_partner_vals(self): + partner_vals = { + "name": self.name, + "firstname": self.firstname, + "lastname": self.lastname, + "street": self.address, + "zip": self.zip_code, + "email": self.email, + "gender": self.gender, + "cooperator": True, + "city": self.city, + "phone": self.phone, + "country_id": self.country_id.id, + "lang": self.lang, + "birthdate_date": self.birthdate, + "customer": self.share_product_id.customer, + "data_policy_approved": self.data_policy_approved, + "internal_rules_approved": self.internal_rules_approved, + } + return partner_vals + + def get_representative_vals(self): + contact_vals = { + "name": self.name, + "firstname": self.firstname, + "lastname": self.lastname, + "customer": False, + "is_company": False, + "cooperator": True, + "street": self.address, + "gender": self.gender, + "zip": self.zip_code, + "city": self.city, + "phone": self.phone, + "email": self.email, + "country_id": self.country_id.id, + "out_inv_comm_type": "bba", + "out_inv_comm_algorithm": "random", + "lang": self.lang, + "birthdate_date": self.birthdate, + "parent_id": self.partner_id.id, + "representative": True, + "function": self.contact_person_function, + "type": "representative", + "data_policy_approved": self.data_policy_approved, + "internal_rules_approved": self.internal_rules_approved, + } + return contact_vals + + def create_coop_partner(self): + partner_obj = self.env["res.partner"] + + if self.is_company: + partner_vals = self.get_partner_company_vals() + else: + partner_vals = self.get_partner_vals() + + partner = partner_obj.create(partner_vals) + if self.iban: + self.env["res.partner.bank"].create( + {"partner_id": partner.id, "acc_number": self.iban} + ) + return partner + + def set_membership(self): + # To be overridden + return True + + @api.multi + def validate_subscription_request(self): + self.ensure_one() + # todo rename to validate (careful with iwp dependencies) + partner_obj = self.env["res.partner"] + + if self.ordered_parts <= 0: + raise UserError(_("Number of share must be greater than 0.")) + if self.partner_id: + partner = self.partner_id + else: + partner = None + domain = [] + if self.already_cooperator: + raise UserError( + _( + "The checkbox already cooperator is" + " checked please select a cooperator." + ) + ) + elif self.is_company and self.company_register_number: + domain = [ + ( + "company_register_number", + "=", + self.company_register_number, + ) + ] # noqa + elif not self.is_company and self.email: + domain = [("email", "=", self.email)] + + if domain: + partner = partner_obj.search(domain) + + if not partner: + partner = self.create_coop_partner() + self.partner_id = partner + else: + partner = partner[0] + + partner.cooperator = True + + if self.is_company and not partner.has_representative(): + contact = False + if self.email: + domain = [("email", "=", self.email)] + contact = partner_obj.search(domain) + if contact: + contact.type = "representative" + if not contact: + contact_vals = self.get_representative_vals() + partner_obj.create(contact_vals) + else: + if len(contact) > 1: + raise UserError( + _( + "There is two different persons with the" + " same national register number. Please" + " proceed to a merge before to continue" + ) + ) + if contact.parent_id and contact.parent_id.id != partner.id: + raise UserError( + _( + "This contact person is already defined" + " for another company. Please select" + " another contact" + ) + ) + else: + contact.write( + {"parent_id": partner.id, "representative": True} + ) + + invoice = self.create_invoice(partner) + self.write({"state": "done"}) + self.set_membership() + + return invoice + + @api.multi + def block_subscription_request(self): + self.ensure_one() + self.write({"state": "block"}) + + @api.multi + def unblock_subscription_request(self): + self.ensure_one() + self.write({"state": "draft"}) + + @api.multi + def cancel_subscription_request(self): + self.ensure_one() + self.write({"state": "cancelled"}) + + @api.multi + def put_on_waiting_list(self): + self.ensure_one() + waiting_list_mail_template = self.env.ref( + "easy_my_coop.email_template_waiting_list", False + ) + waiting_list_mail_template.send_mail(self.id, True) + self.write({"state": "waiting"}) + + +# todo move to share_line.py +class ShareLine(models.Model): + _name = "share.line" + _description = "Share line" + + @api.multi + def _compute_total_line(self): + res = {} + for line in self: + line.total_amount_line = line.share_unit_price * line.share_number + return res + + share_product_id = fields.Many2one( + "product.product", string="Share type", required=True, readonly=True + ) + share_number = fields.Integer( + string="Number of Share", required=True, readonly=True + ) + share_short_name = fields.Char( + related="share_product_id.short_name", + string="Share type name", + readonly=True, + ) + share_unit_price = fields.Monetary( + string="Share price", + currency_field="company_currency_id", + readonly=True, + ) + effective_date = fields.Date(string="Effective Date", readonly=True) + partner_id = fields.Many2one( + "res.partner", + string="Cooperator", + required=True, + ondelete="cascade", + readonly=True, + ) + total_amount_line = fields.Monetary( + string="Total amount line", + currency_field="company_currency_id", + compute="_compute_total_line", + ) + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + change_default=True, + readonly=True, + default=lambda self: self.env["res.company"]._company_default_get(), + ) + company_currency_id = fields.Many2one( + "res.currency", + string="Company Currency", + related="company_id.currency_id", + readonly=True, + ) + + +# todo move to subscription_register.py +class SubscriptionRegister(models.Model): + _name = "subscription.register" + _description = "Subscription register" + + @api.multi + def _compute_total_line(self): + for line in self: + line.total_amount_line = line.share_unit_price * line.quantity + + name = fields.Char(string="Number Operation", required=True, readonly=True) + register_number_operation = fields.Integer( + string="Register Number Operation", required=True, readonly=True + ) + partner_id = fields.Many2one( + "res.partner", string="Cooperator", required=True, readonly=True + ) + partner_id_to = fields.Many2one( + "res.partner", string="Transfered to", readonly=True + ) + date = fields.Date( + string="Subscription Date", required=True, readonly=True + ) + quantity = fields.Integer(string="Number of share", readonly=True) + share_unit_price = fields.Monetary( + string="Share price", + currency_field="company_currency_id", + readonly=True, + ) + total_amount_line = fields.Monetary( + string="Total amount line", + currency_field="company_currency_id", + compute="_compute_total_line", + ) + share_product_id = fields.Many2one( + "product.product", + string="Share type", + required=True, + readonly=True, + domain=[("is_share", "=", True)], + ) + share_short_name = fields.Char( + related="share_product_id.short_name", + string="Share type name", + readonly=True, + ) + share_to_product_id = fields.Many2one( + "product.product", + string="Share to type", + readonly=True, + domain=[("is_share", "=", True)], + ) + share_to_short_name = fields.Char( + related="share_to_product_id.short_name", + string="Share to type name", + readonly=True, + ) + quantity_to = fields.Integer(string="Number of share to", readonly=True) + share_to_unit_price = fields.Monetary( + string="Share to price", + currency_field="company_currency_id", + readonly=True, + ) + type = fields.Selection( + [ + ("subscription", "Subscription"), + ("transfer", "Transfer"), + ("sell_back", "Sell Back"), + ("convert", "Conversion"), + ], + string="Operation Type", + readonly=True, + ) + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + change_default=True, + readonly=True, + default=lambda self: self.env["res.company"]._company_default_get(), + ) + company_currency_id = fields.Many2one( + "res.currency", + related="company_id.currency_id", + string="Company Currency", + readonly=True, + ) + user_id = fields.Many2one( + "res.users", + string="Responsible", + readonly=True, + default=lambda self: self.env.user, + ) + + _order = "register_number_operation asc" + + @api.model + def read_group( + self, + domain, + fields, + groupby, + offset=0, + limit=None, + orderby=False, + lazy=True, + ): + if "share_unit_price" in fields: + fields.remove("share_unit_price") + if "register_number_operation" in fields: + fields.remove("register_number_operation") + res = super(SubscriptionRegister, self).read_group( + domain, + fields, + groupby, + offset=offset, + limit=limit, + orderby=orderby, + lazy=lazy, + ) + if "total_amount_line" in fields: + for line in res: + if "__domain" in line: + lines = self.search(line["__domain"]) + inv_value = 0.0 + for line2 in lines: + inv_value += line2.total_amount_line + line["total_amount_line"] = inv_value + return res diff --git a/easy_my_coop/models/operation_request.py b/easy_my_coop/models/operation_request.py index b31dabe..730ef6e 100644 --- a/easy_my_coop/models/operation_request.py +++ b/easy_my_coop/models/operation_request.py @@ -1,335 +1,432 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from datetime import datetime - -from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError - - -class operation_request(models.Model): - _name = 'operation.request' - _description = "Operation request" - - def get_date_now(self): - # fixme odoo 12 uses date types - return datetime.strftime(datetime.now(), '%Y-%m-%d') - - @api.multi - @api.depends('share_product_id', 'share_product_id.list_price', 'quantity') - def _compute_subscription_amount(self): - for operation_request in self: - operation_request.subscription_amount = (operation_request. - share_product_id. - list_price * - operation_request. - quantity) - - request_date = fields.Date(string='Request date', - default=lambda self: self.get_date_now()) - partner_id = fields.Many2one('res.partner', - string='Cooperator', - domain=[('member', '=', True)], - required=True) - partner_id_to = fields.Many2one('res.partner', - string='Transfered to', - domain=[('cooperator', '=', True)]) - operation_type = fields.Selection([('subscription', 'Subscription'), - ('transfer', 'Transfer'), - ('sell_back', 'Sell Back'), - ('convert', 'Conversion')], - string='Operation Type', - required=True) - share_product_id = fields.Many2one('product.product', - string='Share type', - domain=[('is_share', '=', True)], - required=True) - share_to_product_id = fields.Many2one('product.product', - string='Convert to this share type', - domain=[('is_share', '=', True)]) - share_short_name = fields.Char(related='share_product_id.short_name', - string='Share type name') - share_to_short_name = fields.Char(related='share_to_product_id.short_name', - string='Share to type name') - share_unit_price = fields.Float(related='share_product_id.list_price', - string='Share price') - share_to_unit_price = fields.Float(related='share_to_product_id.list_price', - string='Share to price') - subscription_amount = fields.Float(compute='_compute_subscription_amount', - string='Operation amount') - quantity = fields.Integer(string='Number of share', - required=True) - state = fields.Selection([('draft', 'Draft'), - ('waiting', 'Waiting'), - ('approved', 'Approved'), - ('done', 'Done'), - ('cancelled', 'Cancelled'), - ('refused', 'Refused')], - string='State', - required=True, - default='draft') - user_id = fields.Many2one('res.users', - string='Responsible', - readonly=True, - default=lambda self: self.env.user) - subscription_request = fields.One2many('subscription.request', - 'operation_request_id', - string="Share Receiver Info", - help="In case on a transfer of" - " share. If the share receiver" - " isn't a effective member then a" - " subscription form should" - " be filled.") - receiver_not_member = fields.Boolean(string='Receiver is not a member') - company_id = fields.Many2one('res.company', - string='Company', - required=True, - change_default=True, - readonly=True, - default=lambda self: self.env['res.company']._company_default_get()) - - invoice = fields.Many2one('account.invoice', - string="Invoice") - - @api.multi - def approve_operation(self): - for rec in self: - rec.write({'state': 'approved'}) - - @api.multi - def refuse_operation(self): - for rec in self: - rec.write({'state': 'refused'}) - - @api.multi - def submit_operation(self): - for rec in self: - rec.validate() - rec.write({'state': 'waiting'}) - - @api.multi - def cancel_operation(self): - for rec in self: - rec.write({'state': 'cancelled'}) - - @api.multi - def reset_to_draft(self): - for rec in self: - rec.write({'state': 'draft'}) - - def get_total_share_dic(self, partner): - total_share_dic = {} - share_products = self.env['product.product'].search([('is_share', '=', True)]) - - for share_product in share_products: - total_share_dic[share_product.id] = 0 - - for line in partner.share_ids: - total_share_dic[line.share_product_id.id] += line.share_number - - return total_share_dic - - # This function doesn't handle the case of a cooperator can own - # different kinds of share type - def hand_share_over(self, partner, share_product_id, quantity): - if not partner.member: - raise ValidationError(_("This operation can't be executed if the" - " cooperator is not an effective member")) - - share_ind = len(partner.share_ids) - i = 1 - while quantity > 0: - line = self.partner_id.share_ids[share_ind-i] - if line.share_product_id.id == share_product_id.id: - if quantity > line.share_number: - quantity -= line.share_number - line.unlink() - else: - share_left = line.share_number - quantity - quantity = 0 - line.write({'share_number': share_left}) - i += 1 - # if the cooperator sold all his shares he's no more - # an effective member - remaning_share_dict = 0 - for share_quant in self.get_total_share_dic(partner).values(): - remaning_share_dict += share_quant - if remaning_share_dict == 0: - self.partner_id.write({'member': False, 'old_member': True}) - - def has_share_type(self): - for line in self.partner_id.share_ids: - if line.share_product_id.id == self.share_product_id.id: - return True - return False - - def validate(self): - if not self.has_share_type() and \ - self.operation_type in ['sell_back', 'transfer']: - raise ValidationError(_("The cooperator doesn't own this share" - " type. Please choose the appropriate" - " share type.")) - - if self.operation_type in ['sell_back', 'convert', 'transfer']: - total_share_dic = self.get_total_share_dic(self.partner_id) - - if self.quantity > total_share_dic[self.share_product_id.id]: - raise ValidationError(_("The cooperator can't hand over more" - " shares that he/she owns.")) - - if self.operation_type == 'convert': - if self.company_id.unmix_share_type: - if self.share_product_id.code == self.share_to_product_id.code: - raise ValidationError(_("You can't convert the share to" - " the same share type.")) - if self.subscription_amount != self.partner_id.total_value: - raise ValidationError(_("You must convert all the shares" - " to the selected type.")) - else: - if self.subscription_amount != self.partner_id.total_value: - raise ValidationError(_("Converting just part of the" - " shares is not yet implemented")) - elif self.operation_type == 'transfer': - if not self.receiver_not_member and self.company_id.unmix_share_type \ - and (self.partner_id_to.cooperator_type - and self.partner_id.cooperator_type != self.partner_id_to.cooperator_type): - raise ValidationError(_("This share type could not be" - " transfered to " + - self.partner_id_to.name)) - if self.partner_id_to.is_company \ - and not self.share_product_id.by_company: - raise ValidationError(_("This share can not be" - " subscribed by a company")) - if not self.partner_id_to.is_company \ - and not self.share_product_id.by_individual: - raise ValidationError(_("This share can not be" - " subscribed an individual")) - if self.receiver_not_member and self.subscription_request \ - and not self.subscription_request.validated: - raise ValidationError(_("The information of the receiver" - " are not correct. Please correct" - " the information before" - " submitting")) - - def get_share_trans_mail_template(self): - return self.env.ref('easy_my_coop.email_template_share_transfer', - False) - - def get_share_update_mail_template(self): - return self.env.ref('easy_my_coop.email_template_share_update', - False) - - def send_share_trans_mail(self, sub_register_line): # Unused argument is used in synergie project. Do not remove. - cert_email_template = self.get_share_trans_mail_template() - cert_email_template.send_mail(self.partner_id_to.id, False) - - def send_share_update_mail(self, sub_register_line): # Unused argument is used in synergie project. Do not remove. - cert_email_template = self.get_share_update_mail_template() - cert_email_template.send_mail(self.partner_id.id, False) - - def get_subscription_register_vals(self, effective_date): - return { - 'partner_id': self.partner_id.id, 'quantity': self.quantity, - 'share_product_id': self.share_product_id.id, - 'type': self.operation_type, - 'share_unit_price': self.share_unit_price, - 'date': effective_date, - } - - @api.multi - def execute_operation(self): - self.ensure_one() - - effective_date = self.get_date_now() - sub_request = self.env['subscription.request'] - - self.validate() - - if self.state != 'approved': - raise ValidationError(_("This operation must be approved" - " before to be executed")) - - values = self.get_subscription_register_vals(effective_date) - - if self.operation_type == 'sell_back': - self.hand_share_over(self.partner_id, self.share_product_id, - self.quantity) - elif self.operation_type == 'convert': - amount_to_convert = self.share_unit_price * self.quantity - convert_quant = int(amount_to_convert / self.share_to_product_id.list_price) - remainder = amount_to_convert % self.share_to_product_id.list_price - - if convert_quant > 0 and remainder == 0: - share_ids = self.partner_id.share_ids - line = share_ids[0] - if len(share_ids) > 1: - share_ids[1:len(share_ids)].unlink() - line.write({ - 'share_number': convert_quant, - 'share_product_id': self.share_to_product_id.id, - 'share_unit_price': self.share_to_unit_price, - 'share_short_name': self.share_to_short_name - }) - values['share_to_product_id'] = self.share_to_product_id.id - values['quantity_to'] = convert_quant - else: - raise ValidationError(_("Converting just part of the" - " shares is not yet implemented")) - elif self.operation_type == 'transfer': - sequence_id = self.env.ref('easy_my_coop.sequence_subscription', False) - partner_vals = {'member': True} - if self.receiver_not_member: - partner = self.subscription_request.create_coop_partner() - # get cooperator number - sub_reg_num = int(sequence_id.next_by_id()) - partner_vals.update(sub_request.get_eater_vals( - partner, - self.share_product_id)) - partner_vals['cooperator_register_number'] = sub_reg_num - partner.write(partner_vals) - self.partner_id_to = partner - else: - # means an old member or cooperator candidate - if not self.partner_id_to.member: - if self.partner_id_to.cooperator_register_number == 0: - sub_reg_num = int(sequence_id.next_by_id()) - partner_vals['cooperator_register_number'] = sub_reg_num - partner_vals.update(sub_request.get_eater_vals( - self.partner_id_to, - self.share_product_id)) - partner_vals['old_member'] = False - self.partner_id_to.write(partner_vals) - # remove the parts to the giver - self.hand_share_over(self.partner_id, - self.share_product_id, - self.quantity) - # give the share to the receiver - self.env['share.line'].create({ - 'share_number': self.quantity, - 'partner_id': self.partner_id_to.id, - 'share_product_id': self.share_product_id.id, - 'share_unit_price': self.share_unit_price, - 'effective_date': effective_date}) - values['partner_id_to'] = self.partner_id_to.id - else: - raise ValidationError(_("This operation is not yet" - " implemented.")) - - sequence_operation = self.env.ref('easy_my_coop.sequence_register_operation', False) #noqa - sub_reg_operation = sequence_operation.next_by_id() - - values['name'] = sub_reg_operation - values['register_number_operation'] = int(sub_reg_operation) - - self.write({'state': 'done'}) - - sub_register_line = self.env['subscription.register'].create(values) - - # send mail to the receiver - if self.operation_type == 'transfer': - self.send_share_trans_mail(sub_register_line) - - self.send_share_update_mail(sub_register_line) +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from datetime import datetime + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class OperationRequest(models.Model): + _name = "operation.request" + _description = "Operation request" + + def get_date_now(self): + # fixme odoo 12 uses date types + return datetime.strftime(datetime.now(), "%Y-%m-%d") + + @api.multi + @api.depends("share_product_id", "share_product_id.list_price", "quantity") + def _compute_subscription_amount(self): + for operation_request in self: + operation_request.subscription_amount = ( + operation_request.share_product_id.list_price + * operation_request.quantity + ) + + request_date = fields.Date( + string="Request date", default=lambda self: self.get_date_now() + ) + partner_id = fields.Many2one( + "res.partner", + string="Cooperator", + domain=[("member", "=", True)], + required=True, + ) + partner_id_to = fields.Many2one( + "res.partner", + string="Transfered to", + domain=[("cooperator", "=", True)], + ) + operation_type = fields.Selection( + [ + ("subscription", "Subscription"), + ("transfer", "Transfer"), + ("sell_back", "Sell Back"), + ("convert", "Conversion"), + ], + string="Operation Type", + required=True, + ) + share_product_id = fields.Many2one( + "product.product", + string="Share type", + domain=[("is_share", "=", True)], + required=True, + ) + share_to_product_id = fields.Many2one( + "product.product", + string="Convert to this share type", + domain=[("is_share", "=", True)], + ) + share_short_name = fields.Char( + related="share_product_id.short_name", string="Share type name" + ) + share_to_short_name = fields.Char( + related="share_to_product_id.short_name", string="Share to type name" + ) + share_unit_price = fields.Float( + related="share_product_id.list_price", string="Share price" + ) + share_to_unit_price = fields.Float( + related="share_to_product_id.list_price", string="Share to price" + ) + subscription_amount = fields.Float( + compute="_compute_subscription_amount", string="Operation amount" + ) + quantity = fields.Integer(string="Number of share", required=True) + state = fields.Selection( + [ + ("draft", "Draft"), + ("waiting", "Waiting"), + ("approved", "Approved"), + ("done", "Done"), + ("cancelled", "Cancelled"), + ("refused", "Refused"), + ], + string="State", + required=True, + default="draft", + ) + user_id = fields.Many2one( + "res.users", + string="Responsible", + readonly=True, + default=lambda self: self.env.user, + ) + subscription_request = fields.One2many( + "subscription.request", + "operation_request_id", + string="Share Receiver Info", + help="In case on a transfer of" + " share. If the share receiver" + " isn't a effective member then a" + " subscription form should" + " be filled.", + ) + receiver_not_member = fields.Boolean(string="Receiver is not a member") + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + change_default=True, + readonly=True, + default=lambda self: self.env["res.company"]._company_default_get(), + ) + + invoice = fields.Many2one("account.invoice", string="Invoice") + + @api.multi + def approve_operation(self): + for rec in self: + rec.write({"state": "approved"}) + + @api.multi + def refuse_operation(self): + for rec in self: + rec.write({"state": "refused"}) + + @api.multi + def submit_operation(self): + for rec in self: + rec.validate() + rec.write({"state": "waiting"}) + + @api.multi + def cancel_operation(self): + for rec in self: + rec.write({"state": "cancelled"}) + + @api.multi + def reset_to_draft(self): + for rec in self: + rec.write({"state": "draft"}) + + def get_total_share_dic(self, partner): + total_share_dic = {} + share_products = self.env["product.product"].search( + [("is_share", "=", True)] + ) + + for share_product in share_products: + total_share_dic[share_product.id] = 0 + + for line in partner.share_ids: + total_share_dic[line.share_product_id.id] += line.share_number + + return total_share_dic + + # This function doesn't handle the case of a cooperator can own + # different kinds of share type + def hand_share_over(self, partner, share_product_id, quantity): + if not partner.member: + raise ValidationError( + _( + "This operation can't be executed if the" + " cooperator is not an effective member" + ) + ) + + share_ind = len(partner.share_ids) + i = 1 + while quantity > 0: + line = self.partner_id.share_ids[share_ind - i] + if line.share_product_id.id == share_product_id.id: + if quantity > line.share_number: + quantity -= line.share_number + line.unlink() + else: + share_left = line.share_number - quantity + quantity = 0 + line.write({"share_number": share_left}) + i += 1 + # if the cooperator sold all his shares he's no more + # an effective member + remaning_share_dict = 0 + for share_quant in self.get_total_share_dic(partner).values(): + remaning_share_dict += share_quant + if remaning_share_dict == 0: + self.partner_id.write({"member": False, "old_member": True}) + + def has_share_type(self): + for line in self.partner_id.share_ids: + if line.share_product_id.id == self.share_product_id.id: + return True + return False + + def validate(self): + if not self.has_share_type() and self.operation_type in [ + "sell_back", + "transfer", + ]: + raise ValidationError( + _( + "The cooperator doesn't own this share" + " type. Please choose the appropriate" + " share type." + ) + ) + + if self.operation_type in ["sell_back", "convert", "transfer"]: + total_share_dic = self.get_total_share_dic(self.partner_id) + + if self.quantity > total_share_dic[self.share_product_id.id]: + raise ValidationError( + _( + "The cooperator can't hand over more" + " shares that he/she owns." + ) + ) + + if self.operation_type == "convert": + if self.company_id.unmix_share_type: + if self.share_product_id.code == self.share_to_product_id.code: + raise ValidationError( + _( + "You can't convert the share to" + " the same share type." + ) + ) + if self.subscription_amount != self.partner_id.total_value: + raise ValidationError( + _( + "You must convert all the shares" + " to the selected type." + ) + ) + else: + if self.subscription_amount != self.partner_id.total_value: + raise ValidationError( + _( + "Converting just part of the" + " shares is not yet implemented" + ) + ) + elif self.operation_type == "transfer": + if ( + not self.receiver_not_member + and self.company_id.unmix_share_type + and ( + self.partner_id_to.cooperator_type + and self.partner_id.cooperator_type + != self.partner_id_to.cooperator_type + ) + ): + raise ValidationError( + _( + "This share type could not be" + " transfered to " + self.partner_id_to.name + ) + ) + if ( + self.partner_id_to.is_company + and not self.share_product_id.by_company + ): + raise ValidationError( + _("This share can not be" " subscribed by a company") + ) + if ( + not self.partner_id_to.is_company + and not self.share_product_id.by_individual + ): + raise ValidationError( + _("This share can not be" " subscribed an individual") + ) + if ( + self.receiver_not_member + and self.subscription_request + and not self.subscription_request.validated + ): + raise ValidationError( + _( + "The information of the receiver" + " are not correct. Please correct" + " the information before" + " submitting" + ) + ) + + def get_share_trans_mail_template(self): + return self.env.ref( + "easy_my_coop.email_template_share_transfer", False + ) + + def get_share_update_mail_template(self): + return self.env.ref("easy_my_coop.email_template_share_update", False) + + def send_share_trans_mail( + self, sub_register_line + ): # Unused argument is used in synergie project. Do not remove. + cert_email_template = self.get_share_trans_mail_template() + cert_email_template.send_mail(self.partner_id_to.id, False) + + def send_share_update_mail( + self, sub_register_line + ): # Unused argument is used in synergie project. Do not remove. + cert_email_template = self.get_share_update_mail_template() + cert_email_template.send_mail(self.partner_id.id, False) + + def get_subscription_register_vals(self, effective_date): + return { + "partner_id": self.partner_id.id, + "quantity": self.quantity, + "share_product_id": self.share_product_id.id, + "type": self.operation_type, + "share_unit_price": self.share_unit_price, + "date": effective_date, + } + + @api.multi + def execute_operation(self): + self.ensure_one() + + effective_date = self.get_date_now() + sub_request = self.env["subscription.request"] + + self.validate() + + if self.state != "approved": + raise ValidationError( + _("This operation must be approved" " before to be executed") + ) + + values = self.get_subscription_register_vals(effective_date) + + if self.operation_type == "sell_back": + self.hand_share_over( + self.partner_id, self.share_product_id, self.quantity + ) + elif self.operation_type == "convert": + amount_to_convert = self.share_unit_price * self.quantity + convert_quant = int( + amount_to_convert / self.share_to_product_id.list_price + ) + remainder = amount_to_convert % self.share_to_product_id.list_price + + if convert_quant > 0 and remainder == 0: + share_ids = self.partner_id.share_ids + line = share_ids[0] + if len(share_ids) > 1: + share_ids[1 : len(share_ids)].unlink() + line.write( + { + "share_number": convert_quant, + "share_product_id": self.share_to_product_id.id, + "share_unit_price": self.share_to_unit_price, + "share_short_name": self.share_to_short_name, + } + ) + values["share_to_product_id"] = self.share_to_product_id.id + values["quantity_to"] = convert_quant + else: + raise ValidationError( + _( + "Converting just part of the" + " shares is not yet implemented" + ) + ) + elif self.operation_type == "transfer": + sequence_id = self.env.ref( + "easy_my_coop.sequence_subscription", False + ) + partner_vals = {"member": True} + if self.receiver_not_member: + partner = self.subscription_request.create_coop_partner() + # get cooperator number + sub_reg_num = int(sequence_id.next_by_id()) + partner_vals.update(sub_request.get_eater_vals( + partner, + self.share_product_id)) + partner_vals['cooperator_register_number'] = sub_reg_num + partner.write(partner_vals) + self.partner_id_to = partner + else: + # means an old member or cooperator candidate + if not self.partner_id_to.member: + if self.partner_id_to.cooperator_register_number == 0: + sub_reg_num = int(sequence_id.next_by_id()) + partner_vals['cooperator_register_number'] = sub_reg_num + partner_vals.update(sub_request.get_eater_vals( + self.partner_id_to, + self.share_product_id)) + partner_vals['old_member'] = False + self.partner_id_to.write(partner_vals) + # remove the parts to the giver + self.hand_share_over( + self.partner_id, self.share_product_id, self.quantity + ) + # give the share to the receiver + self.env["share.line"].create( + { + "share_number": self.quantity, + "partner_id": self.partner_id_to.id, + "share_product_id": self.share_product_id.id, + "share_unit_price": self.share_unit_price, + "effective_date": effective_date, + } + ) + values["partner_id_to"] = self.partner_id_to.id + else: + raise ValidationError( + _("This operation is not yet" " implemented.") + ) + + sequence_operation = self.env.ref( + "easy_my_coop.sequence_register_operation", False + ) # noqa + sub_reg_operation = sequence_operation.next_by_id() + + values["name"] = sub_reg_operation + values["register_number_operation"] = int(sub_reg_operation) + + self.write({"state": "done"}) + + sub_register_line = self.env["subscription.register"].create(values) + + # send mail to the receiver + if self.operation_type == "transfer": + self.send_share_trans_mail(sub_register_line) + + self.send_share_update_mail(sub_register_line) diff --git a/easy_my_coop/models/partner.py b/easy_my_coop/models/partner.py index f6d9afc..613b04c 100644 --- a/easy_my_coop/models/partner.py +++ b/easy_my_coop/models/partner.py @@ -7,7 +7,7 @@ from odoo import api, fields, models class ResPartner(models.Model): - _inherit = 'res.partner' + _inherit = "res.partner" @api.multi def _get_report_base_filename(self): @@ -15,11 +15,11 @@ class ResPartner(models.Model): if self.member: return "Cooperator Certificate - %s" % self.name else: - return 'unknown' + return "unknown" @api.multi def _invoice_total(self): - account_invoice_report = self.env['account.invoice.report'] + account_invoice_report = self.env["account.invoice.report"] if not self.ids: self.total_invoiced = 0.0 return True @@ -28,7 +28,9 @@ class ResPartner(models.Model): all_partner_ids = [] for partner in self: # price_total is in the company currency - all_partners_and_children[partner] = self.search([('id', 'child_of', partner.id)]).ids + all_partners_and_children[partner] = self.search( + [("id", "child_of", partner.id)] + ).ids all_partner_ids += all_partners_and_children[partner] # searching account.invoice.report via the orm is comparatively @@ -38,30 +40,39 @@ class ResPartner(models.Model): # the user's company access directly these elements # generate where clause to include multicompany rules - where_query = account_invoice_report._where_calc([ - ('partner_id', 'in', all_partner_ids), - ('state', 'not in', ['draft', 'cancel']), - ('company_id', '=', self.env.user.company_id.id), - ('type', 'in', ('out_invoice', 'out_refund')), - ('release_capital_request', '=', False), - ]) - account_invoice_report._apply_ir_rules(where_query, 'read') + where_query = account_invoice_report._where_calc( + [ + ("partner_id", "in", all_partner_ids), + ("state", "not in", ["draft", "cancel"]), + ("company_id", "=", self.env.user.company_id.id), + ("type", "in", ("out_invoice", "out_refund")), + ("release_capital_request", "=", False), + ] + ) + account_invoice_report._apply_ir_rules(where_query, "read") from_clause, where_clause, where_clause_params = where_query.get_sql() # price_total is in the company currency - query = """ + query = ( + """ SELECT SUM(price_total) as total, partner_id FROM account_invoice_report account_invoice_report WHERE %s GROUP BY partner_id - """ % where_clause + """ + % where_clause + ) self.env.cr.execute(query, where_clause_params) price_totals = self.env.cr.dictfetchall() for partner, child_ids in all_partners_and_children.items(): - partner.total_invoiced = sum(price['total'] for price in price_totals if price['partner_id'] in child_ids) + partner.total_invoiced = sum( + price["total"] + for price in price_totals + if price["partner_id"] in child_ids + ) @api.multi - @api.depends('share_ids') + @api.depends("share_ids") def _compute_effective_date(self): # TODO change it to compute it from the share register for partner in self: @@ -70,22 +81,20 @@ class ResPartner(models.Model): @api.multi def _get_share_type(self): - shares = ( - self.env['product.product'] - .search([('is_share', '=', True)]) - ) - share_types = [ - (share.default_code, share.short_name) for share in shares - ] - return [('', '')] + share_types + shares = self.env["product.product"].search([("is_share", "=", True)]) + share_types = [(s.default_code, s.short_name) for s in shares] + return [("", "")] + share_types @api.multi - @api.depends('share_ids', 'share_ids.share_product_id', - 'share_ids.share_product_id.default_code', - 'share_ids.share_number') + @api.depends( + "share_ids", + "share_ids.share_product_id", + "share_ids.share_product_id.default_code", + "share_ids.share_number", + ) def _compute_cooperator_type(self): for partner in self: - share_type = '' + share_type = "" for line in partner.share_ids: if line.share_number > 0: share_type = line.share_product_id.default_code @@ -93,7 +102,7 @@ class ResPartner(models.Model): partner.cooperator_type = share_type @api.multi - @api.depends('share_ids') + @api.depends("share_ids") def _compute_share_info(self): for partner in self: number_of_share = 0 @@ -104,62 +113,75 @@ class ResPartner(models.Model): partner.number_of_share = number_of_share partner.total_value = total_value - cooperator = fields.Boolean(string='Cooperator', - help="Check this box if this contact is a" - " cooperator (effective or not).") - member = fields.Boolean(string='Effective cooperator', - help="Check this box if this cooperator" - " is an effective member.") - coop_candidate = fields.Boolean(string="Cooperator candidate", - compute="_compute_coop_candidate", - store=True, - readonly=True) - old_member = fields.Boolean(string='Old cooperator', - help="Check this box if this cooperator is" - " no more an effective member.") + cooperator = fields.Boolean( + string="Cooperator", + help="Check this box if this contact is a" + " cooperator (effective or not).", + ) + member = fields.Boolean( + string="Effective cooperator", + help="Check this box if this cooperator" " is an effective member.", + ) + coop_candidate = fields.Boolean( + string="Cooperator candidate", + compute="_compute_coop_candidate", + store=True, + readonly=True, + ) + old_member = fields.Boolean( + string="Old cooperator", + help="Check this box if this cooperator is" + " no more an effective member.", + ) # todo use oca partner_contact_gender - gender = fields.Selection([('male', 'Male'), - ('female', 'Female'), - ('other', 'Other')], - string='Gender') - share_ids = fields.One2many('share.line', - 'partner_id', - string='Share Lines') - cooperator_register_number = fields.Integer(string='Cooperator Number') - number_of_share = fields.Integer(compute="_compute_share_info", - multi='share', - string='Number of share', - readonly=True) - total_value = fields.Float(compute="_compute_share_info", - multi='share', - string='Total value of shares', - readonly=True) - company_register_number = fields.Char(string='Company Register Number') - cooperator_type = fields.Selection(selection='_get_share_type', - compute=_compute_cooperator_type, - string='Cooperator Type', - store=True) - effective_date = fields.Date(sting="Effective Date", - compute=_compute_effective_date, - store=True) + gender = fields.Selection( + [("male", "Male"), ("female", "Female"), ("other", "Other")], + string="Gender", + ) + share_ids = fields.One2many( + "share.line", "partner_id", string="Share Lines" + ) + cooperator_register_number = fields.Integer(string="Cooperator Number") + number_of_share = fields.Integer( + compute="_compute_share_info", + multi="share", + string="Number of share", + readonly=True, + ) + total_value = fields.Float( + compute="_compute_share_info", + multi="share", + string="Total value of shares", + readonly=True, + ) + company_register_number = fields.Char(string="Company Register Number") + cooperator_type = fields.Selection( + selection="_get_share_type", + compute=_compute_cooperator_type, + string="Cooperator Type", + store=True, + ) + effective_date = fields.Date( + sting="Effective Date", compute=_compute_effective_date, store=True + ) representative = fields.Boolean(string="Legal Representative") - subscription_request_ids = fields.One2many('subscription.request', - 'partner_id', - string="Subscription request") - legal_form = fields.Selection([('', '')], - string="Legal form") + subscription_request_ids = fields.One2many( + "subscription.request", "partner_id", string="Subscription request" + ) + legal_form = fields.Selection([("", "")], string="Legal form") data_policy_approved = fields.Boolean(string="Approved Data Policy") internal_rules_approved = fields.Boolean(string="Approved Internal Rules") @api.multi - @api.depends('subscription_request_ids.state') + @api.depends("subscription_request_ids.state") def _compute_coop_candidate(self): for partner in self: if partner.member: is_candidate = False else: sub_requests = partner.subscription_request_ids.filtered( - lambda record: record.state == 'done') + lambda record: record.state == "done" + ) is_candidate = bool(sub_requests) partner.coop_candidate = is_candidate @@ -167,19 +189,24 @@ class ResPartner(models.Model): @api.multi def has_representative(self): self.ensure_one() - if self.child_ids.filtered('representative'): + if self.child_ids.filtered("representative"): return True return False @api.multi def get_representative(self): self.ensure_one() - return self.child_ids.filtered('representative') + return self.child_ids.filtered("representative") def get_cooperator_from_email(self, email): - return self.env['res.partner'].search([('cooperator', '=', True), - ('email', '=', email)]) + return self.env["res.partner"].search( + [("cooperator", "=", True), ("email", "=", email)] + ) def get_cooperator_from_crn(self, company_register_number): - return self.env['res.partner'].search([('cooperator', '=', True), - ('company_register_number', '=', company_register_number)]) + return self.env["res.partner"].search( + [ + ("cooperator", "=", True), + ("company_register_number", "=", company_register_number), + ] + ) diff --git a/easy_my_coop/models/product.py b/easy_my_coop/models/product.py index 0706a1d..af035e8 100644 --- a/easy_my_coop/models/product.py +++ b/easy_my_coop/models/product.py @@ -1,37 +1,41 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from odoo import api, fields, models - - -class ProductTemplate(models.Model): - _inherit = 'product.template' - - is_share = fields.Boolean(string="Is share?") - short_name = fields.Char(string="Short name") - display_on_website = fields.Boolean(string="Display on website") - default_share_product = fields.Boolean(string="Default share product") - minimum_quantity = fields.Integer(string="Minimum quantity", default=1) - force_min_qty = fields.Boolean(String="Force minimum quantity?") - by_company = fields.Boolean(string="Can be subscribed by companies?") - by_individual = fields.Boolean(string="Can be subscribed by individuals?") - customer = fields.Boolean(string="Become customer") - mail_template = fields.Many2one('mail.template', - string="Mail template") - - @api.multi - def get_web_share_products(self, is_company): - if is_company is True: - product_templates = self.env['product.template'].search([ - ('is_share', '=', True), - ('display_on_website', '=', True), - ('by_company', '=', True)]) - else: - product_templates = self.env['product.template'].search([ - ('is_share', '=', True), - ('display_on_website', '=', True), - ('by_individual', '=', True)]) - return product_templates +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from odoo import api, fields, models + + +class ProductTemplate(models.Model): + _inherit = "product.template" + + is_share = fields.Boolean(string="Is share?") + short_name = fields.Char(string="Short name") + display_on_website = fields.Boolean(string="Display on website") + default_share_product = fields.Boolean(string="Default share product") + minimum_quantity = fields.Integer(string="Minimum quantity", default=1) + force_min_qty = fields.Boolean(String="Force minimum quantity?") + by_company = fields.Boolean(string="Can be subscribed by companies?") + by_individual = fields.Boolean(string="Can be subscribed by individuals?") + customer = fields.Boolean(string="Become customer") + mail_template = fields.Many2one("mail.template", string="Mail template") + + @api.multi + def get_web_share_products(self, is_company): + if is_company is True: + product_templates = self.env["product.template"].search( + [ + ("is_share", "=", True), + ("display_on_website", "=", True), + ("by_company", "=", True), + ] + ) + else: + product_templates = self.env["product.template"].search( + [ + ("is_share", "=", True), + ("display_on_website", "=", True), + ("by_individual", "=", True), + ] + ) + return product_templates diff --git a/easy_my_coop/models/res_partner_bank.py b/easy_my_coop/models/res_partner_bank.py index 53e2bb5..6e845d3 100644 --- a/easy_my_coop/models/res_partner_bank.py +++ b/easy_my_coop/models/res_partner_bank.py @@ -1,15 +1,14 @@ -# -*- coding: utf-8 -*- -# Copyright 2019 Coop IT Easy SCRL fs -# Houssine Bakkali -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - - -from odoo import models - - -class ResPartnerBank(models.Model): - _inherit = 'res.partner.bank' - - _sql_constraints = [ - ('unique_number', 'Check(1=1)', 'Account Number must be unique!'), - ] +# Copyright 2019 Coop IT Easy SCRL fs +# Houssine Bakkali +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + + +from odoo import models + + +class ResPartnerBank(models.Model): + _inherit = "res.partner.bank" + + _sql_constraints = [ + ("unique_number", "Check(1=1)", "Account Number must be unique!") + ] diff --git a/easy_my_coop/report/account_invoice_report.py b/easy_my_coop/report/account_invoice_report.py index bd1fb90..3374ce0 100644 --- a/easy_my_coop/report/account_invoice_report.py +++ b/easy_my_coop/report/account_invoice_report.py @@ -1,13 +1,19 @@ -from odoo import fields, models - - -class AccountInvoiceReport(models.Model): - _inherit = "account.invoice.report" - - release_capital_request = fields.Boolean(string="Release capital request") - - def _select(self): - return super(AccountInvoiceReport, self)._select() + ", sub.release_capital_request as release_capital_request" - - def _sub_select(self): - return super(AccountInvoiceReport, self)._sub_select() + ", ai.release_capital_request as release_capital_request" +from odoo import fields, models + + +class AccountInvoiceReport(models.Model): + _inherit = "account.invoice.report" + + release_capital_request = fields.Boolean(string="Release capital request") + + def _select(self): + return ( + super(AccountInvoiceReport, self)._select() + + ", sub.release_capital_request as release_capital_request" + ) + + def _sub_select(self): + return ( + super(AccountInvoiceReport, self)._sub_select() + + ", ai.release_capital_request as release_capital_request" + ) diff --git a/easy_my_coop/wizard/account_invoice_refund.py b/easy_my_coop/wizard/account_invoice_refund.py index 097d764..f88ee42 100644 --- a/easy_my_coop/wizard/account_invoice_refund.py +++ b/easy_my_coop/wizard/account_invoice_refund.py @@ -6,14 +6,14 @@ class AccountInvoiceRefund(models.TransientModel): _inherit = "account.invoice.refund" @api.multi - def compute_refund(self, mode='refund'): + def compute_refund(self, mode="refund"): result = super(AccountInvoiceRefund, self).compute_refund(mode) context = dict(self._context or {}) - inv = self.env['account.invoice'].browse(context.get('active_ids')) + inv = self.env["account.invoice"].browse(context.get("active_ids")) if inv.release_capital_request: - domain = result['domain'] - t = ('release_capital_request', '=', True) + domain = result["domain"] + t = ("release_capital_request", "=", True) out = [t if e[0] == t[0] else e for e in domain] - result['domain'] = out + result["domain"] = out return result diff --git a/easy_my_coop/wizard/create_subscription_from_partner.py b/easy_my_coop/wizard/create_subscription_from_partner.py index ba418e3..def7896 100644 --- a/easy_my_coop/wizard/create_subscription_from_partner.py +++ b/easy_my_coop/wizard/create_subscription_from_partner.py @@ -1,36 +1,40 @@ -from odoo import api, fields, models, _ -import odoo.addons.decimal_precision as dp +from odoo import _, api, fields, models from odoo.exceptions import UserError +import odoo.addons.decimal_precision as dp + class PartnerCreateSubscription(models.TransientModel): _name = "partner.create.subscription" _description = "Create Subscription From Partner" @api.multi - @api.onchange('share_product') + @api.onchange("share_product") def on_change_share_type(self): self.share_qty = self.share_product.minimum_quantity @api.model def _default_product_id(self): - domain = [('is_share', '=', True), - ('default_share_product', '=', True)] - active_id = self.env.context.get('active_id') + domain = [ + ("is_share", "=", True), + ("default_share_product", "=", True), + ] + active_id = self.env.context.get("active_id") if active_id: - partner = self.env['res.partner'].browse(active_id) + partner = self.env["res.partner"].browse(active_id) if partner.is_company: - domain.append(('by_company', '=', True)) + domain.append(("by_company", "=", True)) else: - domain.append(('by_individual', '=', True)) + domain.append(("by_individual", "=", True)) - return self.env['product.product'].search(domain)[0] + return self.env["product.product"].search(domain)[0] def _get_representative(self): partner = self._get_partner() if partner.is_company: - return partner.search([('parent_id', '=', partner.id), - ('representative', '=', True)]) + return partner.search( + [("parent_id", "=", partner.id), ("representative", "=", True)] + ) return False @api.model @@ -49,8 +53,8 @@ class PartnerCreateSubscription(models.TransientModel): @api.model def _get_partner(self): - active_id = self.env.context.get('active_id') - return self.env['res.partner'].browse(active_id) + active_id = self.env.context.get("active_id") + return self.env["res.partner"].browse(active_id) @api.model def _get_is_company(self): @@ -75,124 +79,140 @@ class PartnerCreateSubscription(models.TransientModel): @api.model def _get_possible_share(self): - domain = [('is_share', '=', True)] + domain = [("is_share", "=", True)] partner = self._get_partner() if partner.is_company: - domain.append(('by_company', '=', True)) + domain.append(("by_company", "=", True)) else: - domain.append(('by_individual', '=', True)) + domain.append(("by_individual", "=", True)) return domain @api.multi - @api.depends('share_product', 'share_qty') + @api.depends("share_product", "share_qty") def _compute_subscription_amount(self): for sub_request in self: - sub_request.subscription_amount = (sub_request. - share_product.list_price * - sub_request.share_qty) - - is_company = fields.Boolean(String="Is company?", - default=_get_is_company) - cooperator = fields.Many2one('res.partner', - string="Cooperator", - default=_get_partner) - register_number = fields.Char(string="Register Company Number", - default=_get_register_number) - email = fields.Char(string="Email", - required=True, - default=_get_email) - bank_account = fields.Char(string="Bank account", - required=True, - default=_get_bank_account) - share_product = fields.Many2one('product.product', - string='Share Type', - domain=_get_possible_share, - default=_default_product_id, - required=True) - share_qty = fields.Integer(string="Share Quantity", - required=True) - share_unit_price = fields.Float(related='share_product.list_price', - string='Share price', - readonly=True) - subscription_amount = fields.Float(compute='_compute_subscription_amount', - string='Subscription amount', - digits=dp.get_precision('Account'), - readonly=True) - representative_name = fields.Char(string='Representative name', - default=_get_representative_name) - representative_email = fields.Char(string='Representative email', - default=_get_representative_email) + sub_request.subscription_amount = ( + sub_request.share_product.list_price * sub_request.share_qty + ) + + is_company = fields.Boolean(String="Is company?", default=_get_is_company) + cooperator = fields.Many2one( + "res.partner", string="Cooperator", default=_get_partner + ) + register_number = fields.Char( + string="Register Company Number", default=_get_register_number + ) + email = fields.Char(string="Email", required=True, default=_get_email) + bank_account = fields.Char( + string="Bank account", required=True, default=_get_bank_account + ) + share_product = fields.Many2one( + "product.product", + string="Share Type", + domain=_get_possible_share, + default=_default_product_id, + required=True, + ) + share_qty = fields.Integer(string="Share Quantity", required=True) + share_unit_price = fields.Float( + related="share_product.list_price", string="Share price", readonly=True + ) + subscription_amount = fields.Float( + compute="_compute_subscription_amount", + string="Subscription amount", + digits=dp.get_precision("Account"), + readonly=True, + ) + representative_name = fields.Char( + string="Representative name", default=_get_representative_name + ) + representative_email = fields.Char( + string="Representative email", default=_get_representative_email + ) @api.multi def create_subscription(self): - sub_req = self.env['subscription.request'] - partner_obj = self.env['res.partner'] + sub_req = self.env["subscription.request"] + partner_obj = self.env["res.partner"] cooperator = self.cooperator - vals = {'partner_id': cooperator.id, - 'share_product_id': self.share_product.id, - 'ordered_parts': self.share_qty, - 'cooperator': True, - 'user_id': self.env.uid, - 'email': self.email, - 'source': 'crm', - 'address': self.cooperator.street, - 'zip_code': self.cooperator.zip, - 'city': self.cooperator.city, - 'country_id': self.cooperator.country_id.id - } + vals = { + "partner_id": cooperator.id, + "share_product_id": self.share_product.id, + "ordered_parts": self.share_qty, + "cooperator": True, + "user_id": self.env.uid, + "email": self.email, + "source": "crm", + "address": self.cooperator.street, + "zip_code": self.cooperator.zip, + "city": self.cooperator.city, + "country_id": self.cooperator.country_id.id, + } if self.is_company: - vals['company_name'] = cooperator.name - vals['company_email'] = cooperator.email - vals['name'] = '/' - vals['company_register_number'] = self.register_number - vals['is_company'] = True + vals["company_name"] = cooperator.name + vals["company_email"] = cooperator.email + vals["name"] = "/" + vals["company_register_number"] = self.register_number + vals["is_company"] = True else: - vals['name'] = cooperator.name + vals["name"] = cooperator.name coop_vals = {} if not self._get_email(): - coop_vals['email'] = self.email + coop_vals["email"] = self.email if not self._get_register_number(): if self.is_company: - coop_vals['company_register_number'] = self.register_number + coop_vals["company_register_number"] = self.register_number if self.is_company and not self._get_representative(): representative = False if self.representative_email: representative = partner_obj.search( - [('email', '=', self.representative_email)]) + [("email", "=", self.representative_email)] + ) if representative: if len(representative) > 1: - raise UserError(_('There is two different persons with ' - 'the same national register number. ' - 'Please proceed to a merge before to ' - 'continue')) + raise UserError( + _( + "There is two different persons with " + "the same national register number. " + "Please proceed to a merge before to " + "continue" + ) + ) if representative.parent_id: - raise UserError(_("A person can't be representative of " - "two different companies.")) + raise UserError( + _( + "A person can't be representative of " + "two different companies." + ) + ) representative.parent_id = cooperator.id else: if self.representative_email: - represent_vals = {'name': self.representative_name, - 'cooperator': True, - 'email': self.representative_email, - 'parent_id': cooperator.id, - 'representative': True} + represent_vals = { + "name": self.representative_name, + "cooperator": True, + "email": self.representative_email, + "parent_id": cooperator.id, + "representative": True, + } partner_obj.create(represent_vals) if not self._get_bank_account(): - partner_bank = self.env['res.partner.bank'] - partner_bank.create({'partner_id': cooperator.id, - 'acc_number': self.bank_account}) - vals['iban'] = self.bank_account + partner_bank = self.env["res.partner.bank"] + partner_bank.create( + {"partner_id": cooperator.id, "acc_number": self.bank_account} + ) + vals["iban"] = self.bank_account if self.is_company: representative = self._get_representative() - vals['name'] = representative.name + vals["name"] = representative.name if coop_vals: cooperator.write(coop_vals) @@ -200,10 +220,10 @@ class PartnerCreateSubscription(models.TransientModel): new_sub_req = sub_req.create(vals) return { - 'type': 'ir.actions.act_window', - 'view_type': 'form, tree', - 'view_mode': 'form', - 'res_model': 'subscription.request', - 'res_id': new_sub_req.id, - 'target': 'current', + "type": "ir.actions.act_window", + "view_type": "form, tree", + "view_mode": "form", + "res_model": "subscription.request", + "res_id": new_sub_req.id, + "target": "current", } diff --git a/easy_my_coop/wizard/update_partner_info.py b/easy_my_coop/wizard/update_partner_info.py index d35920a..09452ae 100644 --- a/easy_my_coop/wizard/update_partner_info.py +++ b/easy_my_coop/wizard/update_partner_info.py @@ -7,8 +7,8 @@ class PartnerUpdateInfo(models.TransientModel): @api.model def _get_partner(self): - active_id = self.env.context.get('active_id') - return self.env['res.partner'].browse(active_id) + active_id = self.env.context.get("active_id") + return self.env["res.partner"].browse(active_id) @api.model def _get_register_number(self): @@ -20,13 +20,13 @@ class PartnerUpdateInfo(models.TransientModel): def _get_is_company(self): return self._get_partner().is_company - is_company = fields.Boolean(string="Is company", - default=_get_is_company) - register_number = fields.Char(string="Register Company Number", - default=_get_register_number) - cooperator = fields.Many2one('res.partner', - string="Cooperator", - default=_get_partner) + is_company = fields.Boolean(string="Is company", default=_get_is_company) + register_number = fields.Char( + string="Register Company Number", default=_get_register_number + ) + cooperator = fields.Many2one( + "res.partner", string="Cooperator", default=_get_partner + ) all = fields.Boolean(string="Update from subscription request") birthdate = fields.Boolean(string="Set missing birth date") legal_form = fields.Boolean(string="Set legal form") @@ -34,41 +34,50 @@ class PartnerUpdateInfo(models.TransientModel): @api.multi def update(self): - partner_obj = self.env['res.partner'] + partner_obj = self.env["res.partner"] cooperator = self.cooperator coop_vals = {} if self.all: if self.legal_form or self.representative_function: - coops = partner_obj.search([('cooperator', '=', True), - ('is_company', '=', True)]) + coops = partner_obj.search( + [("cooperator", "=", True), ("is_company", "=", True)] + ) for coop in coops: coop_vals = {} - sub_reqs = coop.subscription_request_ids.filtered(lambda r: r.state in ['done', 'paid']) + sub_reqs = coop.subscription_request_ids.filtered( + lambda r: r.state in ["done", "paid"] + ) if sub_reqs: sub_req = sub_reqs[0] if self.legal_form: - coop_vals['legal_form'] = sub_req.company_type + coop_vals["legal_form"] = sub_req.company_type coop.write(coop_vals) if self.representative_function: contact = coop.get_representative() contact.function = sub_req.contact_person_function else: - coops = partner_obj.search([('cooperator', '=', True), - ('birthdate_date', '=', False), - ('is_company', '=', False)]) + coops = partner_obj.search( + [ + ("cooperator", "=", True), + ("birthdate_date", "=", False), + ("is_company", "=", False), + ] + ) for coop in coops: coop_vals = {} - sub_reqs = coop.subscription_request_ids.filtered(lambda r: r.state in ['done', 'paid']) + sub_reqs = coop.subscription_request_ids.filtered( + lambda r: r.state in ["done", "paid"] + ) if sub_reqs: sub_req = sub_reqs[0] if self.birthdate: - coop_vals['birthdate_date'] = sub_req.birthdate + coop_vals["birthdate_date"] = sub_req.birthdate coop.write(coop_vals) else: if cooperator: if cooperator.is_company: - coop_vals['company_register_number'] = self.register_number + coop_vals["company_register_number"] = self.register_number if coop_vals: cooperator.write(coop_vals) diff --git a/easy_my_coop/wizard/update_share_line.py b/easy_my_coop/wizard/update_share_line.py index f48ec58..8aa7604 100644 --- a/easy_my_coop/wizard/update_share_line.py +++ b/easy_my_coop/wizard/update_share_line.py @@ -1,4 +1,4 @@ -from odoo import api, fields, models, _ +from odoo import _, api, fields, models from odoo.exceptions import UserError @@ -8,8 +8,8 @@ class ShareLineUpdateInfo(models.TransientModel): @api.model def _get_share_line(self): - active_id = self.env.context.get('active_id') - return self.env['share.line'].browse(active_id) + active_id = self.env.context.get("active_id") + return self.env["share.line"].browse(active_id) @api.model def _get_effective_date(self): @@ -17,14 +17,15 @@ class ShareLineUpdateInfo(models.TransientModel): return share_line.effective_date - effective_date = fields.Date(string="effective date", - required=True, - default=_get_effective_date) - cooperator = fields.Many2one(related='share_line.partner_id', - string="Cooperator") - share_line = fields.Many2one('share.line', - string="Share line", - default=_get_share_line) + effective_date = fields.Date( + string="effective date", required=True, default=_get_effective_date + ) + cooperator = fields.Many2one( + related="share_line.partner_id", string="Cooperator" + ) + share_line = fields.Many2one( + "share.line", string="Share line", default=_get_share_line + ) @api.multi def update(self): @@ -32,15 +33,22 @@ class ShareLineUpdateInfo(models.TransientModel): line = self.share_line cooperator = line.partner_id - sub_reg = self.env['subscription.register'].search( - [('partner_id', '=', cooperator.id), - ('share_product_id', '=', line.share_product_id.id), - ('quantity', '=', line.share_number), - ('date', '=', line.effective_date)]) + sub_reg = self.env["subscription.register"].search( + [ + ("partner_id", "=", cooperator.id), + ("share_product_id", "=", line.share_product_id.id), + ("quantity", "=", line.share_number), + ("date", "=", line.effective_date), + ] + ) if sub_reg: if len(sub_reg) > 1: - raise UserError(_("Error the update return more than one" - " subscription register lines.")) + raise UserError( + _( + "Error the update return more than one" + " subscription register lines." + ) + ) else: line.effective_date = self.effective_date sub_reg.date = self.effective_date diff --git a/easy_my_coop/wizard/validate_subscription_request.py b/easy_my_coop/wizard/validate_subscription_request.py index 21131de..8193ca7 100644 --- a/easy_my_coop/wizard/validate_subscription_request.py +++ b/easy_my_coop/wizard/validate_subscription_request.py @@ -7,10 +7,12 @@ class ValidateSubscriptionRequest(models.TransientModel): @api.multi def validate(self): - selected_requests = self.env['subscription.request'].browse( - self._context.get('active_ids')) + selected_requests = self.env["subscription.request"].browse( + self._context.get("active_ids") + ) subscription_requests = selected_requests.filtered( - lambda record: record.state in ['draft', 'waiting']) + lambda record: record.state in ["draft", "waiting"] + ) for subscription_request in subscription_requests: subscription_request.validate_subscription_request() diff --git a/easy_my_coop_be/__manifest__.py b/easy_my_coop_be/__manifest__.py index 2a2087d..5f735ef 100644 --- a/easy_my_coop_be/__manifest__.py +++ b/easy_my_coop_be/__manifest__.py @@ -3,20 +3,15 @@ # - Houssine BAKKALI - # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).# { - "name": "Easy My Coop Be", + "name": "Easy My Coop Belgium", + "summary": "Easy My Coop Belgium Localization", "version": "12.0.1.2.0", - "depends": ["easy_my_coop", - "l10n_be", - "l10n_be_invoice_bba", - ], - "author": "Houssine BAKKALI ", + "depends": ["easy_my_coop", "l10n_be", "l10n_be_invoice_bba"], + "author": "Coop IT Easy SCRLfs", "category": "Cooperative management", "website": "www.coopiteasy.be", "license": "AGPL-3", - "description": """ - This is the belgian localization for the easy my coop module. - """, - 'data': [], - 'installable': True, - 'application': False, + "data": [], + "installable": True, + "application": False, } diff --git a/easy_my_coop_be/models/coop.py b/easy_my_coop_be/models/coop.py index 5fd2782..f4237a4 100644 --- a/easy_my_coop_be/models/coop.py +++ b/easy_my_coop_be/models/coop.py @@ -1,27 +1,26 @@ -from odoo import fields, models - - -class SubscriptionRequest(models.Model): - _inherit = 'subscription.request' - - company_type = fields.Selection([('scrl', 'SCRL'), - ('asbl', 'ASBL'), - ('sprl', 'SPRL'), - ('sa', 'SA')]) - - def get_partner_company_vals(self): - vals = super(SubscriptionRequest, self).get_partner_company_vals() - vals['out_inv_comm_algorithm'] = 'random' - return vals - - def get_partner_vals(self): - vals = super(SubscriptionRequest, self).get_partner_vals() - vals['out_inv_comm_type'] = 'bba' - vals['out_inv_comm_algorithm'] = 'random' - return vals - - def get_representative_valst(self): - vals = super(SubscriptionRequest, self).get_representative_vals() - vals['out_inv_comm_type'] = 'bba' - vals['out_inv_comm_algorithm'] = 'random' - return vals +from odoo import fields, models + + +class SubscriptionRequest(models.Model): + _inherit = "subscription.request" + + company_type = fields.Selection( + [("scrl", "SCRL"), ("asbl", "ASBL"), ("sprl", "SPRL"), ("sa", "SA")] + ) + + def get_partner_company_vals(self): + vals = super(SubscriptionRequest, self).get_partner_company_vals() + vals["out_inv_comm_algorithm"] = "random" + return vals + + def get_partner_vals(self): + vals = super(SubscriptionRequest, self).get_partner_vals() + vals["out_inv_comm_type"] = "bba" + vals["out_inv_comm_algorithm"] = "random" + return vals + + def get_representative_valst(self): + vals = super(SubscriptionRequest, self).get_representative_vals() + vals["out_inv_comm_type"] = "bba" + vals["out_inv_comm_algorithm"] = "random" + return vals diff --git a/easy_my_coop_be/models/partner.py b/easy_my_coop_be/models/partner.py index d42a178..48e0992 100644 --- a/easy_my_coop_be/models/partner.py +++ b/easy_my_coop_be/models/partner.py @@ -1,10 +1,14 @@ -from odoo import fields, models - - -class ResPartner(models.Model): - _inherit = 'res.partner' - - legal_form = fields.Selection(selection_add=[('scrl', 'SCRL'), - ('asbl', 'ASBL'), - ('sprl', 'SPRL'), - ('sa', 'SA')]) +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + legal_form = fields.Selection( + selection_add=[ + ("scrl", "SCRL"), + ("asbl", "ASBL"), + ("sprl", "SPRL"), + ("sa", "SA"), + ] + ) diff --git a/easy_my_coop_ch/__manifest__.py b/easy_my_coop_ch/__manifest__.py index 0cb5f23..398e470 100644 --- a/easy_my_coop_ch/__manifest__.py +++ b/easy_my_coop_ch/__manifest__.py @@ -1,37 +1,19 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Copyright (C) 2013-2017 Open Architects Consulting SPRL. -# Copyright (C) 2018- Coop IT Easy SCRLfs. -# -# 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 . -# -############################################################################## +# Copyright 2013-2018 Open Architects Consulting SPRL. +# Copyright 2018 Coop IT Easy SCRLfs () +# - Houssine BAKKALI - +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - "name": "Easy My Coop CH", + "name": "Easy My Coop Switzerland", + "summary": "Easy My Coop Switzerland localization", "version": "12.0.1.0.2", - "depends": ["easy_my_coop", - "l10n_ch"], - "author": "Houssine BAKKALI ", + "license": "AGPL-3", + "depends": ["easy_my_coop", "l10n_ch"], + "author": "Coop IT Easy SCRLfs", "category": "Cooperative management", - 'webstite': "www.coopiteasy.be", - "description": """ - This is the swiss localization for the easy my coop module - """, - 'data': [ - 'views/subscription_template.xml', - 'views/subscription_request_view.xml' + "webstite": "www.coopiteasy.be", + "data": [ + "views/subscription_template.xml", + "views/subscription_request_view.xml", ], - 'installable': True, + "installable": True, } diff --git a/easy_my_coop_ch/models/coop.py b/easy_my_coop_ch/models/coop.py index bdc9384..cb30d7a 100644 --- a/easy_my_coop_ch/models/coop.py +++ b/easy_my_coop_ch/models/coop.py @@ -1,22 +1,25 @@ -from odoo import fields, models - - -class SubscriptionRequest(models.Model): - _inherit = 'subscription.request' - - company_type = fields.Selection(selection_add=[ - ('ei', 'Individual company'), - ('snc', 'Partnership'), - ('sa', 'Limited company (SA)'), - ('sarl', 'Limited liability company (Ltd)'), #noqa - ('sc', 'Cooperative'), - ('asso', 'Association'), - ('fond', 'Foundation'), - ('edp', 'Company under public law')]) - - def get_required_field(self): - req_fields = super(SubscriptionRequest, self).get_required_field() - if 'iban' in req_fields: - req_fields.remove('iban') - - return req_fields +from odoo import fields, models + + +class SubscriptionRequest(models.Model): + _inherit = "subscription.request" + + company_type = fields.Selection( + selection_add=[ + ("ei", "Individual company"), + ("snc", "Partnership"), + ("sa", "Limited company (SA)"), + ("sarl", "Limited liability company (Ltd)"), # noqa + ("sc", "Cooperative"), + ("asso", "Association"), + ("fond", "Foundation"), + ("edp", "Company under public law"), + ] + ) + + def get_required_field(self): + req_fields = super(SubscriptionRequest, self).get_required_field() + if "iban" in req_fields: + req_fields.remove("iban") + + return req_fields diff --git a/easy_my_coop_ch/models/partner.py b/easy_my_coop_ch/models/partner.py index ec26713..6d67a5a 100644 --- a/easy_my_coop_ch/models/partner.py +++ b/easy_my_coop_ch/models/partner.py @@ -1,16 +1,18 @@ -from odoo import fields, models - - -class ResPartner(models.Model): - _inherit = 'res.partner' - - legal_form = fields.Selection(selection_add=[ - ('ei', 'Individual company'), - ('snc', 'Partnership'), - ('sa', 'Limited company (SA)'), - ('sarl', 'Limited liability company (Ltd)'), - ('sc', 'Cooperative'), - ('asso', 'Association'), - ('fond', 'Foundation'), - ('edp', 'Company under public law') - ]) +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + legal_form = fields.Selection( + selection_add=[ + ("ei", "Individual company"), + ("snc", "Partnership"), + ("sa", "Limited company (SA)"), + ("sarl", "Limited liability company (Ltd)"), + ("sc", "Cooperative"), + ("asso", "Association"), + ("fond", "Foundation"), + ("edp", "Company under public law"), + ] + ) diff --git a/easy_my_coop_ch/views/certificate_template.xml b/easy_my_coop_ch/views/certificate_template.xml deleted file mode 100644 index d2c72da..0000000 --- a/easy_my_coop_ch/views/certificate_template.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/easy_my_coop_dividend/__manifest__.py b/easy_my_coop_dividend/__manifest__.py index 76e72c0..6659e90 100644 --- a/easy_my_coop_dividend/__manifest__.py +++ b/easy_my_coop_dividend/__manifest__.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - # Copyright (C) 2013-2018 Open Architects Consulting SPRL. # Copyright (C) 2013-2018 Coop IT Easy SCRLfs. # @@ -20,29 +18,16 @@ { - 'name': 'Easy My Coop Dividend Engine', - - 'summary': """ - Manage the dividend calculation for a fiscal year. + "name": "Easy My Coop Dividend Engine", + "summary": """ + Manage the dividend computation for a fiscal year. """, - 'summary': """ - This module allows to calculate the dividend of the cooperative. - """, - - 'author': 'Houssine BAKKALI, ', - 'license': 'AGPL-3', - 'version': '9.0.1.0', - 'website': "www.coopiteasy.be", - - 'category': 'Cooperative Management', - - 'depends': [ - 'easy_my_coop', - ], - - 'data': [ - 'security/ir.model.access.csv', - 'views/dividend_views.xml', - ], - 'installable': False, + "author": "Houssine BAKKALI, ", + "license": "AGPL-3", + "version": "12.0.0.0.1", + "website": "www.coopiteasy.be", + "category": "Cooperative Management", + "depends": ["easy_my_coop"], + "data": ["security/ir.model.access.csv", "views/dividend_views.xml"], + "installable": False, } diff --git a/easy_my_coop_dividend/models/dividend.py b/easy_my_coop_dividend/models/dividend.py index 2682e48..d5a624b 100644 --- a/easy_my_coop_dividend/models/dividend.py +++ b/easy_my_coop_dividend/models/dividend.py @@ -1,190 +1,213 @@ -# -*- coding: utf-8 -*- - -from __future__ import division -from datetime import datetime -import openerp.addons.decimal_precision as dp - -from openerp import fields, models, api - - -class dividend_year(models.Model): - _name = 'dividend.year' - - @api.multi - def _compute_dividend_info(self): - res = {} - for dividend in self: - res[dividend.id] = {'grand_total_dividend': 0.0, - 'grand_total_taxes': 0.0} - for line in dividend.dividend_ids: - res[dividend.id]['grand_total_dividend'] += line.dividend_amount - res[dividend.id]['grand_total_taxes'] += line.dividend_taxes - return res - - name = fields.Char(string='Code') - date_from = fields.Date(string='Date from') - date_to = fields.Date(string='Date to') -# fiscal_year_id = fields.Many2one('account.fiscalyear', -# string='Fiscal year') - percentage = fields.Float(string='Percentage') - withholding_tax = fields.Float(string='Withholding tax') - detailed_dividend_ids = fields.One2many('detailed.dividend.line', - 'dividend_year_id', - string='Dividend lines') - dividend_ids = fields.One2many('dividend.line', - 'dividend_year_id', - string='Dividend lines') - grand_total_dividend = fields.Float( - compute=_compute_dividend_info, - string='Grand total dividend', - digits_compute=dp.get_precision('Account')) - grand_total_taxes = fields.Float( - compute=_compute_dividend_info, - string='Grand total taxes', - digits_compute=dp.get_precision('Account')) - - @api.multi - def compute_dividend(self): - self.ensure_one() - det_div_line_obj = self.env['detailed.dividend.line'] - div_line_obj = self.env['dividend.line'] - res_partner_obj = self.env['res.partner'] - - # delete lines if any - detailed_dividend_ids = det_div_line_obj.search([('dividend_year_id', '=', self.id)]) - detailed_dividend_ids.unlink() - dividend_ids = div_line_obj.search([('dividend_year_id', '=', self.id)]) - dividend_ids.unlink() - - partner_ids = res_partner_obj.search([ - ('cooperator', '=', True), - ('member', '=', True)], - order='cooperator_register_number') - number_of_days = (datetime.strptime(self.date_to, '%Y-%m-%d') - - datetime.strptime(self.date_from, '%Y-%m-%d') - ).days + 1 - - for partner in partner_ids: - total_amount_dividend = 0.0 - for line in partner.share_ids: - vals = {} - vals2 = {} - line_id = False - if line.effective_date >= self.date_from \ - and line.effective_date <= self.date_to: - date_res = (datetime.strptime(self.date_to, '%Y-%m-%d') - - datetime.strptime(line.effective_date, '%Y-%m-%d')).days - coeff = (date_res / number_of_days) * self.percentage - dividend_amount = line.total_amount_line * coeff - - vals['days'] = date_res - vals['dividend_year_id'] = self.id - vals['coop_number'] = line.partner_id.cooperator_register_number - vals['partner_id'] = partner.id - vals['share_line_id'] = line.id - vals['coeff'] = coeff - vals['dividend_amount'] = dividend_amount - total_amount_dividend += dividend_amount - - line_id = det_div_line_obj.create(vals) - elif line.effective_date < self.date_from: - dividend_amount = line.total_amount_line * self.percentage - vals['days'] = number_of_days - vals['dividend_year_id'] = self.id - vals['coop_number'] = line.partner_id.cooperator_register_number - vals['partner_id'] = partner.id - vals['share_line_id'] = line.id - vals['coeff'] = self.percentage - vals['dividend_amount'] = dividend_amount - total_amount_dividend += dividend_amount - - line_id = det_div_line_obj.create(vals) - if line_id: - vals2['coop_number'] = line.partner_id.cooperator_register_number - vals2['dividend_year_id'] = self.id - vals2['partner_id'] = line.partner_id.id - - vals2['dividend_amount_net'] = total_amount_dividend - vals2['dividend_amount'] = total_amount_dividend - - # TODO set as a parameter on dividend year object - if total_amount_dividend <= 190.00: - vals2['dividend_taxes'] = 0.0 - else: - div_tax = (total_amount_dividend - 190) * self.withholding_tax - vals2['dividend_taxes'] = div_tax - vals2['dividend_amount_net'] = total_amount_dividend - div_tax - - div_line_obj.create(vals2) - return True - - -class DetailedDividendLine(models.Model): - _name = 'detailed.dividend.line' - - @api.multi - def _compute_total_line(self): - res = {} - for line in self: - res[line.id] = line.share_unit_price * line.share_number - return res - - dividend_year_id = fields.Many2one('dividend.year', - string='Dividend year') - coop_number = fields.Integer(string='Cooperator Number') - days = fields.Integer(string='Days') - partner_id = fields.Many2one('res.partner', - string='Cooperator', - readonly=True) - share_line_id = fields.Many2one('share.line', - string='Share line', - readonly=True) - share_number = fields.Integer(related='share_line_id.share_number', - string='Number of Share') - share_unit_price = fields.Monetary( - string='Share unit price', - related='share_line_id.share_unit_price', - ) - effective_date = fields.Date(related='share_line_id.effective_date', - string='Effective date') - total_amount_line = fields.Monetary( - string="Total value of share", - currency_field="company_currency_id", - compute=_compute_total_line, - readonly=True, - ) - coeff = fields.Float(string='Coefficient to apply', - digits=(2, 4)) - dividend_amount = fields.Float(string='Gross Dividend') - dividend_amount_net = fields.Float(string='Dividend net') - dividend_taxes = fields.Float(string='Taxes') - company_currency_id = fields.Many2one( - related="share_line_id.company_currency_id", - readonly=True, - ) - - -class dividend_line(models.Model): - _name = 'dividend.line' - - @api.multi - def _get_account_number(self): - res = {} - for line in self: - bank_accounts = self.env['res.partner.bank'].search( - [('partner_id', '=', line.partner_id.id)]) - res[line.id] = bank_accounts[0].acc_number - - return res - - coop_number = fields.Integer(string='Coop Number') - dividend_year_id = fields.Many2one('dividend.year', - string='Dividend year') - partner_id = fields.Many2one('res.partner', - string='Cooperator', - readonly=True) - account_number = fields.Char(compute=_get_account_number, - string='Account Number') - dividend_amount = fields.Float(string='Gross Dividend') - dividend_amount_net = fields.Float(string='Dividend net') - dividend_taxes = fields.Float(string='Taxes') +from __future__ import division + +from datetime import datetime + +import openerp.addons.decimal_precision as dp +from openerp import api, fields, models + + +class DividendYear(models.Model): + _name = "dividend.year" + + @api.multi + def _compute_dividend_info(self): + res = {} + for dividend in self: + res[dividend.id] = { + "grand_total_dividend": 0.0, + "grand_total_taxes": 0.0, + } + for line in dividend.dividend_ids: + res[dividend.id][ + "grand_total_dividend" + ] += line.dividend_amount + res[dividend.id]["grand_total_taxes"] += line.dividend_taxes + return res + + name = fields.Char(string="Code") + date_from = fields.Date(string="Date from") + date_to = fields.Date(string="Date to") + # fiscal_year_id = fields.Many2one('account.fiscalyear', + # string='Fiscal year') + percentage = fields.Float(string="Percentage") + withholding_tax = fields.Float(string="Withholding tax") + detailed_dividend_ids = fields.One2many( + "detailed.dividend.line", "dividend_year_id", string="Dividend lines" + ) + dividend_ids = fields.One2many( + "dividend.line", "dividend_year_id", string="Dividend lines" + ) + grand_total_dividend = fields.Float( + compute=_compute_dividend_info, + string="Grand total dividend", + digits_compute=dp.get_precision("Account"), + ) + grand_total_taxes = fields.Float( + compute=_compute_dividend_info, + string="Grand total taxes", + digits_compute=dp.get_precision("Account"), + ) + + @api.multi + def compute_dividend(self): + self.ensure_one() + det_div_line_obj = self.env["detailed.dividend.line"] + div_line_obj = self.env["dividend.line"] + res_partner_obj = self.env["res.partner"] + + # delete lines if any + detailed_dividend_ids = det_div_line_obj.search( + [("dividend_year_id", "=", self.id)] + ) + detailed_dividend_ids.unlink() + dividend_ids = div_line_obj.search( + [("dividend_year_id", "=", self.id)] + ) + dividend_ids.unlink() + + partner_ids = res_partner_obj.search( + [("cooperator", "=", True), ("member", "=", True)], + order="cooperator_register_number", + ) + number_of_days = ( + datetime.strptime(self.date_to, "%Y-%m-%d") + - datetime.strptime(self.date_from, "%Y-%m-%d") + ).days + 1 + + for partner in partner_ids: + total_amount_dividend = 0.0 + for line in partner.share_ids: + vals = {} + vals2 = {} + line_id = False + if ( + line.effective_date >= self.date_from + and line.effective_date <= self.date_to + ): + date_res = ( + datetime.strptime(self.date_to, "%Y-%m-%d") + - datetime.strptime(line.effective_date, "%Y-%m-%d") + ).days + coeff = (date_res / number_of_days) * self.percentage + dividend_amount = line.total_amount_line * coeff + + vals["days"] = date_res + vals["dividend_year_id"] = self.id + vals[ + "coop_number" + ] = line.partner_id.cooperator_register_number + vals["partner_id"] = partner.id + vals["share_line_id"] = line.id + vals["coeff"] = coeff + vals["dividend_amount"] = dividend_amount + total_amount_dividend += dividend_amount + + line_id = det_div_line_obj.create(vals) + elif line.effective_date < self.date_from: + dividend_amount = line.total_amount_line * self.percentage + vals["days"] = number_of_days + vals["dividend_year_id"] = self.id + vals[ + "coop_number" + ] = line.partner_id.cooperator_register_number + vals["partner_id"] = partner.id + vals["share_line_id"] = line.id + vals["coeff"] = self.percentage + vals["dividend_amount"] = dividend_amount + total_amount_dividend += dividend_amount + + line_id = det_div_line_obj.create(vals) + if line_id: + vals2[ + "coop_number" + ] = line.partner_id.cooperator_register_number + vals2["dividend_year_id"] = self.id + vals2["partner_id"] = line.partner_id.id + + vals2["dividend_amount_net"] = total_amount_dividend + vals2["dividend_amount"] = total_amount_dividend + + # TODO set as a parameter on dividend year object + if total_amount_dividend <= 190.00: + vals2["dividend_taxes"] = 0.0 + else: + div_tax = ( + total_amount_dividend - 190 + ) * self.withholding_tax + vals2["dividend_taxes"] = div_tax + vals2["dividend_amount_net"] = ( + total_amount_dividend - div_tax + ) + + div_line_obj.create(vals2) + return True + + +class DetailedDividendLine(models.Model): + _name = "detailed.dividend.line" + + @api.multi + def _compute_total_line(self): + res = {} + for line in self: + res[line.id] = line.share_unit_price * line.share_number + return res + + dividend_year_id = fields.Many2one("dividend.year", string="Dividend year") + coop_number = fields.Integer(string="Cooperator Number") + days = fields.Integer(string="Days") + partner_id = fields.Many2one( + "res.partner", string="Cooperator", readonly=True + ) + share_line_id = fields.Many2one( + "share.line", string="Share line", readonly=True + ) + share_number = fields.Integer( + related="share_line_id.share_number", string="Number of Share" + ) + share_unit_price = fields.Monetary( + string="Share unit price", related="share_line_id.share_unit_price" + ) + effective_date = fields.Date( + related="share_line_id.effective_date", string="Effective date" + ) + total_amount_line = fields.Monetary( + string="Total value of share", + currency_field="company_currency_id", + compute=_compute_total_line, + readonly=True, + ) + coeff = fields.Float(string="Coefficient to apply", digits=(2, 4)) + dividend_amount = fields.Float(string="Gross Dividend") + dividend_amount_net = fields.Float(string="Dividend net") + dividend_taxes = fields.Float(string="Taxes") + company_currency_id = fields.Many2one( + related="share_line_id.company_currency_id", readonly=True + ) + + +class DividendLine(models.Model): + _name = "dividend.line" + + @api.multi + def _get_account_number(self): + res = {} + for line in self: + bank_accounts = self.env["res.partner.bank"].search( + [("partner_id", "=", line.partner_id.id)] + ) + res[line.id] = bank_accounts[0].acc_number + + return res + + coop_number = fields.Integer(string="Coop Number") + dividend_year_id = fields.Many2one("dividend.year", string="Dividend year") + partner_id = fields.Many2one( + "res.partner", string="Cooperator", readonly=True + ) + account_number = fields.Char( + compute=_get_account_number, string="Account Number" + ) + dividend_amount = fields.Float(string="Gross Dividend") + dividend_amount_net = fields.Float(string="Dividend net") + dividend_taxes = fields.Float(string="Taxes") diff --git a/easy_my_coop_export_xlsx/__manifest__.py b/easy_my_coop_export_xlsx/__manifest__.py index 119703f..e0845f5 100644 --- a/easy_my_coop_export_xlsx/__manifest__.py +++ b/easy_my_coop_export_xlsx/__manifest__.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - # Copyright (C) 2018- Coop IT Easy SCRLfs. # # This program is free software: you can redistribute it and/or modify @@ -19,27 +17,18 @@ { - 'name': 'Easy My Coop Export XLSX', - - 'summary': """ + "name": "Easy My Coop Export XLSX", + "summary": """ Generate a xlsx file with information on current state of subscription request, cooperators and capital release request. """, "author": "Coop IT Easy SCRLfs", - 'license': 'AGPL-3', - 'version': '9.0.1.0', - 'website': "www.coopiteasy.be", - - 'category': 'Cooperative Management', - - 'depends': [ - 'easy_my_coop', - ], - 'external_dependencies': { - 'python': ['xlsxwriter'], - }, - 'data': [ - 'wizard/export_global_wizard.xml', - ], - 'installable': False, + "license": "AGPL-3", + "version": "12.0.0.0.1", + "website": "www.coopiteasy.be", + "category": "Cooperative Management", + "depends": ["easy_my_coop"], + "external_dependencies": {"python": ["xlsxwriter"]}, + "data": ["wizard/export_global_wizard.xml"], + "installable": False, } diff --git a/easy_my_coop_export_xlsx/wizard/export_global_wizard.py b/easy_my_coop_export_xlsx/wizard/export_global_wizard.py index ed0d95f..22b490e 100644 --- a/easy_my_coop_export_xlsx/wizard/export_global_wizard.py +++ b/easy_my_coop_export_xlsx/wizard/export_global_wizard.py @@ -1,281 +1,322 @@ -# -*- encoding: utf-8 -*- - -from openerp import fields, models, api - -import time -from cStringIO import StringIO -import base64 - -import xlsxwriter - -HEADER = [ - 'Num. Coop', - 'Nom', - 'Email', - 'Banque', - 'Mobile', - 'Adresse', - 'Rue', - 'Code Postal', - 'Ville', - 'Pays', - 'Nombre de part total', - 'Montant total des parts', - 'Demande de liberation de capital', - 'Communication', - 'Nombre de part', - 'Montant', - 'Reception du paiement', - 'Date de la souscription' - ] -HEADER2 = [ - 'Date de la souscription', - 'Nom', - 'Type', - 'Nombre de part', - 'Montant', - 'Statut', - 'Email', - 'Mobile', - 'Adresse', - 'Code Postal', - 'Ville', - 'Pays', - ] - - -class export_global_report(models.TransientModel): - _name = 'export.global.report' - - name = fields.Char('Name') - - def write_header(self, worksheet, headers): - i = 0 - for header in headers: - worksheet.write(0, i, header) - i += 1 - return True - - @api.multi - def export_global_report_xlsx(self): - partner_obj = self.env['res.partner'] - invoice_obj = self.env['account.invoice'] - subscription_obj = self.env['subscription.request'] - - file_data = StringIO() - workbook = xlsxwriter.Workbook(file_data) - worksheet1 = workbook.add_worksheet() - - self.write_header(worksheet1, HEADER) - cooperators = partner_obj.search([('cooperator', '=', True), - ('member', '=', True)]) - - j = 1 - for coop in cooperators: - i = 0 - worksheet1.write(j, i, coop.cooperator_register_number) - i += 1 - worksheet1.write(j, i, coop.name) - i += 1 - worksheet1.write(j, i, coop.email) - i += 1 - acc_number = "" - if coop.bank_ids: - acc_number = coop.bank_ids[0].acc_number - worksheet1.write(j, i, acc_number) - i += 1 - worksheet1.write(j, i, coop.phone) - i += 1 - address = coop.street + ' ' + coop.zip + ' ' \ - + coop.city + ' ' + coop.country_id.name - worksheet1.write(j, i, address) - i += 1 - worksheet1.write(j, i, coop.street) - i += 1 - worksheet1.write(j, i, int(coop.zip)) - i += 1 - worksheet1.write(j, i, coop.city) - i += 1 - worksheet1.write(j, i, coop.country_id.name) - i += 1 - worksheet1.write(j, i, coop.number_of_share) - i += 1 - worksheet1.write(j, i, coop.total_value) - - invoice_ids = invoice_obj.search([('release_capital_request', '=', True), - ('partner_id', '=', coop.id)]) - j += 1 - for invoice in invoice_ids: - i = 11 - worksheet1.write(j, i, invoice.number) - i += 1 - worksheet1.write(j, i, invoice.state) - i += 1 - worksheet1.write(j, i, invoice.date_invoice) - i += 1 - worksheet1.write(j, i, invoice.reference) - i += 1 - for line in invoice.invoice_line_ids: - worksheet1.write(j, i, line.quantity) - i += 1 - worksheet1.write(j, i, line.price_subtotal) - i += 1 - if invoice.payment_ids: - worksheet1.write(j, i, invoice.payment_ids[0].payment_date) - i += 1 - if invoice.subscription_request: - ind = len(invoice.subscription_request)-1 - worksheet1.write(j, i, invoice.subscription_request[ind].date) - j += 1 - - sub_requests = subscription_obj.search([('state', 'in', - ['draft', 'waiting']), - ('partner_id', '=', coop.id) - ]) - for sub_request in sub_requests: - i = 11 - worksheet1.write(j, i, dict(subscription_obj._columns['type'].selection).get(sub_request.type,False)) - i += 1 - worksheet1.write(j, i, sub_request.state) - i += 3 - quantity = int(sub_request.ordered_parts) - worksheet1.write(j, i, quantity) - i += 1 - amount = quantity * sub_request.share_unit_price - worksheet1.write(j, i, amount) - i += 2 - worksheet1.write(j, i, sub_request.date) - j += 1 - - worksheet1bis = workbook.add_worksheet() - self.write_header(worksheet1bis, HEADER) - cooperators = partner_obj.search([('cooperator', '=', True), - ('member', '=', False)]) - - j = 1 - for coop in cooperators: - i = 0 - worksheet1bis.write(j, i, coop.cooperator_register_number) - i += 1 - worksheet1bis.write(j, i, coop.name) - i += 1 - worksheet1bis.write(j, i, coop.email) - i += 1 - worksheet1bis.write(j, i, coop.phone) - i += 1 - worksheet1bis.write(j, i, coop.street) - i += 1 - worksheet1bis.write(j, i, int(coop.zip)) - i += 1 - worksheet1bis.write(j, i, coop.city) - i += 1 - worksheet1bis.write(j, i, coop.country_id.name) - i += 1 - worksheet1bis.write(j, i, coop.number_of_share) - i += 1 - worksheet1bis.write(j, i, coop.total_value) - - invoice_ids = invoice_obj.search([('release_capital_request', '=', True), - ('partner_id', '=', coop.id)]) - j += 1 - for invoice in invoice_ids: - i = 11 - worksheet1bis.write(j, i, invoice.number) - i += 1 - worksheet1bis.write(j, i, invoice.state) - i += 1 - worksheet1bis.write(j, i, invoice.date_invoice) - i += 1 - worksheet1bis.write(j, i, invoice.reference) - i += 1 - for line in invoice.invoice_line_ids: - worksheet1bis.write(j, i, line.quantity) - i += 1 - worksheet1bis.write(j, i, line.price_subtotal) - i += 1 - if invoice.payment_ids: - worksheet1bis.write(j, i, invoice.payment_ids[0].date) - i += 1 - if invoice.subscription_request: - ind = len(invoice.subscription_request)-1 - worksheet1bis.write(j, i, invoice.subscription_request[ind].date) - j += 1 - - sub_requests = subscription_obj.search([('state', 'in', - ['draft', 'waiting']), - ('partner_id', '=', coop.id) - ]) - for sub_request in sub_requests: - i = 11 - worksheet1bis.write(j, i, dict(subscription_obj._columns['type'].selection).get(sub_request.type,False)) - i += 1 - worksheet1bis.write(j, i, sub_request.state) - i += 3 - quantity = int(sub_request.ordered_parts) - worksheet1bis.write(j, i, quantity) - i += 1 - amount = quantity * sub_request.share_unit_price - worksheet1bis.write(j, i, amount) - i += 2 - worksheet1bis.write(j, i, sub_request.date) - j += 1 - - worksheet2 = workbook.add_worksheet() - self.write_header(worksheet2, HEADER2) - sub_requests = subscription_obj.search([('state', 'in', - ['draft', 'waiting']), - ]) - - j = 1 - for sub_request in sub_requests: - i = 0 - worksheet2.write(j, i, sub_request.date) - i += 1 - worksheet2.write(j, i, sub_request.name) - i += 1 - sub_type_sel = subscription_obj._columns['type'].selection - worksheet2.write(j, i, dict(sub_type_sel).get(sub_request.type, False)) - i += 1 - quantity = int(sub_request.ordered_parts) - worksheet2.write(j, i, quantity) - i += 1 - amount = quantity * sub_request.share_unit_price - worksheet2.write(j, i, amount) - i += 1 - worksheet2.write(j, i, sub_request.state) - i += 1 - worksheet2.write(j, i, sub_request.email) - i += 1 - worksheet2.write(j, i, sub_request.phone) - i += 1 - worksheet2.write(j, i, sub_request.address) - i += 1 - worksheet2.write(j, i, sub_request.city) - i += 1 - worksheet2.write(j, i, int(sub_request.zip_code)) - i += 1 - worksheet2.write(j, i, sub_request.country_id.name) - j += 1 - - workbook.close() - file_data.seek(0) - - data = base64.encodestring(file_data.read()) - - attachment_id = self.env['ir.attachment'].create({ - 'name': "Global export" + time.strftime('%Y-%m-%d %H:%M') - + ".xlsx", - 'datas': data, - 'datas_fname': 'Global_export.xlsx', - 'res_model': 'export.global.report', - },) - - # Prepare your download URL - download_url = '/web/content/' + str(attachment_id.id) + '?download=True' - base_url = self.env['ir.config_parameter'].get_param('web.base.url') - - return { - "type": "ir.actions.act_url", - "url": str(base_url) + str(download_url), - "target": "new", - } +import base64 +import time + +import xlsxwriter +from cStringIO import StringIO +from openerp import api, fields, models + +HEADER = [ + "Num. Coop", + "Nom", + "Email", + "Banque", + "Mobile", + "Adresse", + "Rue", + "Code Postal", + "Ville", + "Pays", + "Nombre de part total", + "Montant total des parts", + "Demande de liberation de capital", + "Communication", + "Nombre de part", + "Montant", + "Reception du paiement", + "Date de la souscription", +] +HEADER2 = [ + "Date de la souscription", + "Nom", + "Type", + "Nombre de part", + "Montant", + "Statut", + "Email", + "Mobile", + "Adresse", + "Code Postal", + "Ville", + "Pays", +] + + +class ExportGlobalReport(models.TransientModel): + _name = "export.global.report" + + name = fields.Char("Name") + + def write_header(self, worksheet, headers): + i = 0 + for header in headers: + worksheet.write(0, i, header) + i += 1 + return True + + @api.multi + def export_global_report_xlsx(self): + partner_obj = self.env["res.partner"] + invoice_obj = self.env["account.invoice"] + subscription_obj = self.env["subscription.request"] + + file_data = StringIO() + workbook = xlsxwriter.Workbook(file_data) + worksheet1 = workbook.add_worksheet() + + self.write_header(worksheet1, HEADER) + cooperators = partner_obj.search( + [("cooperator", "=", True), ("member", "=", True)] + ) + + j = 1 + for coop in cooperators: + i = 0 + worksheet1.write(j, i, coop.cooperator_register_number) + i += 1 + worksheet1.write(j, i, coop.name) + i += 1 + worksheet1.write(j, i, coop.email) + i += 1 + acc_number = "" + if coop.bank_ids: + acc_number = coop.bank_ids[0].acc_number + worksheet1.write(j, i, acc_number) + i += 1 + worksheet1.write(j, i, coop.phone) + i += 1 + address = ( + coop.street + + " " + + coop.zip + + " " + + coop.city + + " " + + coop.country_id.name + ) + worksheet1.write(j, i, address) + i += 1 + worksheet1.write(j, i, coop.street) + i += 1 + worksheet1.write(j, i, int(coop.zip)) + i += 1 + worksheet1.write(j, i, coop.city) + i += 1 + worksheet1.write(j, i, coop.country_id.name) + i += 1 + worksheet1.write(j, i, coop.number_of_share) + i += 1 + worksheet1.write(j, i, coop.total_value) + + invoice_ids = invoice_obj.search( + [ + ("release_capital_request", "=", True), + ("partner_id", "=", coop.id), + ] + ) + j += 1 + for invoice in invoice_ids: + i = 11 + worksheet1.write(j, i, invoice.number) + i += 1 + worksheet1.write(j, i, invoice.state) + i += 1 + worksheet1.write(j, i, invoice.date_invoice) + i += 1 + worksheet1.write(j, i, invoice.reference) + i += 1 + for line in invoice.invoice_line_ids: + worksheet1.write(j, i, line.quantity) + i += 1 + worksheet1.write(j, i, line.price_subtotal) + i += 1 + if invoice.payment_ids: + worksheet1.write(j, i, invoice.payment_ids[0].payment_date) + i += 1 + if invoice.subscription_request: + ind = len(invoice.subscription_request) - 1 + worksheet1.write( + j, i, invoice.subscription_request[ind].date + ) + j += 1 + + sub_requests = subscription_obj.search( + [ + ("state", "in", ["draft", "waiting"]), + ("partner_id", "=", coop.id), + ] + ) + for sub_request in sub_requests: + i = 11 + worksheet1.write( + j, + i, + dict(subscription_obj._columns["type"].selection).get( + sub_request.type, False + ), + ) + i += 1 + worksheet1.write(j, i, sub_request.state) + i += 3 + quantity = int(sub_request.ordered_parts) + worksheet1.write(j, i, quantity) + i += 1 + amount = quantity * sub_request.share_unit_price + worksheet1.write(j, i, amount) + i += 2 + worksheet1.write(j, i, sub_request.date) + j += 1 + + worksheet1bis = workbook.add_worksheet() + self.write_header(worksheet1bis, HEADER) + cooperators = partner_obj.search( + [("cooperator", "=", True), ("member", "=", False)] + ) + + j = 1 + for coop in cooperators: + i = 0 + worksheet1bis.write(j, i, coop.cooperator_register_number) + i += 1 + worksheet1bis.write(j, i, coop.name) + i += 1 + worksheet1bis.write(j, i, coop.email) + i += 1 + worksheet1bis.write(j, i, coop.phone) + i += 1 + worksheet1bis.write(j, i, coop.street) + i += 1 + worksheet1bis.write(j, i, int(coop.zip)) + i += 1 + worksheet1bis.write(j, i, coop.city) + i += 1 + worksheet1bis.write(j, i, coop.country_id.name) + i += 1 + worksheet1bis.write(j, i, coop.number_of_share) + i += 1 + worksheet1bis.write(j, i, coop.total_value) + + invoice_ids = invoice_obj.search( + [ + ("release_capital_request", "=", True), + ("partner_id", "=", coop.id), + ] + ) + j += 1 + for invoice in invoice_ids: + i = 11 + worksheet1bis.write(j, i, invoice.number) + i += 1 + worksheet1bis.write(j, i, invoice.state) + i += 1 + worksheet1bis.write(j, i, invoice.date_invoice) + i += 1 + worksheet1bis.write(j, i, invoice.reference) + i += 1 + for line in invoice.invoice_line_ids: + worksheet1bis.write(j, i, line.quantity) + i += 1 + worksheet1bis.write(j, i, line.price_subtotal) + i += 1 + if invoice.payment_ids: + worksheet1bis.write(j, i, invoice.payment_ids[0].date) + i += 1 + if invoice.subscription_request: + ind = len(invoice.subscription_request) - 1 + worksheet1bis.write( + j, i, invoice.subscription_request[ind].date + ) + j += 1 + + sub_requests = subscription_obj.search( + [ + ("state", "in", ["draft", "waiting"]), + ("partner_id", "=", coop.id), + ] + ) + for sub_request in sub_requests: + i = 11 + worksheet1bis.write( + j, + i, + dict(subscription_obj._columns["type"].selection).get( + sub_request.type, False + ), + ) + i += 1 + worksheet1bis.write(j, i, sub_request.state) + i += 3 + quantity = int(sub_request.ordered_parts) + worksheet1bis.write(j, i, quantity) + i += 1 + amount = quantity * sub_request.share_unit_price + worksheet1bis.write(j, i, amount) + i += 2 + worksheet1bis.write(j, i, sub_request.date) + j += 1 + + worksheet2 = workbook.add_worksheet() + self.write_header(worksheet2, HEADER2) + sub_requests = subscription_obj.search( + [("state", "in", ["draft", "waiting"])] + ) + + j = 1 + for sub_request in sub_requests: + i = 0 + worksheet2.write(j, i, sub_request.date) + i += 1 + worksheet2.write(j, i, sub_request.name) + i += 1 + sub_type_sel = subscription_obj._columns["type"].selection + worksheet2.write( + j, i, dict(sub_type_sel).get(sub_request.type, False) + ) + i += 1 + quantity = int(sub_request.ordered_parts) + worksheet2.write(j, i, quantity) + i += 1 + amount = quantity * sub_request.share_unit_price + worksheet2.write(j, i, amount) + i += 1 + worksheet2.write(j, i, sub_request.state) + i += 1 + worksheet2.write(j, i, sub_request.email) + i += 1 + worksheet2.write(j, i, sub_request.phone) + i += 1 + worksheet2.write(j, i, sub_request.address) + i += 1 + worksheet2.write(j, i, sub_request.city) + i += 1 + worksheet2.write(j, i, int(sub_request.zip_code)) + i += 1 + worksheet2.write(j, i, sub_request.country_id.name) + j += 1 + + workbook.close() + file_data.seek(0) + + data = base64.encodestring(file_data.read()) + + attachment_id = self.env["ir.attachment"].create( + { + "name": "Global export" + + time.strftime("%Y-%m-%d %H:%M") + + ".xlsx", + "datas": data, + "datas_fname": "Global_export.xlsx", + "res_model": "export.global.report", + } + ) + + # Prepare your download URL + download_url = ( + "/web/content/" + str(attachment_id.id) + "?download=True" + ) + base_url = self.env["ir.config_parameter"].get_param("web.base.url") + + return { + "type": "ir.actions.act_url", + "url": str(base_url) + str(download_url), + "target": "new", + } diff --git a/easy_my_coop_fr/__manifest__.py b/easy_my_coop_fr/__manifest__.py index de6ca6a..b8d2b0f 100644 --- a/easy_my_coop_fr/__manifest__.py +++ b/easy_my_coop_fr/__manifest__.py @@ -5,18 +5,17 @@ { "name": "Easy My Coop Fr", "version": "12.0.1.0.1", - "depends": ["easy_my_coop", - "l10n_fr"], + "depends": ["easy_my_coop", "l10n_fr"], "author": "Houssine BAKKALI ", "category": "Cooperative management", - 'webstite': "www.coopiteasy.be", + "webstite": "www.coopiteasy.be", "license": "AGPL-3", - "description": """ - This is the french localization for the easy my coop module + "summary": """ + This is the french localization for the easy my coop module """, - 'data': [ - 'views/subscription_template.xml', - 'views/certificate_template.xml' + "data": [ + "views/subscription_template.xml", + "views/certificate_template.xml", ], - 'installable': True, + "installable": True, } diff --git a/easy_my_coop_fr/models/coop.py b/easy_my_coop_fr/models/coop.py index 99501fa..d5558ac 100644 --- a/easy_my_coop_fr/models/coop.py +++ b/easy_my_coop_fr/models/coop.py @@ -1,19 +1,21 @@ -from odoo import fields, models - - -class SubscriptionRequest(models.Model): - _inherit = 'subscription.request' - - company_type = fields.Selection(selection_add=[ - ('asso', 'Association'), - ('eurl', 'EURL / Entreprise individuelle'), - ('sarl', 'SARL'), - ('sa', 'SA / SAS') - ]) - - def get_required_field(self): - req_fields = super(SubscriptionRequest, self).get_required_field() - if 'iban' in req_fields: - req_fields.remove('iban') - - return req_fields +from odoo import fields, models + + +class SubscriptionRequest(models.Model): + _inherit = "subscription.request" + + company_type = fields.Selection( + selection_add=[ + ("asso", "Association"), + ("eurl", "EURL / Entreprise individuelle"), + ("sarl", "SARL"), + ("sa", "SA / SAS"), + ] + ) + + def get_required_field(self): + req_fields = super(SubscriptionRequest, self).get_required_field() + if "iban" in req_fields: + req_fields.remove("iban") + + return req_fields diff --git a/easy_my_coop_fr/models/partner.py b/easy_my_coop_fr/models/partner.py index 212ce38..682fe93 100644 --- a/easy_my_coop_fr/models/partner.py +++ b/easy_my_coop_fr/models/partner.py @@ -1,12 +1,14 @@ -from odoo import fields, models - - -class ResPartner(models.Model): - _inherit = 'res.partner' - - legal_form = fields.Selection(selection_add=[ - ('asso', 'Association'), - ('eurl', 'EURL / Entreprise individuelle'), - ('sarl', 'SARL'), - ('sa', 'SA / SAS') - ]) +from odoo import fields, models + + +class ResPartner(models.Model): + _inherit = "res.partner" + + legal_form = fields.Selection( + selection_add=[ + ("asso", "Association"), + ("eurl", "EURL / Entreprise individuelle"), + ("sarl", "SARL"), + ("sa", "SA / SAS"), + ] + ) diff --git a/easy_my_coop_loan/__manifest__.py b/easy_my_coop_loan/__manifest__.py index 7a39db5..f59bd67 100644 --- a/easy_my_coop_loan/__manifest__.py +++ b/easy_my_coop_loan/__manifest__.py @@ -1,30 +1,26 @@ -# Copyright 2019 Coop IT Easy SCRLfs () -# - Houssine BAKKALI - -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -{ - "name": "Easy My Coop Bond and Subordinated Loan Issues", - "version": "12.0.1.0.1", - "depends": [ - "easy_my_coop", - ], - "author": "Coop IT Easy SCRLfs", - "category": "Cooperative management", - "website": "http://www.coopiteasy.be", - "license": "AGPL-3", - "description": """ - This module allows to manage the bonds and subordinated loans subscription - life cycle. - """, - 'data': [ - 'security/ir.model.access.csv', - 'views/loan_view.xml', - 'views/partner_view.xml', - 'views/menus.xml', - 'data/mail_template_data.xml', - ], - "demo": [ - "demo/coop.xml", - ], - 'installable': True, -} +# Copyright 2019 Coop IT Easy SCRLfs () +# - Houssine BAKKALI - +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Easy My Coop Bond and Subordinated Loan Issues", + "version": "12.0.1.0.1", + "depends": ["easy_my_coop"], + "author": "Coop IT Easy SCRLfs", + "category": "Cooperative management", + "website": "http://www.coopiteasy.be", + "license": "AGPL-3", + "summary": """ + This module allows to manage the bonds and + subordinated loans subscription life cycle. + """, + "data": [ + "security/ir.model.access.csv", + "views/loan_view.xml", + "views/partner_view.xml", + "views/menus.xml", + "data/mail_template_data.xml", + ], + "demo": ["demo/coop.xml"], + "installable": True, +} diff --git a/easy_my_coop_loan/models/interest_line.py b/easy_my_coop_loan/models/interest_line.py index 23d0670..98a7927 100644 --- a/easy_my_coop_loan/models/interest_line.py +++ b/easy_my_coop_loan/models/interest_line.py @@ -6,59 +6,79 @@ from odoo import fields, models class LoanInterestLine(models.Model): - _name = 'loan.interest.line' + _name = "loan.interest.line" _description = "Loan Interest Line" - name = fields.Integer(string="Year", - required=True) - issue_line = fields.Many2one('loan.issue.line', - string="Subscribed loan", - required=True) - partner_id = fields.Many2one(related='issue_line.partner_id', - store=True, - readlonly=True) - amount = fields.Monetary(related='issue_line.amount', - string="Subscribed amount", - currency_field='company_currency_id', - readonly=True) - interest = fields.Monetary(string="Gross interest amount", - currency_field='company_currency_id', - readonly=True) - net_interest = fields.Monetary(string="Net interest amount", - currency_field='company_currency_id', - readonly=True) - taxes_rate = fields.Float(string="Taxes on interest", - required=True) - taxes_amount = fields.Monetary(string="Taxes amount", - currency_field='company_currency_id', - readonly=True) - accrued_amount = fields.Monetary(string="Accrued amount", - currency_field='company_currency_id', - readonly=True) - accrued_interest = fields.Monetary(string="Accrued gross interest", - currency_field='company_currency_id', - readonly=True) + name = fields.Integer(string="Year", required=True) + issue_line = fields.Many2one( + "loan.issue.line", string="Subscribed loan", required=True + ) + partner_id = fields.Many2one( + related="issue_line.partner_id", store=True, readlonly=True + ) + amount = fields.Monetary( + related="issue_line.amount", + string="Subscribed amount", + currency_field="company_currency_id", + readonly=True, + ) + interest = fields.Monetary( + string="Gross interest amount", + currency_field="company_currency_id", + readonly=True, + ) + net_interest = fields.Monetary( + string="Net interest amount", + currency_field="company_currency_id", + readonly=True, + ) + taxes_rate = fields.Float(string="Taxes on interest", required=True) + taxes_amount = fields.Monetary( + string="Taxes amount", + currency_field="company_currency_id", + readonly=True, + ) + accrued_amount = fields.Monetary( + string="Accrued amount", + currency_field="company_currency_id", + readonly=True, + ) + accrued_interest = fields.Monetary( + string="Accrued gross interest", + currency_field="company_currency_id", + readonly=True, + ) accrued_net_interest = fields.Monetary( - string="Accrued net interest", - currency_field='company_currency_id', - readonly=True) - accrued_taxes = fields.Monetary(string="Accrued taxes to pay", - currency_field='company_currency_id', - readonly=True) + string="Accrued net interest", + currency_field="company_currency_id", + readonly=True, + ) + accrued_taxes = fields.Monetary( + string="Accrued taxes to pay", + currency_field="company_currency_id", + readonly=True, + ) due_date = fields.Date(string="Due date") - company_currency_id = fields.Many2one('res.currency', - related='company_id.currency_id', - string="Company Currency", - readonly=True) - company_id = fields.Many2one('res.company', - related='issue_line.company_id', - string="Company", - readonly=True) - state = fields.Selection([('draft', 'Draft'), - ('due', 'Due'), - ('requested', 'Payment requested'), - ('donation', 'Donation'), - ('paid', 'Paid') - ], - string="State", - default="draft") + company_currency_id = fields.Many2one( + "res.currency", + related="company_id.currency_id", + string="Company Currency", + readonly=True, + ) + company_id = fields.Many2one( + "res.company", + related="issue_line.company_id", + string="Company", + readonly=True, + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("due", "Due"), + ("requested", "Payment requested"), + ("donation", "Donation"), + ("paid", "Paid"), + ], + string="State", + default="draft", + ) diff --git a/easy_my_coop_loan/models/loan.py b/easy_my_coop_loan/models/loan.py index c1dac6d..0e686c5 100644 --- a/easy_my_coop_loan/models/loan.py +++ b/easy_my_coop_loan/models/loan.py @@ -4,81 +4,103 @@ import logging -from odoo import api, fields, models, _ +from odoo import _, api, fields, models _logger = logging.getLogger(__name__) class LoanIssue(models.Model): - _name = 'loan.issue' - _description = 'Loan Issue' + _name = "loan.issue" + _description = "Loan Issue" @api.multi def _compute_subscribed_amount(self): for issue in self: susbscribed_amount = 0.0 for line in issue.loan_issue_lines.filtered( - lambda record: record.state != 'cancelled'): + lambda record: record.state != "cancelled" + ): susbscribed_amount += line.amount issue.subscribed_amount = susbscribed_amount - name = fields.Char(string="Name", - translate=True) + name = fields.Char(string="Name", translate=True) default_issue = fields.Boolean(string="Default issue") - subscription_start_date = fields.Date(string="Start date subscription period") + subscription_start_date = fields.Date( + string="Start date subscription period" + ) subscription_end_date = fields.Date(string="End date subscription period") - user_id = fields.Many2one('res.users', - string="Responsible") + user_id = fields.Many2one("res.users", string="Responsible") loan_start_date = fields.Date(string="Loan start date") term_date = fields.Date(string="Term date") loan_term = fields.Float(string="Duration of the loan in month") rate = fields.Float(string="Interest rate") - face_value = fields.Monetary(string="Facial value", - currency_field='company_currency_id', - required=True) - minimum_amount = fields.Monetary(string="Minimum amount of issue", - currency_field='company_currency_id') - maximum_amount = fields.Monetary(string="Maximum amount of issue", - currency_field='company_currency_id') - min_amount_company = fields.Monetary(string="Minimum amount for a company", - currency_field='company_currency_id') - max_amount_company = fields.Monetary(string="Maximum amount for a company", - currency_field='company_currency_id') - min_amount_person = fields.Monetary(string="Minimum amount for a person", - currency_field='company_currency_id') - max_amount_person = fields.Monetary(string="Maximum amount for a person", - currency_field='company_currency_id') - subscribed_amount = fields.Monetary(string="Subscribed amount", - compute="_compute_subscribed_amount", - currency_field='company_currency_id') - interest_payment = fields.Selection([('end', 'End'), - ('yearly', 'Yearly')], - string="Interest payment") + face_value = fields.Monetary( + string="Facial value", + currency_field="company_currency_id", + required=True, + ) + minimum_amount = fields.Monetary( + string="Minimum amount of issue", currency_field="company_currency_id" + ) + maximum_amount = fields.Monetary( + string="Maximum amount of issue", currency_field="company_currency_id" + ) + min_amount_company = fields.Monetary( + string="Minimum amount for a company", + currency_field="company_currency_id", + ) + max_amount_company = fields.Monetary( + string="Maximum amount for a company", + currency_field="company_currency_id", + ) + min_amount_person = fields.Monetary( + string="Minimum amount for a person", + currency_field="company_currency_id", + ) + max_amount_person = fields.Monetary( + string="Maximum amount for a person", + currency_field="company_currency_id", + ) + subscribed_amount = fields.Monetary( + string="Subscribed amount", + compute="_compute_subscribed_amount", + currency_field="company_currency_id", + ) + interest_payment = fields.Selection( + [("end", "End"), ("yearly", "Yearly")], string="Interest payment" + ) interest_payment_info = fields.Char(string="Yearly payment on") - loan_issue_lines = fields.One2many('loan.issue.line', - 'loan_issue_id', - string="Loan issue lines") - state = fields.Selection([('draft', 'Draft'), - ('confirmed', 'Confirmed'), - ('cancelled', 'Cancelled'), - ('ongoing', 'Ongoing'), - ('closed', 'Closed')], - string="State", - default='draft') - company_currency_id = fields.Many2one('res.currency', - related='company_id.currency_id', - string="Company Currency", - readonly=True) - company_id = fields.Many2one('res.company', - string='Company', - required=True, - readonly=True, - default=lambda self: self.env['res.company']._company_default_get()) # noqa + loan_issue_lines = fields.One2many( + "loan.issue.line", "loan_issue_id", string="Loan issue lines" + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancelled", "Cancelled"), + ("ongoing", "Ongoing"), + ("closed", "Closed"), + ], + string="State", + default="draft", + ) + company_currency_id = fields.Many2one( + "res.currency", + related="company_id.currency_id", + string="Company Currency", + readonly=True, + ) + company_id = fields.Many2one( + "res.company", + string="Company", + required=True, + readonly=True, + default=lambda self: self.env["res.company"]._company_default_get(), + ) # noqa by_company = fields.Boolean(string="By company") - by_individual = fields.Boolean(string='By individuals') - display_on_website = fields.Boolean(sting='Display on website') - taxes_rate = fields.Float(string="Taxes on interest", - required=True) + by_individual = fields.Boolean(string="By individuals") + display_on_website = fields.Boolean(sting="Display on website") + taxes_rate = fields.Float(string="Taxes on interest", required=True) @api.multi def get_max_amount(self, partner): @@ -88,7 +110,8 @@ class LoanIssue(models.Model): """ self.ensure_one() lines = self.loan_issue_lines.filtered( - lambda r: r.partner_id == partner and r.state != 'cancelled') + lambda r: r.partner_id == partner and r.state != "cancelled" + ) already_subscribed = sum(line.amount for line in lines) max_amount = -1 # No max amount if partner.is_company and self.max_amount_company > 0: @@ -105,7 +128,8 @@ class LoanIssue(models.Model): """ self.ensure_one() lines = self.loan_issue_lines.filtered( - lambda r: r.partner_id == partner and r.state != 'cancelled') + lambda r: r.partner_id == partner and r.state != "cancelled" + ) amount_subscribed = sum(line.amount for line in lines) if partner.is_company: min_amount = self.min_amount_company - amount_subscribed @@ -115,42 +139,41 @@ class LoanIssue(models.Model): @api.multi def get_web_issues(self, is_company): - bond_issues = self.search([ - ('display_on_website', '=', True), - ('state', '=', 'ongoing') - ]) + bond_issues = self.search( + [("display_on_website", "=", True), ("state", "=", "ongoing")] + ) if is_company is True: - return bond_issues.filtered('by_company') + return bond_issues.filtered("by_company") else: - return bond_issues.filtered('by_company') + return bond_issues.filtered("by_company") @api.multi def action_confirm(self): self.ensure_one() - self.write({'state': 'confirmed'}) + self.write({"state": "confirmed"}) @api.multi def action_open(self): self.ensure_one() - self.write({'state': 'ongoing'}) + self.write({"state": "ongoing"}) @api.multi def action_draft(self): self.ensure_one() - self.write({'state': 'draft'}) + self.write({"state": "draft"}) @api.multi def action_cancel(self): self.ensure_one() - self.write({'state': 'cancelled'}) + self.write({"state": "cancelled"}) @api.multi def action_close(self): self.ensure_one() - self.write({'state': 'closed'}) + self.write({"state": "closed"}) def get_interest_vals(self, line, vals): - interest_obj = self.env['loan.interest.line'] + interest_obj = self.env["loan.interest.line"] accrued_amount = line.amount accrued_interest = 0 accrued_net_interest = 0 @@ -163,38 +186,43 @@ class LoanIssue(models.Model): accrued_interest += interest accrued_net_interest += net_interest accrued_taxes += taxes_amount - vals['interest'] = interest - vals['net_interest'] = net_interest - vals['taxes_amount'] = taxes_amount - vals['accrued_amount'] = accrued_amount - vals['accrued_interest'] = accrued_interest - vals['accrued_net_interest'] = accrued_net_interest - vals['accrued_taxes'] = accrued_taxes - vals['name'] = year + vals["interest"] = interest + vals["net_interest"] = net_interest + vals["taxes_amount"] = taxes_amount + vals["accrued_amount"] = accrued_amount + vals["accrued_interest"] = accrued_interest + vals["accrued_net_interest"] = accrued_net_interest + vals["accrued_taxes"] = accrued_taxes + vals["name"] = year interest_obj.create(vals) @api.multi def compute_loan_interest(self): self.ensure_one() - if self.interest_payment == 'end': + if self.interest_payment == "end": due_date = self.term_date else: - raise NotImplementedError(_("Interest payment by year hasn't been " - "implemented yet")) + raise NotImplementedError( + _("Interest payment by year hasn't been " "implemented yet") + ) for line in self.loan_issue_lines: # TODO remove this line line.interest_lines.unlink() # Please Do not Forget vals = { - 'issue_line': line.id, - 'due_date': due_date, - 'taxes_rate': self.taxes_rate - } + "issue_line": line.id, + "due_date": due_date, + "taxes_rate": self.taxes_rate, + } self.get_interest_vals(line, vals) rounded_term = int(self.loan_term) if self.loan_term - rounded_term > 0: # TODO Handle this case - raise NotImplementedError(_("Calculation on non entire year " - "hasn't been implemented yet")) + raise NotImplementedError( + _( + "Calculation on non entire year " + "hasn't been implemented yet" + ) + ) diff --git a/easy_my_coop_loan/models/loan_issue_line.py b/easy_my_coop_loan/models/loan_issue_line.py index e31bfe9..3bb45f9 100644 --- a/easy_my_coop_loan/models/loan_issue_line.py +++ b/easy_my_coop_loan/models/loan_issue_line.py @@ -8,65 +8,79 @@ from odoo import api, fields, models class LoanIssueLine(models.Model): - _name = 'loan.issue.line' - _description = 'Loan Issue Line' - _order = 'date desc, id' + _name = "loan.issue.line" + _description = "Loan Issue Line" + _order = "date desc, id" @api.multi - @api.depends('quantity', 'face_value') + @api.depends("quantity", "face_value") def _compute_amount(self): for line in self: line.amount = line.face_value * line.quantity name = fields.Char(string="Reference") - loan_issue_id = fields.Many2one('loan.issue', - string="Loan issue", - required=True) - interest_lines = fields.One2many('loan.interest.line', - 'issue_line', - string="Interest lines") - quantity = fields.Integer(string='quantity', - required=True) - face_value = fields.Monetary(related='loan_issue_id.face_value', - currency_field='company_currency_id', - store=True, - readonly=True) - partner_id = fields.Many2one('res.partner', - string="Subscriber", - required=True) - date = fields.Date(string="Subscription date", - default=lambda self: datetime.strftime(datetime.now(), - '%Y-%m-%d'), - required=True) - amount = fields.Monetary(string="Subscribed amount", - currency_field='company_currency_id', - compute='_compute_amount', - store=True) - state = fields.Selection([('draft', 'Draft'), - ('subscribed', 'Subscribed'), - ('waiting', 'Waiting payment'), - ('paid', 'paid'), - ('cancelled', 'Cancelled'), - ('ended', 'Ended')], - string="State", - required=True, - default="draft") - company_currency_id = fields.Many2one('res.currency', - related='company_id.currency_id', - string="Company Currency", - readonly=True) - company_id = fields.Many2one('res.company', - related='loan_issue_id.company_id', - string="Company", - readonly=True) + loan_issue_id = fields.Many2one( + "loan.issue", string="Loan issue", required=True + ) + interest_lines = fields.One2many( + "loan.interest.line", "issue_line", string="Interest lines" + ) + quantity = fields.Integer(string="quantity", required=True) + face_value = fields.Monetary( + related="loan_issue_id.face_value", + currency_field="company_currency_id", + store=True, + readonly=True, + ) + partner_id = fields.Many2one( + "res.partner", string="Subscriber", required=True + ) + date = fields.Date( + string="Subscription date", + default=lambda self: datetime.strftime(datetime.now(), "%Y-%m-%d"), + required=True, + ) + amount = fields.Monetary( + string="Subscribed amount", + currency_field="company_currency_id", + compute="_compute_amount", + store=True, + ) + state = fields.Selection( + [ + ("draft", "Draft"), + ("subscribed", "Subscribed"), + ("waiting", "Waiting payment"), + ("paid", "paid"), + ("cancelled", "Cancelled"), + ("ended", "Ended"), + ], + string="State", + required=True, + default="draft", + ) + company_currency_id = fields.Many2one( + "res.currency", + related="company_id.currency_id", + string="Company Currency", + readonly=True, + ) + company_id = fields.Many2one( + "res.company", + related="loan_issue_id.company_id", + string="Company", + readonly=True, + ) def get_loan_sub_mail_template(self): - return self.env.ref('easy_my_coop_loan.loan_subscription_confirmation', - False) + return self.env.ref( + "easy_my_coop_loan.loan_subscription_confirmation", False + ) def get_loan_pay_req_mail_template(self): - return self.env.ref('easy_my_coop_loan.loan_issue_payment_request', - False) + return self.env.ref( + "easy_my_coop_loan.loan_issue_payment_request", False + ) @api.model def create(self, vals): @@ -80,12 +94,12 @@ class LoanIssueLine(models.Model): @api.multi def action_draft(self): for line in self: - line.write({'state': 'draft'}) + line.write({"state": "draft"}) @api.multi def action_validate(self): for line in self: - line.write({'state': 'subscribed'}) + line.write({"state": "subscribed"}) @api.multi def action_request_payment(self): @@ -93,14 +107,14 @@ class LoanIssueLine(models.Model): for line in self: pay_req_mail_template.send_mail(line.id) - line.write({'state': 'waiting'}) + line.write({"state": "waiting"}) @api.multi def action_cancel(self): for line in self: - line.write({'state': 'cancelled'}) + line.write({"state": "cancelled"}) @api.multi def action_paid(self): for line in self: - line.write({'state': 'paid'}) + line.write({"state": "paid"}) diff --git a/easy_my_coop_loan/models/partner.py b/easy_my_coop_loan/models/partner.py index 4431673..992bf96 100644 --- a/easy_my_coop_loan/models/partner.py +++ b/easy_my_coop_loan/models/partner.py @@ -3,7 +3,7 @@ # Robin Keunen # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo import fields, models, api +from odoo import api, fields, models class ResPartner(models.Model): @@ -15,9 +15,7 @@ class ResPartner(models.Model): string="Loans", ) is_loaner = fields.Boolean( - string="Loaner", - compute="_compute_is_loaner", - store=True, + string="Loaner", compute="_compute_is_loaner", store=True ) @api.multi diff --git a/easy_my_coop_loan/tests/test_emc_loan.py b/easy_my_coop_loan/tests/test_emc_loan.py index fda5895..bd3f22f 100644 --- a/easy_my_coop_loan/tests/test_emc_loan.py +++ b/easy_my_coop_loan/tests/test_emc_loan.py @@ -2,10 +2,12 @@ # Robin Keunen # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). -from odoo.addons.easy_my_coop.tests.test_base import EMCBaseCase -from odoo.fields import Date from datetime import timedelta + from odoo.exceptions import AccessError +from odoo.fields import Date + +from odoo.addons.easy_my_coop.tests.test_base import EMCBaseCase class EMCLoanCase(EMCBaseCase): @@ -101,4 +103,3 @@ class EMCLoanCase(EMCBaseCase): line.action_paid() loan_issue.compute_loan_interest() - diff --git a/easy_my_coop_loan_website/__manifest__.py b/easy_my_coop_loan_website/__manifest__.py index dce93fa..2962857 100644 --- a/easy_my_coop_loan_website/__manifest__.py +++ b/easy_my_coop_loan_website/__manifest__.py @@ -1,26 +1,19 @@ -# Copyright 2019 Coop IT Easy SCRLfs () -# - Houssine BAKKALI - -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). - -{ - "name": "Easy My Coop Loan Issues Website", - "version": "12.0.1.0.1", - "depends": [ - "easy_my_coop_loan", - "easy_my_coop_website", - "website", - ], - "author": "Coop IT Easy SCRLfs", - "category": "Cooperative management", - "website": "http://www.coopiteasy.be", - "license": "AGPL-3", - "description": """ - This module implements the subscription page for bonds and - subordinated loans. - """, - 'data': [ - 'data/website_loan_data.xml', - 'template/loan_issue_template.xml' - ], - 'installable': True, -} +# Copyright 2019 Coop IT Easy SCRLfs () +# - Houssine BAKKALI - +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +{ + "name": "Easy My Coop Loan Issues Website", + "version": "12.0.1.0.1", + "depends": ["easy_my_coop_loan", "easy_my_coop_website", "website"], + "author": "Coop IT Easy SCRLfs", + "category": "Cooperative management", + "website": "http://www.coopiteasy.be", + "license": "AGPL-3", + "summary": """ + This module implements the subscription page + for bonds and subordinated loans. + """, + "data": ["data/website_loan_data.xml", "template/loan_issue_template.xml"], + "installable": True, +} diff --git a/easy_my_coop_loan_website/controllers/main.py b/easy_my_coop_loan_website/controllers/main.py index 09f7379..e16271e 100644 --- a/easy_my_coop_loan_website/controllers/main.py +++ b/easy_my_coop_loan_website/controllers/main.py @@ -1,95 +1,103 @@ -from odoo import http -from odoo.http import request - -from odoo.tools.translate import _ - - -class WebsiteLoanIssueSubscription(http.Controller): - - @http.route(['/subscription/get_loan_issue'], - type='json', - auth="user", - methods=['POST'], website=True) - def get_loan_issue(self, loan_issue_id, **kw): - loan_issue_obj = request.env['loan.issue'] - partner = request.env.user.partner_id - if loan_issue_id: - loan_issue = loan_issue_obj.sudo().browse(int(loan_issue_id)) - max_amount = loan_issue.get_max_amount(partner) - return { - loan_issue.id: { - 'max_amount': max_amount, - 'face_value': loan_issue.face_value, - } - } - else: - return False - - @http.route(['/subscription/loan_issue_form'], - type='http', auth="user", website=True) - def display_loan_issue_subscription_page(self, **kwargs): - values = {} - partner = request.env.user.partner_id - is_company = partner.is_company - - values = self.fill_values(values, is_company) - values.update(kwargs=kwargs.items()) - return request.render( - "easy_my_coop_loan_website.loanissuesubscription", - values) - - def get_loan_issues(self, is_company): - loan_obj = request.env['loan.issue'] - loan_issues = loan_obj.sudo().get_web_issues(is_company) - - return loan_issues - - def fill_values(self, values, is_company): - company = request.website.company_id - loan_issues = self.get_loan_issues(is_company) - - values['loan_issues'] = loan_issues - values['company'] = company - - if not values.get('loan_issue_id'): - for loan_issue in loan_issues: - if loan_issue.default_issue is True: - values['loan_issue_id'] = loan_issue.id - break - if not values.get('loan_issue_id', False) and loan_issues: - values['loan_issue_id'] = loan_issues[0].id - - return values - - def validation(self, loan_issue, kwargs): - sub_amount = kwargs.get('subscription_amount') - redirect = "easy_my_coop_loan_website.loanissuesubscription" - - values = {} - if not loan_issue: - values["error_msg"] = _("The selected loan issue is not found") - return request.render(redirect, values) - if sub_amount: - values["error_msg"] = _("The amount shoud be of monetary type") - return request.render(redirect, values) - return True - - @http.route(['/subscription/subscribe_loan_issue'], - type='http', - auth="user", website=True) - def loan_issue_subscription(self, **kwargs): - loan_obj = request.env['loan.issue'] - loan_obj_line = request.env['loan.issue.line'] - - loan_issue = loan_obj.sudo().browse(kwargs.get('loan_issue_id')) - partner = request.env.user.partner_id - - if self.validation(loan_issue, kwargs): - values = { - 'loan_issue_id': loan_issue.id, - 'partner_id': partner.id, - 'amount': kwargs['subscription_amount'], - 'state': 'subscribed' - } - loan_obj_line.sudo().create(values) - return request.render("easy_my_coop_website.cooperator_thanks", values) +from odoo import http +from odoo.http import request +from odoo.tools.translate import _ + + +class WebsiteLoanIssueSubscription(http.Controller): + @http.route( + ["/subscription/get_loan_issue"], + type="json", + auth="user", + methods=["POST"], + website=True, + ) + def get_loan_issue(self, loan_issue_id, **kw): + loan_issue_obj = request.env["loan.issue"] + partner = request.env.user.partner_id + if loan_issue_id: + loan_issue = loan_issue_obj.sudo().browse(int(loan_issue_id)) + max_amount = loan_issue.get_max_amount(partner) + return { + loan_issue.id: { + "max_amount": max_amount, + "face_value": loan_issue.face_value, + } + } + else: + return False + + @http.route( + ["/subscription/loan_issue_form"], + type="http", + auth="user", + website=True, + ) + def display_loan_issue_subscription_page(self, **kwargs): + values = {} + partner = request.env.user.partner_id + is_company = partner.is_company + + values = self.fill_values(values, is_company) + values.update(kwargs=kwargs.items()) + return request.render( + "easy_my_coop_loan_website.loanissuesubscription", values + ) + + def get_loan_issues(self, is_company): + loan_obj = request.env["loan.issue"] + loan_issues = loan_obj.sudo().get_web_issues(is_company) + + return loan_issues + + def fill_values(self, values, is_company): + company = request.website.company_id + loan_issues = self.get_loan_issues(is_company) + + values["loan_issues"] = loan_issues + values["company"] = company + + if not values.get("loan_issue_id"): + for loan_issue in loan_issues: + if loan_issue.default_issue is True: + values["loan_issue_id"] = loan_issue.id + break + if not values.get("loan_issue_id", False) and loan_issues: + values["loan_issue_id"] = loan_issues[0].id + + return values + + def validation(self, loan_issue, kwargs): + sub_amount = kwargs.get("subscription_amount") + redirect = "easy_my_coop_loan_website.loanissuesubscription" + + values = {} + if not loan_issue: + values["error_msg"] = _("The selected loan issue is not found") + return request.render(redirect, values) + if sub_amount: + values["error_msg"] = _("The amount shoud be of monetary type") + return request.render(redirect, values) + return True + + @http.route( + ["/subscription/subscribe_loan_issue"], + type="http", + auth="user", + website=True, + ) + def loan_issue_subscription(self, **kwargs): + loan_obj = request.env["loan.issue"] + loan_obj_line = request.env["loan.issue.line"] + + loan_issue = loan_obj.sudo().browse(kwargs.get("loan_issue_id")) + partner = request.env.user.partner_id + + if self.validation(loan_issue, kwargs): + values = { + "loan_issue_id": loan_issue.id, + "partner_id": partner.id, + "amount": kwargs["subscription_amount"], + "state": "subscribed", + } + loan_obj_line.sudo().create(values) + return request.render("easy_my_coop_website.cooperator_thanks", values) diff --git a/easy_my_coop_taxshelter_report/__manifest__.py b/easy_my_coop_taxshelter_report/__manifest__.py index e30b638..c9a6584 100644 --- a/easy_my_coop_taxshelter_report/__manifest__.py +++ b/easy_my_coop_taxshelter_report/__manifest__.py @@ -15,7 +15,7 @@ "category": "Cooperative management", "website": "www.coopiteasy.be", "license": "AGPL-3", - "description": """ + "summary": """ This module allows you to create a fiscal declaration year and to print tax shelter declaration for each cooperator. """, diff --git a/easy_my_coop_taxshelter_report/models/mail_template.py b/easy_my_coop_taxshelter_report/models/mail_template.py index 6495bd1..59811f7 100644 --- a/easy_my_coop_taxshelter_report/models/mail_template.py +++ b/easy_my_coop_taxshelter_report/models/mail_template.py @@ -6,7 +6,11 @@ class MailTemplate(models.Model): @api.multi def send_mail_with_multiple_attachments( - self, res_id, additional_attachments, force_send=False, raise_exception=False + self, + res_id, + additional_attachments, + force_send=False, + raise_exception=False, ): """Generates a new mail message for the given template and record, and schedules it for delivery through the ``mail`` diff --git a/easy_my_coop_taxshelter_report/models/tax_shelter_declaration.py b/easy_my_coop_taxshelter_report/models/tax_shelter_declaration.py index c3c04fa..c31116b 100644 --- a/easy_my_coop_taxshelter_report/models/tax_shelter_declaration.py +++ b/easy_my_coop_taxshelter_report/models/tax_shelter_declaration.py @@ -38,10 +38,16 @@ class TaxShelterDeclaration(models.Model): month_from = fields.Char(String="Month from", required=True) month_to = fields.Char(String="Month to", required=True) tax_shelter_percentage = fields.Selection( - [("30", "30%"), ("45", "45%")], string="Tax Shelter percentage", required=True + [("30", "30%"), ("45", "45%")], + string="Tax Shelter percentage", + required=True, ) state = fields.Selection( - [("draft", "Draft"), ("computed", "Computed"), ("validated", "Validated")], + [ + ("draft", "Draft"), + ("computed", "Computed"), + ("validated", "Validated"), + ], string="State", required=True, default="draft", @@ -76,7 +82,10 @@ class TaxShelterDeclaration(models.Model): declaration = self else: declaration = self.search( - [("date_from", "<=", entry.date), ("date_to", ">=", entry.date)] + [ + ("date_from", "<=", entry.date), + ("date_to", ">=", entry.date), + ] ) if entry.partner_id.id in declaration.excluded_cooperator.ids: return True @@ -93,13 +102,18 @@ class TaxShelterDeclaration(models.Model): line_vals["type"] = TYPE_MAP[entry.type] if entry.type == "subscription": if not excluded: - capital_after_sub = ongoing_capital_sub + entry.total_amount_line + capital_after_sub = ( + ongoing_capital_sub + entry.total_amount_line + ) else: capital_after_sub = ongoing_capital_sub line_vals["capital_before_sub"] = ongoing_capital_sub line_vals["capital_after_sub"] = capital_after_sub line_vals["capital_limit"] = self.tax_shelter_capital_limit - if ongoing_capital_sub < self.tax_shelter_capital_limit and not excluded: + if ( + ongoing_capital_sub < self.tax_shelter_capital_limit + and not excluded + ): line_vals["tax_shelter"] = True return line_vals @@ -116,7 +130,9 @@ class TaxShelterDeclaration(models.Model): cert_vals[ "cooperator_number" ] = entry.partner_id.cooperator_register_number - certificate = self.env["tax.shelter.certificate"].create(cert_vals) + certificate = self.env["tax.shelter.certificate"].create( + cert_vals + ) partner_certificate[entry.partner_id.id] = certificate excluded = self._excluded_from_declaration(entry) line_vals = self._prepare_line( @@ -129,8 +145,9 @@ class TaxShelterDeclaration(models.Model): return partner_certificate - @api.one + @api.multi def compute_declaration(self): + self.ensure_one() entries = self.env["subscription.register"].search( [ ("partner_id.is_company", "=", False), @@ -140,7 +157,7 @@ class TaxShelterDeclaration(models.Model): ) subscriptions = entries.filtered( - (lambda r: r.type == "subscription" and r.date < self.date_from) + lambda r: r.type == "subscription" and r.date < self.date_from ) # noqa cap_prev_sub = 0.0 for subscription in subscriptions: @@ -154,13 +171,15 @@ class TaxShelterDeclaration(models.Model): self.state = "computed" - @api.one + @api.multi def validate_declaration(self): + self.ensure_one() self.tax_shelter_certificates.write({"state": "validated"}) self.state = "validated" - @api.one + @api.multi def reset_declaration(self): + self.ensure_one() if not self.state == "validated": self.tax_shelter_certificates.unlink() self.state = "draft" @@ -235,13 +254,15 @@ class TaxShelterCertificate(models.Model): compute="_compute_amounts", string="Total previously subscribed" ) total_amount_eligible_previously_subscribed = fields.Float( - compute="_compute_amounts", string="Total eligible previously subscribed" + compute="_compute_amounts", + string="Total eligible previously subscribed", ) total_amount_subscribed = fields.Float( compute="_compute_amounts", string="Total subscribed" ) total_amount_eligible = fields.Float( - compute="_compute_amounts", string="Total amount eligible To Tax shelter" + compute="_compute_amounts", + string="Total amount eligible To Tax shelter", ) total_amount_resold = fields.Float( compute="_compute_amounts", string="Total resold" @@ -252,14 +273,21 @@ class TaxShelterCertificate(models.Model): total_amount = fields.Float( compute="_compute_amounts", string="Total", readonly=True ) - company_id = fields.Many2one(related="declaration_id.company_id", string="Company") + company_id = fields.Many2one( + related="declaration_id.company_id", string="Company" + ) def generate_pdf_report(self, report_type): report, name = REPORT_DIC[report_type] report = self.env.ref(report).render_qweb_pdf(self.id)[0] report = base64.b64encode(report) report_name = ( - self.partner_id.name + " " + name + " " + self.declaration_id.name + ".pdf" + self.partner_id.name + + " " + + name + + " " + + self.declaration_id.name + + ".pdf" ) return (report_name, report) @@ -325,7 +353,9 @@ class TaxShelterCertificate(models.Model): certificate.total_amount_eligible = total_amount_elligible for line in certificate.previously_subscribed_eligible_lines: - total_amount_previously_eligible += line.amount_subscribed_eligible + total_amount_previously_eligible += ( + line.amount_subscribed_eligible + ) certificate.total_amount_eligible_previously_subscribed = ( total_amount_previously_eligible ) @@ -357,7 +387,7 @@ class TaxShelterCertificate(models.Model): lambda r: r.type == "subscribed" and r.transaction_date < certificate.declaration_id.date_from ) - certificate.previously_subscribed_eligible_lines = certificate.lines.filtered( + certificate.previously_subscribed_eligible_lines = certificate.lines.filtered( # noqa lambda r: r.type == "subscribed" and r.transaction_date < certificate.declaration_id.date_from and r.tax_shelter @@ -401,8 +431,12 @@ class TaxShelterCertificateLine(models.Model): share_type = fields.Many2one( "product.product", string="Share type", required=True, readonly=True ) - share_unit_price = fields.Float(string="Share price", required=True, readonly=True) - quantity = fields.Integer(string="Number of shares", required=True, readonly=True) + share_unit_price = fields.Float( + string="Share price", required=True, readonly=True + ) + quantity = fields.Integer( + string="Number of shares", required=True, readonly=True + ) transaction_date = fields.Date(string="Transaction date") tax_shelter = fields.Boolean(string="Tax shelter eligible", readonly=True) type = fields.Selection( @@ -419,7 +453,9 @@ class TaxShelterCertificateLine(models.Model): compute="_compute_totals", string="Amount subscribed", store=True ) amount_subscribed_eligible = fields.Float( - compute="_compute_totals", string="Amount subscribed eligible", store=True + compute="_compute_totals", + string="Amount subscribed eligible", + store=True, ) amount_resold = fields.Float( compute="_compute_totals", string="Amount resold", store=True @@ -431,7 +467,9 @@ class TaxShelterCertificateLine(models.Model): capital_before_sub = fields.Float( string="Capital before subscription", readonly=True ) - capital_after_sub = fields.Float(string="Capital after subscription", readonly=True) + capital_after_sub = fields.Float( + string="Capital after subscription", readonly=True + ) capital_limit = fields.Float(string="Capital limit", readonly=True) @api.multi @@ -460,4 +498,6 @@ class TaxShelterCertificateLine(models.Model): if line.type == "resold": line.amount_resold = line.share_unit_price * -(line.quantity) if line.type == "transfered": - line.amount_transfered = line.share_unit_price * -(line.quantity) + line.amount_transfered = line.share_unit_price * -( + line.quantity + ) diff --git a/easy_my_coop_website/__manifest__.py b/easy_my_coop_website/__manifest__.py index 0067100..5f5dbbf 100644 --- a/easy_my_coop_website/__manifest__.py +++ b/easy_my_coop_website/__manifest__.py @@ -6,23 +6,19 @@ { "name": "Easy My Coop Website", "version": "12.0.1.0.0", - "depends": [ - "easy_my_coop", - "website", - "website_recaptcha_reloaded", - ], + "depends": ["easy_my_coop", "website", "website_recaptcha_reloaded"], "author": "Coop IT Easy SCRLfs", "category": "Cooperative management", "website": "www.coopiteasy.be", "license": "AGPL-3", - "description": """ - This module adds the cooperator subscription form allowing to subscribe for - shares online. + "summary": """ + This module adds the cooperator subscription form + allowing to subscribe for shares online. """, - 'data': [ - 'views/subscription_template.xml', - 'data/website_cooperator_data.xml', + "data": [ + "views/subscription_template.xml", + "data/website_cooperator_data.xml", ], - 'installable': True, - 'application': True, + "installable": True, + "application": True, } diff --git a/easy_my_coop_website/controllers/main.py b/easy_my_coop_website/controllers/main.py index 1a51c46..60bff75 100644 --- a/easy_my_coop_website/controllers/main.py +++ b/easy_my_coop_website/controllers/main.py @@ -1,39 +1,79 @@ import base64 -from datetime import datetime import re +from datetime import datetime from odoo import http from odoo.http import request from odoo.tools.translate import _ # Only use for behavior, don't stock it -_TECHNICAL = ['view_from', 'view_callback'] +_TECHNICAL = ["view_from", "view_callback"] # Allow in description -_BLACKLIST = ['id', 'create_uid', 'create_date', 'write_uid', 'write_date', - 'user_id', 'active'] - -_COOP_FORM_FIELD = ['email', 'confirm_email', 'firstname', 'lastname', - 'birthdate', 'iban', 'share_product_id', - 'address', 'city', 'zip_code', 'country_id', 'phone', - 'lang', 'nb_parts', 'total_parts', 'error_msg'] - -_COMPANY_FORM_FIELD = ['is_company', 'company_register_number', 'company_name', - 'company_email', 'confirm_email', 'email', 'firstname', - 'lastname', 'birthdate', 'iban', 'share_product_id', - 'address', 'city', 'zip_code', 'country_id', 'phone', - 'lang', 'nb_parts', 'total_parts', 'error_msg', - 'company_type'] +_BLACKLIST = [ + "id", + "create_uid", + "create_date", + "write_uid", + "write_date", + "user_id", + "active", +] + +_COOP_FORM_FIELD = [ + "email", + "confirm_email", + "firstname", + "lastname", + "birthdate", + "iban", + "share_product_id", + "address", + "city", + "zip_code", + "country_id", + "phone", + "lang", + "nb_parts", + "total_parts", + "error_msg", +] + +_COMPANY_FORM_FIELD = [ + "is_company", + "company_register_number", + "company_name", + "company_email", + "confirm_email", + "email", + "firstname", + "lastname", + "birthdate", + "iban", + "share_product_id", + "address", + "city", + "zip_code", + "country_id", + "phone", + "lang", + "nb_parts", + "total_parts", + "error_msg", + "company_type", +] class WebsiteSubscription(http.Controller): - - @http.route(['/page/become_cooperator', - '/become_cooperator'], - type='http', auth="public", website=True) + @http.route( + ["/page/become_cooperator", "/become_cooperator"], + type="http", + auth="public", + website=True, + ) def display_become_cooperator_page(self, **kwargs): values = {} logged = False - if request.env.user.login != 'public': + if request.env.user.login != "public": logged = True partner = request.env.user.partner_id if partner.is_company: @@ -47,14 +87,17 @@ class WebsiteSubscription(http.Controller): values.update(kwargs=kwargs.items()) return request.render("easy_my_coop_website.becomecooperator", values) - @http.route(['/page/become_company_cooperator', - '/become_company_cooperator'], - type='http', auth="public", website=True) + @http.route( + ["/page/become_company_cooperator", "/become_company_cooperator"], + type="http", + auth="public", + website=True, + ) def display_become_company_cooperator_page(self, **kwargs): values = {} logged = False - if request.env.user.login != 'public': + if request.env.user.login != "public": logged = True values = self.fill_values(values, True, logged, True) @@ -62,15 +105,13 @@ class WebsiteSubscription(http.Controller): if kwargs.get(field): values[field] = kwargs.pop(field) values.update(kwargs=kwargs.items()) - return request.render("easy_my_coop_website.becomecompanycooperator", - values) + return request.render( + "easy_my_coop_website.becomecompanycooperator", values + ) def preRenderThanks(self, values, kwargs): """ Allow to be overrided """ - return { - '_values': values, - '_kwargs': kwargs, - } + return {"_values": values, "_kwargs": kwargs} def get_subscription_response(self, values, kwargs): values = self.preRenderThanks(values, kwargs) @@ -83,175 +124,198 @@ class WebsiteSubscription(http.Controller): def get_values_from_user(self, values, is_company): # the subscriber is connected - if request.env.user.login != 'public': - values['logged'] = 'on' + if request.env.user.login != "public": + values["logged"] = "on" partner = request.env.user.partner_id if partner.member or partner.old_member: - values['already_cooperator'] = 'on' + values["already_cooperator"] = "on" if partner.bank_ids: - values['iban'] = partner.bank_ids[0].acc_number - values['address'] = partner.street - values['zip_code'] = partner.zip - values['city'] = partner.city - values['country_id'] = partner.country_id.id + values["iban"] = partner.bank_ids[0].acc_number + values["address"] = partner.street + values["zip_code"] = partner.zip + values["city"] = partner.city + values["country_id"] = partner.country_id.id if is_company: # company values - values['company_register_number'] = partner.company_register_number - values['company_name'] = partner.name - values['company_email'] = partner.email - values['company_type'] = partner.legal_form + values[ + "company_register_number" + ] = partner.company_register_number + values["company_name"] = partner.name + values["company_email"] = partner.email + values["company_type"] = partner.legal_form # contact person values representative = partner.get_representative() - values['firstname'] = representative.firstname - values['lastname'] = representative.lastname - values['gender'] = representative.gender - values['email'] = representative.email - values['contact_person_function'] = representative.function - values['birthdate'] = self.get_date_string(representative.birthdate_date) - values['lang'] = representative.lang - values['phone'] = representative.phone + values["firstname"] = representative.firstname + values["lastname"] = representative.lastname + values["gender"] = representative.gender + values["email"] = representative.email + values["contact_person_function"] = representative.function + values["birthdate"] = self.get_date_string( + representative.birthdate_date + ) + values["lang"] = representative.lang + values["phone"] = representative.phone else: - values['firstname'] = partner.firstname - values['lastname'] = partner.lastname - values['email'] = partner.email - values['gender'] = partner.gender - values['birthdate'] = self.get_date_string(partner.birthdate_date) - values['lang'] = partner.lang - values['phone'] = partner.phone + values["firstname"] = partner.firstname + values["lastname"] = partner.lastname + values["email"] = partner.email + values["gender"] = partner.gender + values["birthdate"] = self.get_date_string( + partner.birthdate_date + ) + values["lang"] = partner.lang + values["phone"] = partner.phone return values def fill_values(self, values, is_company, logged, load_from_user=False): - sub_req_obj = request.env['subscription.request'] + sub_req_obj = request.env["subscription.request"] company = request.website.company_id products = self.get_products_share(is_company) if load_from_user: values = self.get_values_from_user(values, is_company) if is_company: - values['is_company'] = 'on' + values["is_company"] = "on" if logged: - values['logged'] = 'on' - values['countries'] = self.get_countries() - values['langs'] = self.get_langs() - values['products'] = products - fields_desc = sub_req_obj.sudo().fields_get(['company_type', 'gender']) - values['company_types'] = fields_desc['company_type']['selection'] - values['genders'] = fields_desc['gender']['selection'] - values['company'] = company - - if not values.get('share_product_id'): + values["logged"] = "on" + values["countries"] = self.get_countries() + values["langs"] = self.get_langs() + values["products"] = products + fields_desc = sub_req_obj.sudo().fields_get(["company_type", "gender"]) + values["company_types"] = fields_desc["company_type"]["selection"] + values["genders"] = fields_desc["gender"]["selection"] + values["company"] = company + + if not values.get("share_product_id"): for product in products: if product.default_share_product is True: - values['share_product_id'] = product.id + values["share_product_id"] = product.id break - if not values.get('share_product_id', False) and products: - values['share_product_id'] = products[0].id - if not values.get('country_id'): + if not values.get("share_product_id", False) and products: + values["share_product_id"] = products[0].id + if not values.get("country_id"): if company.default_country_id: - values['country_id'] = company.default_country_id.id + values["country_id"] = company.default_country_id.id else: - values['country_id'] = '21' - if not values.get('activities_country_id'): + values["country_id"] = "21" + if not values.get("activities_country_id"): if company.default_country_id: - values['activities_country_id'] = company.default_country_id.id + values["activities_country_id"] = company.default_country_id.id else: - values['activities_country_id'] = '21' - if not values.get('lang'): + values["activities_country_id"] = "21" + if not values.get("lang"): if company.default_lang_id: - values['lang'] = company.default_lang_id.code - - comp = request.env['res.company']._company_default_get() - values.update({ - 'display_data_policy': comp.display_data_policy_approval, - 'data_policy_required': comp.data_policy_approval_required, - 'data_policy_text': comp.data_policy_approval_text, - 'display_internal_rules': comp.display_internal_rules_approval, - 'internal_rules_required': comp.internal_rules_approval_required, - 'internal_rules_text': comp.internal_rules_approval_text, - }) + values["lang"] = company.default_lang_id.code + + comp = request.env["res.company"]._company_default_get() + values.update( + { + "display_data_policy": comp.display_data_policy_approval, + "data_policy_required": comp.data_policy_approval_required, + "data_policy_text": comp.data_policy_approval_text, + "display_internal_rules": comp.display_internal_rules_approval, + "internal_rules_required": comp.internal_rules_approval_required, + "internal_rules_text": comp.internal_rules_approval_text, + } + ) return values def get_products_share(self, is_company): - product_obj = request.env['product.template'] + product_obj = request.env["product.template"] products = product_obj.sudo().get_web_share_products(is_company) return products def get_countries(self): - countries = request.env['res.country'].sudo().search([]) + countries = request.env["res.country"].sudo().search([]) return countries def get_langs(self): - langs = request.env['res.lang'].sudo().search([]) + langs = request.env["res.lang"].sudo().search([]) return langs def get_selected_share(self, kwargs): - prod_obj = request.env['product.template'] + prod_obj = request.env["product.template"] product_id = kwargs.get("share_product_id") return prod_obj.sudo().browse(int(product_id)).product_variant_ids[0] def validation(self, kwargs, logged, values, post_file): - user_obj = request.env['res.users'] - sub_req_obj = request.env['subscription.request'] + user_obj = request.env["res.users"] + sub_req_obj = request.env["subscription.request"] redirect = "easy_my_coop_website.becomecooperator" - email = kwargs.get('email') - is_company = kwargs.get("is_company") == 'on' + email = kwargs.get("email") + is_company = kwargs.get("is_company") == "on" if is_company: is_company = True redirect = "easy_my_coop_website.becomecompanycooperator" - email = kwargs.get('company_email') + email = kwargs.get("company_email") - if 'g-recaptcha-response' not in kwargs or kwargs['g-recaptcha-response'] == '': + if ( + "g-recaptcha-response" not in kwargs + or kwargs["g-recaptcha-response"] == "" + ): values = self.fill_values(values, is_company, logged) values.update(kwargs) - values["error_msg"] = _("the captcha has not been validated," - " please fill in the captcha") + values["error_msg"] = _( + "the captcha has not been validated," + " please fill in the captcha" + ) return request.render(redirect, values) elif not request.website.is_captcha_valid( - kwargs['g-recaptcha-response']): + kwargs["g-recaptcha-response"] + ): values = self.fill_values(values, is_company, logged) values.update(kwargs) - values["error_msg"] = _("the captcha has not been validated," - " please fill in the captcha") + values["error_msg"] = _( + "the captcha has not been validated," + " please fill in the captcha" + ) return request.render(redirect, values) # Check that required field from model subscription_request exists required_fields = sub_req_obj.sudo().get_required_field() - error = set(field for field in required_fields if not values.get(field)) #noqa + error = { + field for field in required_fields if not values.get(field) + } # noqa if error: values = self.fill_values(values, is_company, logged) - values["error_msg"] = _("Some mandatory fields have not " - "been filled") + values["error_msg"] = _( + "Some mandatory fields have not " "been filled" + ) values = dict(values, error=error, kwargs=kwargs.items()) return request.render(redirect, values) if not logged and email: - user = user_obj.sudo().search([('login', '=', email)]) + user = user_obj.sudo().search([("login", "=", email)]) if user: values = self.fill_values(values, is_company, logged) values.update(kwargs) - values["error_msg"] = _("There is an existing account for this" - " mail address. Please login before " - "fill in the form") + values["error_msg"] = _( + "There is an existing account for this" + " mail address. Please login before " + "fill in the form" + ) return request.render(redirect, values) else: - confirm_email = kwargs.get('confirm_email') + confirm_email = kwargs.get("confirm_email") if email != confirm_email: values = self.fill_values(values, is_company, logged) values.update(kwargs) - values["error_msg"] = _("The email and the confirmation " - "email doesn't match.Please check " - "the given mail addresses") + values["error_msg"] = _( + "The email and the confirmation " + "email doesn't match.Please check " + "the given mail addresses" + ) return request.render(redirect, values) company = request.website.company_id @@ -259,8 +323,9 @@ class WebsiteSubscription(http.Controller): if not post_file: values = self.fill_values(values, is_company, logged) values.update(kwargs) - values["error_msg"] = _("You need to upload a" - " scan of your id card") + values["error_msg"] = _( + "You need to upload a" " scan of your id card" + ) return request.render(redirect, values) iban = kwargs.get("iban") @@ -268,8 +333,7 @@ class WebsiteSubscription(http.Controller): if not valid: values = self.fill_values(values, is_company, logged) - values["error_msg"] = _("You iban account number" - "is not valid") + values["error_msg"] = _("You iban account number" "is not valid") return request.render(redirect, values) # check the subscription's amount @@ -282,41 +346,50 @@ class WebsiteSubscription(http.Controller): share = self.get_selected_share(kwargs) if partner.cooperator_type != share.default_code: values = self.fill_values(values, is_company, logged) - values["error_msg"] = (_("You can't subscribe two " - "different types of share")) + values["error_msg"] = _( + "You can't subscribe two " + "different types of share" + ) return request.render(redirect, values) - total_amount = float(kwargs.get('total_parts')) + total_amount = float(kwargs.get("total_parts")) if max_amount > 0 and total_amount > max_amount: values = self.fill_values(values, is_company, logged) - values["error_msg"] = (_("You can't subscribe for an amount that " - "exceed ") - + str(max_amount) - + company.currency_id.symbol) + values["error_msg"] = ( + _("You can't subscribe for an amount that " "exceed ") + + str(max_amount) + + company.currency_id.symbol + ) return request.render(redirect, values) return True - @http.route(['/subscription/get_share_product'], - type='json', - auth="public", - methods=['POST'], website=True) + @http.route( + ["/subscription/get_share_product"], + type="json", + auth="public", + methods=["POST"], + website=True, + ) def get_share_product(self, share_product_id, **kw): - product_template = request.env['product.template'] + product_template = request.env["product.template"] product = product_template.sudo().browse(int(share_product_id)) return { product.id: { - 'list_price': product.list_price, - 'min_qty': product.minimum_quantity, - 'force_min_qty': product.force_min_qty - } + "list_price": product.list_price, + "min_qty": product.minimum_quantity, + "force_min_qty": product.force_min_qty, } + } - @http.route(['/subscription/subscribe_share'], - type='http', - auth="public", website=True) + @http.route( + ["/subscription/subscribe_share"], + type="http", + auth="public", + website=True, + ) def share_subscription(self, **kwargs): - sub_req_obj = request.env['subscription.request'] - attach_obj = request.env['ir.attachment'] + sub_req_obj = request.env["subscription.request"] + attach_obj = request.env["ir.attachment"] # List of file to add to ir_attachment once we have the ID post_file = [] @@ -325,17 +398,21 @@ class WebsiteSubscription(http.Controller): values = {} for field_name, field_value in kwargs.items(): - if hasattr(field_value, 'filename'): + if hasattr(field_value, "filename"): post_file.append(field_value) - elif (field_name in sub_req_obj._fields - and field_name not in _BLACKLIST): + elif ( + field_name in sub_req_obj._fields + and field_name not in _BLACKLIST + ): values[field_name] = field_value # allow to add some free fields or blacklisted field like ID elif field_name not in _TECHNICAL: - post_description.append("%s: %s" % (field_name, field_value)) + post_description.append( + "{}: {}".format(field_name, field_value) + ) - logged = kwargs.get("logged") == 'on' - is_company = kwargs.get("is_company") == 'on' + logged = kwargs.get("logged") == "on" + is_company = kwargs.get("is_company") == "on" response = self.validation(kwargs, logged, values, post_file) if response is not True: @@ -344,19 +421,19 @@ class WebsiteSubscription(http.Controller): already_coop = False if logged: partner = request.env.user.partner_id - values['partner_id'] = partner.id + values["partner_id"] = partner.id already_coop = partner.member - elif kwargs.get("already_cooperator") == 'on': + elif kwargs.get("already_cooperator") == "on": already_coop = True values["already_cooperator"] = already_coop values["is_company"] = is_company - if kwargs.get('data_policy_approved', 'off') == 'on': - values['data_policy_approved'] = True + if kwargs.get("data_policy_approved", "off") == "on": + values["data_policy_approved"] = True - if kwargs.get('internal_rules_approved', 'off') == 'on': - values['internal_rules_approved'] = True + if kwargs.get("internal_rules_approved", "off") == "on": + values["internal_rules_approved"] = True lastname = kwargs.get("lastname").upper() firstname = kwargs.get("firstname").title() @@ -364,17 +441,18 @@ class WebsiteSubscription(http.Controller): values["name"] = firstname + " " + lastname values["lastname"] = lastname values["firstname"] = firstname - values["birthdate"] = datetime.strptime(kwargs.get("birthdate"), - "%d/%m/%Y").date() + values["birthdate"] = datetime.strptime( + kwargs.get("birthdate"), "%d/%m/%Y" + ).date() values["source"] = "website" values["share_product_id"] = self.get_selected_share(kwargs).id if is_company: if kwargs.get("company_register_number", is_company): - values["company_register_number"] = re.sub('[^0-9a-zA-Z]+', - '', - kwargs.get("company_register_number")) + values["company_register_number"] = re.sub( + "[^0-9a-zA-Z]+", "", kwargs.get("company_register_number") + ) subscription_id = sub_req_obj.sudo().create_comp_sub_req(values) else: subscription_id = sub_req_obj.sudo().create(values) @@ -382,12 +460,12 @@ class WebsiteSubscription(http.Controller): if subscription_id: for field_value in post_file: attachment_value = { - 'name': field_value.filename, - 'res_name': field_value.filename, - 'res_model': 'subscription.request', - 'res_id': subscription_id, - 'datas': base64.encodestring(field_value.read()), - 'datas_fname': field_value.filename, + "name": field_value.filename, + "res_name": field_value.filename, + "res_model": "subscription.request", + "res_id": subscription_id, + "datas": base64.encodestring(field_value.read()), + "datas_fname": field_value.filename, } attach_obj.sudo().create(attachment_value) diff --git a/easy_my_coop_website_portal/__manifest__.py b/easy_my_coop_website_portal/__manifest__.py index 95345cf..f7da2c6 100644 --- a/easy_my_coop_website_portal/__manifest__.py +++ b/easy_my_coop_website_portal/__manifest__.py @@ -3,23 +3,16 @@ # - Houssine Bakkali # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Easy My Coop Website Portal', + "name": "Easy My Coop Website Portal", "version": "12.0.1.0.0", - 'depends': [ - 'easy_my_coop', - 'website', - 'account', - 'portal', - ], - 'description': """ + "depends": ["easy_my_coop", "website", "account", "portal"], + "summary": """ Show cooperator information in the website portal. """, - 'author': 'Coop IT Easy SCRLfs', - 'license': 'AGPL-3', - 'category': 'Cooperative Management', + "author": "Coop IT Easy SCRLfs", + "license": "AGPL-3", + "category": "Cooperative Management", "website": "www.coopiteasy.be", - 'data': [ - 'views/easy_my_coop_website_portal_templates.xml', - ], - 'installable': True, + "data": ["views/easy_my_coop_website_portal_templates.xml"], + "installable": True, } diff --git a/easy_my_coop_website_portal/controllers/main.py b/easy_my_coop_website_portal/controllers/main.py index 1d2b2b4..841a343 100644 --- a/easy_my_coop_website_portal/controllers/main.py +++ b/easy_my_coop_website_portal/controllers/main.py @@ -4,211 +4,263 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import _ from odoo.exceptions import AccessError, MissingError from odoo.fields import Date from odoo.http import request, route -from odoo import _ -from odoo.addons.portal.controllers.portal import CustomerPortal -from odoo.addons.portal.controllers.portal import pager as portal_pager from odoo.addons.payment.controllers.portal import PaymentProcessing +from odoo.addons.portal.controllers.portal import ( + CustomerPortal, + pager as portal_pager, +) class CooperatorPortalAccount(CustomerPortal): - CustomerPortal.MANDATORY_BILLING_FIELDS.extend(["iban", - "birthdate_date", - "gender"]) + CustomerPortal.MANDATORY_BILLING_FIELDS.extend( + ["iban", "birthdate_date", "gender"] + ) def _prepare_portal_layout_values(self): - values = super(CooperatorPortalAccount, - self)._prepare_portal_layout_values() + values = super( + CooperatorPortalAccount, self + )._prepare_portal_layout_values() # We assume that commercial_partner_id always point to the # partner itself or to the linked partner. So there is no # need to check if the partner is a "contact" or not. partner = request.env.user.partner_id coop = partner.commercial_partner_id - partner_obj = request.env['res.partner'] - coop_bank = request.env['res.partner.bank'].sudo().search( - [('partner_id', 'in', [coop.id])], - limit=1 + partner_obj = request.env["res.partner"] + coop_bank = ( + request.env["res.partner.bank"] + .sudo() + .search([("partner_id", "in", [coop.id])], limit=1) + ) + invoice_mgr = request.env["account.invoice"] + capital_request_count = invoice_mgr.search_count( + [ + ("state", "in", ["open", "paid", "cancelled"]), + # Get only the release capital request + ("release_capital_request", "=", True), + ] ) - invoice_mgr = request.env['account.invoice'] - capital_request_count = invoice_mgr.search_count([ - ('state', 'in', ['open', 'paid', 'cancelled']), - # Get only the release capital request - ('release_capital_request', '=', True), - ]) - invoice_count = invoice_mgr.search_count([ - ('release_capital_request', '=', False) - ]) - iban = '' + invoice_count = invoice_mgr.search_count( + [("release_capital_request", "=", False)] + ) + iban = "" if partner.bank_ids: iban = partner.bank_ids[0].acc_number - fields_desc = partner_obj.sudo().fields_get(['gender']) + fields_desc = partner_obj.sudo().fields_get(["gender"]) - values.update({ - 'coop': coop, - 'coop_bank': coop_bank, - 'capital_request_count': capital_request_count, - 'invoice_count': invoice_count, - 'iban': iban, - 'genders': fields_desc['gender']['selection'] - }) + values.update( + { + "coop": coop, + "coop_bank": coop_bank, + "capital_request_count": capital_request_count, + "invoice_count": invoice_count, + "iban": iban, + "genders": fields_desc["gender"]["selection"], + } + ) return values def details_form_validate(self, data): - error, error_message = super(CooperatorPortalAccount, - self).details_form_validate(data) - sub_req_obj = request.env['subscription.request'] + error, error_message = super( + CooperatorPortalAccount, self + ).details_form_validate(data) + sub_req_obj = request.env["subscription.request"] iban = data.get("iban") valid = sub_req_obj.check_iban(iban) if not valid: - error['iban'] = 'error' + error["iban"] = "error" error_message.append(_("You iban account number is not valid")) return error, error_message - @route(['/my/account'], type='http', auth='user', website=True) + @route(["/my/account"], type="http", auth="user", website=True) def account(self, redirect=None, **post): - res = super(CooperatorPortalAccount, self).account( - redirect, **post) - if not res.qcontext.get('error'): + res = super(CooperatorPortalAccount, self).account(redirect, **post) + if not res.qcontext.get("error"): partner = request.env.user.partner_id - partner_bank = request.env['res.partner.bank'] - iban = post.get('iban') + partner_bank = request.env["res.partner.bank"] + iban = post.get("iban") if iban: if partner.bank_ids: bank_account = partner.bank_ids[0] bank_account.acc_number = iban else: - partner_bank.sudo().create({ - 'partner_id': partner.id, - 'acc_number': iban - }) + partner_bank.sudo().create( + {"partner_id": partner.id, "acc_number": iban} + ) return res - @route(['/my/invoices', '/my/invoices/page/'], type='http', - auth="user", website=True) - def portal_my_invoices(self, page=1, date_begin=None, date_end=None, - sortby=None, **kw): + @route( + ["/my/invoices", "/my/invoices/page/"], + type="http", + auth="user", + website=True, + ) + def portal_my_invoices( + self, page=1, date_begin=None, date_end=None, sortby=None, **kw + ): res = super(CooperatorPortalAccount, self).portal_my_invoices( - page, date_begin, date_end, sortby, **kw) - invoice_obj = request.env['account.invoice'] + page, date_begin, date_end, sortby, **kw + ) + invoice_obj = request.env["account.invoice"] qcontext = res.qcontext if qcontext: - invoices = invoice_obj.search([('release_capital_request', '=', False)]) + invoices = invoice_obj.search( + [("release_capital_request", "=", False)] + ) invoice_count = len(invoices) - qcontext['invoices'] = invoices - qcontext['pager']['invoice_count'] = invoice_count + qcontext["invoices"] = invoices + qcontext["pager"]["invoice_count"] = invoice_count return res @route( - ['/my/release_capital_request', - '/my/release_capital_request/page/'], - type='http', auth="user", website=True) - def portal_my_release_capital_request(self, page=1, date_begin=None, - date_end=None, sortby=None, **kw): + [ + "/my/release_capital_request", + "/my/release_capital_request/page/", + ], + type="http", + auth="user", + website=True, + ) + def portal_my_release_capital_request( + self, page=1, date_begin=None, date_end=None, sortby=None, **kw + ): """Render a page with the list of release capital request. A release capital request is an invoice with a flag that tell if it's a capital request or not. """ values = self._prepare_portal_layout_values() partner = request.env.user.partner_id - invoice_mgr = request.env['account.invoice'] + invoice_mgr = request.env["account.invoice"] domain = [ - ('partner_id', 'in', - [partner.commercial_partner_id.id]), - ('state', 'in', ['open', 'paid', 'cancelled']), + ("partner_id", "in", [partner.commercial_partner_id.id]), + ("state", "in", ["open", "paid", "cancelled"]), # Get only the release capital request - ('release_capital_request', '=', True), + ("release_capital_request", "=", True), ] - archive_groups = self._get_archive_groups_sudo('account.invoice', - domain) + archive_groups = self._get_archive_groups_sudo( + "account.invoice", domain + ) if date_begin and date_end: - domain += [('create_date', '>=', date_begin), - ('create_date', '<', date_end)] + domain += [ + ("create_date", ">=", date_begin), + ("create_date", "<", date_end), + ] # count for pager capital_request_count = invoice_mgr.sudo().search_count(domain) # pager pager = portal_pager( url="/my/release_capital_request", - url_args={'date_begin': date_begin, 'date_end': date_end, - 'sortby': sortby}, + url_args={ + "date_begin": date_begin, + "date_end": date_end, + "sortby": sortby, + }, total=capital_request_count, page=page, - step=self._items_per_page + step=self._items_per_page, ) # content according to pager and archive selected invoices = invoice_mgr.sudo().search( - domain, limit=self._items_per_page, offset=pager['offset']) - values.update({ - 'date': date_begin, - 'capital_requests': invoices, - 'page_name': 'Release request', - 'pager': pager, - 'archive_groups': archive_groups, - 'default_url': '/my/release_capital_request', - }) + domain, limit=self._items_per_page, offset=pager["offset"] + ) + values.update( + { + "date": date_begin, + "capital_requests": invoices, + "page_name": "Release request", + "pager": pager, + "archive_groups": archive_groups, + "default_url": "/my/release_capital_request", + } + ) return request.render( - "easy_my_coop_website_portal.portal_my_capital_releases", - values + "easy_my_coop_website_portal.portal_my_capital_releases", values ) - @route(['/my/invoices/'], - type='http', auth="public", website=True) - def portal_my_invoice_detail(self, invoice_id, access_token=None, - report_type=None, download=False, **kw): + @route( + ["/my/invoices/"], + type="http", + auth="public", + website=True, + ) + def portal_my_invoice_detail( + self, + invoice_id, + access_token=None, + report_type=None, + download=False, + **kw + ): # override in order to not retrieve release capital request as invoices try: - invoice_sudo = self._document_check_access('account.invoice', - invoice_id, - access_token) + invoice_sudo = self._document_check_access( + "account.invoice", invoice_id, access_token + ) except (AccessError, MissingError): - return request.redirect('/my') + return request.redirect("/my") if invoice_sudo.release_capital_request: - report_ref = 'easy_my_coop.action_cooperator_invoices' + report_ref = "easy_my_coop.action_cooperator_invoices" else: - report_ref = 'account.account_invoices' - if report_type in ('html', 'pdf', 'text'): - return self._show_report(model=invoice_sudo, - report_type=report_type, - report_ref=report_ref, - download=download) - - values = self._invoice_get_page_view_values(invoice_sudo, access_token, - **kw) - PaymentProcessing.remove_payment_transaction(invoice_sudo.transaction_ids) + report_ref = "account.account_invoices" + if report_type in ("html", "pdf", "text"): + return self._show_report( + model=invoice_sudo, + report_type=report_type, + report_ref=report_ref, + download=download, + ) + + values = self._invoice_get_page_view_values( + invoice_sudo, access_token, **kw + ) + PaymentProcessing.remove_payment_transaction( + invoice_sudo.transaction_ids + ) return request.render("account.portal_invoice_page", values) - @route(['/my/cooperator_certificate/pdf'], - type='http', auth="user", website=True) + @route( + ["/my/cooperator_certificate/pdf"], + type="http", + auth="user", + website=True, + ) def get_cooperator_certificat(self, **kw): """Render the cooperator certificate pdf of the current user""" partner = request.env.user.partner_id return self._show_report( - model=partner, - report_type='pdf', - report_ref='easy_my_coop.action_cooperator_report_certificat', - download=True - ) + model=partner, + report_type="pdf", + report_ref="easy_my_coop.action_cooperator_report_certificat", + download=True, + ) def _render_pdf(self, pdf, filename): """Render a http response for a pdf""" pdfhttpheaders = [ - ('Content-Disposition', 'inline; filename="%s.pdf"' % filename), - ('Content-Type', 'application/pdf'), - ('Content-Length', len(pdf)) + ("Content-Disposition", 'inline; filename="%s.pdf"' % filename), + ("Content-Type", "application/pdf"), + ("Content-Length", len(pdf)), ] return request.make_response(pdf, headers=pdfhttpheaders) - def _get_archive_groups_sudo(self, model, domain=None, fields=None, - groupby="create_date", - order="create_date desc"): + def _get_archive_groups_sudo( + self, + model, + domain=None, + fields=None, + groupby="create_date", + order="create_date desc", + ): """Same as the one from website_portal_v10 except that it runs in root. """ @@ -217,10 +269,13 @@ class CooperatorPortalAccount(CustomerPortal): if domain is None: domain = [] if fields is None: - fields = ['name', 'create_date'] + fields = ["name", "create_date"] groups = [] - for group in request.env[model].sudo().read_group( - domain, fields=fields, groupby=groupby, orderby=order): + for group in ( + request.env[model] + .sudo() + .read_group(domain, fields=fields, groupby=groupby, orderby=order) + ): label = group[groupby] date_begin = date_end = None for leaf in group["__domain"]: @@ -229,10 +284,12 @@ class CooperatorPortalAccount(CustomerPortal): date_begin = leaf[2] elif leaf[1] == "<": date_end = leaf[2] - groups.append({ - 'date_begin': Date.to_string(Date.from_string(date_begin)), - 'date_end': Date.to_string(Date.from_string(date_end)), - 'name': label, - 'item_count': group[groupby + '_count'] - }) + groups.append( + { + "date_begin": Date.to_string(Date.from_string(date_begin)), + "date_end": Date.to_string(Date.from_string(date_end)), + "name": label, + "item_count": group[groupby + "_count"], + } + ) return groups diff --git a/easy_my_coop_website_taxshelter/__manifest__.py b/easy_my_coop_website_taxshelter/__manifest__.py index 8e69982..68524e3 100644 --- a/easy_my_coop_website_taxshelter/__manifest__.py +++ b/easy_my_coop_website_taxshelter/__manifest__.py @@ -3,27 +3,20 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Easy My Coop Tax Shelter Website', + "name": "Easy My Coop Tax Shelter Website", "version": "12.0.1.0.0", - 'depends': [ - 'website', - 'website_portal_v10', - 'easy_my_coop_taxshelter_report', - 'report', + "depends": [ + "website", + "website_portal_v10", + "easy_my_coop_taxshelter_report", + "report", ], - 'description': """ - Give access to Tax Shelter Report in the website portal. - """, - 'author': 'Coop IT Easy SCRLfs', - 'license': 'AGPL-3', - 'category': 'Cooperative Management', + "summary": "Give access to Tax Shelter Report in the website portal.", + "author": "Coop IT Easy SCRLfs", + "license": "AGPL-3", + "category": "Cooperative Management", "website": "www.coopiteasy.be", - - 'category': 'Cooperative Management', - - 'data': [ - 'views/easy_my_coop_website_taxshelter_templates.xml', - ], - 'installable': False, - 'application': False, + "data": ["views/easy_my_coop_website_taxshelter_templates.xml"], + "installable": False, + "application": False, } diff --git a/easy_my_coop_website_taxshelter/controllers/main.py b/easy_my_coop_website_taxshelter/controllers/main.py index 91497ab..3cf47d8 100644 --- a/easy_my_coop_website_taxshelter/controllers/main.py +++ b/easy_my_coop_website_taxshelter/controllers/main.py @@ -1,89 +1,93 @@ -# -*- coding: utf-8 -*- - # Copyright 2017-2018 Coop IT Easy SCRLfs # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from werkzeug.exceptions import Forbidden, NotFound - from openerp import http +from openerp.addons.website_portal_v10.controllers.main import WebsiteAccount from openerp.exceptions import AccessError, MissingError from openerp.http import request - -from openerp.addons.website_portal_v10.controllers.main import WebsiteAccount +from werkzeug.exceptions import Forbidden, NotFound class TaxShelterWebsiteAccount(WebsiteAccount): - @http.route() def account(self): """ Add Tax Shelter Certificate to main account page """ response = super(TaxShelterWebsiteAccount, self).account() partner = request.env.user.partner_id - tax_shelter_mgr = request.env['tax.shelter.certificate'] - tax_shelter_count = tax_shelter_mgr.sudo().search_count([ - ('partner_id', 'in', [partner.commercial_partner_id.id]), - ]) + tax_shelter_mgr = request.env["tax.shelter.certificate"] + tax_shelter_count = tax_shelter_mgr.sudo().search_count( + [("partner_id", "in", [partner.commercial_partner_id.id])] + ) - response.qcontext.update({ - 'tax_shelter_count': tax_shelter_count, - }) + response.qcontext.update({"tax_shelter_count": tax_shelter_count}) return response @http.route( - ['/my/tax_shelter_certificate', - '/my/tax_shelter_certificate/page/'], - type='http', auth="user", website=True) - def portal_my_tax_shelter_certificate(self, page=1, date_begin=None, - date_end=None, **kw): + [ + "/my/tax_shelter_certificate", + "/my/tax_shelter_certificate/page/", + ], + type="http", + auth="user", + website=True, + ) + def portal_my_tax_shelter_certificate( + self, page=1, date_begin=None, date_end=None, **kw + ): """Render a page that lits the tax shelter report: * Tax Shelter Certificates * Shares Certifcates """ values = self._prepare_portal_layout_values() partner = request.env.user.partner_id - tax_shelter_mgr = request.env['tax.shelter.certificate'] + tax_shelter_mgr = request.env["tax.shelter.certificate"] - domain = [ - ('partner_id', 'in', [partner.commercial_partner_id.id]), - ] + domain = [("partner_id", "in", [partner.commercial_partner_id.id])] if date_begin and date_end: - domain += [('create_date', '>=', date_begin), - ('create_date', '<', date_end)] + domain += [ + ("create_date", ">=", date_begin), + ("create_date", "<", date_end), + ] # count for pager tax_shelter_count = tax_shelter_mgr.sudo().search_count(domain) # pager pager = request.website.pager( url="/my/tax_shelter_certificate", - url_args={'date_begin': date_begin, 'date_end': date_end}, + url_args={"date_begin": date_begin, "date_end": date_end}, total=tax_shelter_count, page=page, - step=self._items_per_page + step=self._items_per_page, ) # content according to pager and archive selected tax_shelters = tax_shelter_mgr.sudo().search( - domain, limit=self._items_per_page, offset=pager['offset']) + domain, limit=self._items_per_page, offset=pager["offset"] + ) tax_shelters = tax_shelters.sorted( - key=lambda r: r.declaration_id.fiscal_year, - reverse=True + key=lambda r: r.declaration_id.fiscal_year, reverse=True + ) + values.update( + { + "date": date_begin, + "tax_shelters": tax_shelters, + "page_name": "invoice", + "pager": pager, + "default_url": "/my/tax_shelter_certificate", + } ) - values.update({ - 'date': date_begin, - 'tax_shelters': tax_shelters, - 'page_name': 'invoice', - 'pager': pager, - 'default_url': '/my/tax_shelter_certificate', - }) return request.website.render( - "easy_my_coop_website_taxshelter.portal_my_tax_shelter", - values + "easy_my_coop_website_taxshelter.portal_my_tax_shelter", values ) - @http.route(['/my/taxshelter_certificate/pdf/'], - type='http', auth="user", website=True) + @http.route( + ["/my/taxshelter_certificate/pdf/"], + type="http", + auth="user", + website=True, + ) def get_taxshelter_certificate_pdf(self, oid=-1): """Render the Tax Shelter Certificate pdf of the given Tax Shelter Report @@ -91,7 +95,7 @@ class TaxShelterWebsiteAccount(WebsiteAccount): # Get the subscription certificate and raise an error if the user # is not allowed to access to it or if the object is not found. partner = request.env.user.partner_id - tax_shelter_mgr = request.env['tax.shelter.certificate'] + tax_shelter_mgr = request.env["tax.shelter.certificate"] tax_shelter = tax_shelter_mgr.sudo().browse(oid) try: if tax_shelter.partner_id != partner: @@ -101,19 +105,22 @@ class TaxShelterWebsiteAccount(WebsiteAccount): except MissingError: raise NotFound() # Get the pdf - report_mgr = request.env['report'] + report_mgr = request.env["report"] pdf = report_mgr.sudo().get_pdf( tax_shelter, - 'easy_my_coop_taxshelter_report.tax_shelter_subscription_report' + "easy_my_coop_taxshelter_report.tax_shelter_subscription_report", ) - filename = "Tax Shelter Certificate - %s - %s" % ( - partner.name, - tax_shelter.declaration_id.fiscal_year + filename = "Tax Shelter Certificate - {} - {}".format( + partner.name, tax_shelter.declaration_id.fiscal_year ) return self._render_pdf(pdf, filename) - @http.route(['/my/share_certificate/pdf/'], - type='http', auth="user", website=True) + @http.route( + ["/my/share_certificate/pdf/"], + type="http", + auth="user", + website=True, + ) def get_share_certificate_pdf(self, oid=-1): """Render the Share Certificate pdf of the given Tax Shelter Report @@ -121,7 +128,7 @@ class TaxShelterWebsiteAccount(WebsiteAccount): # Get the share certificate and raise an error if the user # is not allowed to access to it or if the object is not found. partner = request.env.user.partner_id - tax_shelter_mgr = request.env['tax.shelter.certificate'] + tax_shelter_mgr = request.env["tax.shelter.certificate"] tax_shelter = tax_shelter_mgr.sudo().browse(oid) try: if tax_shelter.partner_id != partner: @@ -131,22 +138,21 @@ class TaxShelterWebsiteAccount(WebsiteAccount): except MissingError: raise NotFound() # Get the pdf - report_mgr = request.env['report'] + report_mgr = request.env["report"] pdf = report_mgr.sudo().get_pdf( tax_shelter, - 'easy_my_coop_taxshelter_report.tax_shelter_shares_report' + "easy_my_coop_taxshelter_report.tax_shelter_shares_report", ) - filename = "Share Certificate - %s - %s" % ( - partner.name, - tax_shelter.declaration_id.fiscal_year + filename = "Share Certificate - {} - {}".format( + partner.name, tax_shelter.declaration_id.fiscal_year ) return self._render_pdf(pdf, filename) def _render_pdf(self, pdf, filename): """Render a http response for a pdf""" pdfhttpheaders = [ - ('Content-Disposition', 'inline; filename="%s.pdf"' % filename), - ('Content-Type', 'application/pdf'), - ('Content-Length', len(pdf)) + ("Content-Disposition", 'inline; filename="%s.pdf"' % filename), + ("Content-Type", "application/pdf"), + ("Content-Length", len(pdf)), ] return request.make_response(pdf, headers=pdfhttpheaders) diff --git a/partner_age/__manifest__.py b/partner_age/__manifest__.py index a0b0a5b..3f16dae 100644 --- a/partner_age/__manifest__.py +++ b/partner_age/__manifest__.py @@ -5,18 +5,12 @@ { "name": "Partner Age", "version": "12.0.1.0.0", - "depends": [ - "easy_my_coop", - "partner_contact_birthdate"], + "depends": ["easy_my_coop", "partner_contact_birthdate"], "author": "Houssine BAKKALI ", "category": "Cooperative management", - 'website': "www.coopiteasy.be", + "website": "www.coopiteasy.be", "license": "AGPL-3", - "description": """ - This module computes the age of the partner. - """, - 'data': [ - 'view/partner_view.xml', - ], - 'installable': True, + "summary": "This module computes the age of the partner.", + "data": ["view/partner_view.xml"], + "installable": True, } diff --git a/partner_age/models/partner.py b/partner_age/models/partner.py index 5d27b53..d7ea53a 100644 --- a/partner_age/models/partner.py +++ b/partner_age/models/partner.py @@ -1,34 +1,41 @@ -from datetime import datetime -from openerp.tools import DEFAULT_SERVER_DATE_FORMAT as OE_DFORMAT - -from openerp import models, fields, api - - -class ResPartner(models.Model): - _inherit = 'res.partner' - - def _search_age(self, operator, value): - if operator not in ('=', '!=', '<', '<=', '>', '>=', 'in', 'not in'): - return [] - query = """SELECT id - FROM "%s" - WHERE extract(year from age(CURRENT_DATE, - birthdate_date)) %s %%s""" % \ - (self._table, operator) - self.env.cr.execute(query, (value,)) - ids = [t[0] for t in self.env.cr.fetchall()] - return [('id', 'in', ids)] - - @api.one - @api.depends('birthdate_date') - def _compute_age(self): - if self.birthdate_date: - dBday = datetime.strptime(str(self.birthdate_date), - OE_DFORMAT).date() - dToday = datetime.now().date() - self.age = dToday.year - dBday.year - (( - dToday.month, dToday.day) < (dBday.month, dBday.day)) - - age = fields.Integer(string='Age', - compute='_compute_age', - search='_search_age') +from datetime import datetime + +from openerp import api, fields, models +from openerp.tools import DEFAULT_SERVER_DATE_FORMAT as OE_DFORMAT + + +class ResPartner(models.Model): + _inherit = "res.partner" + + def _search_age(self, operator, value): + if operator not in ("=", "!=", "<", "<=", ">", ">=", "in", "not in"): + return [] + query = """SELECT id + FROM "%s" + WHERE extract(year from age(CURRENT_DATE, + birthdate_date)) %s %%s""" % ( + self._table, + operator, + ) + self.env.cr.execute(query, (value,)) + ids = [t[0] for t in self.env.cr.fetchall()] + return [("id", "in", ids)] + + @api.multi + @api.depends("birthdate_date") + def _compute_age(self): + self.ensure_one() + if self.birthdate_date: + dBday = datetime.strptime( + str(self.birthdate_date), OE_DFORMAT + ).date() + dToday = datetime.now().date() + self.age = ( + dToday.year + - dBday.year + - ((dToday.month, dToday.day) < (dBday.month, dBday.day)) + ) + + age = fields.Integer( + string="Age", compute="_compute_age", search="_search_age" + ) diff --git a/theme_light/__manifest__.py b/theme_light/__manifest__.py index 5c5f3e1..d4c1e44 100644 --- a/theme_light/__manifest__.py +++ b/theme_light/__manifest__.py @@ -2,21 +2,15 @@ # - Houssine BAKKALI - # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { - 'name': 'Theme light', - 'description': 'extract of the theme zen', - 'category': 'Website', - 'version': '12.0.1.0.0', - 'author': 'Benjamin Dugardin', - 'author': 'Houssine BAKKALI', - 'website': "www.coopiteasy.be", - 'depends': ['base', - 'web', - 'website_theme_install' - ], - 'data': [ - 'views/layout_template.xml', - 'report/header_report_G002.xml', - ], - 'installable': True, - 'application': True, + "name": "Theme light", + "summary": "extract of the theme zen", + "license": "AGPL-3", + "category": "Website", + "version": "12.0.1.0.0", + "author": "Benjamin Dugardin," "Houssine BAKKALI," "Coop IT Easy SCRLfs", + "website": "www.coopiteasy.be", + "depends": ["base", "web", "website_theme_install"], + "data": ["views/layout_template.xml", "report/header_report_G002.xml"], + "installable": True, + "application": True, } diff --git a/website_recaptcha_reloaded/__manifest__.py b/website_recaptcha_reloaded/__manifest__.py index a0f5ea9..73bc5c2 100644 --- a/website_recaptcha_reloaded/__manifest__.py +++ b/website_recaptcha_reloaded/__manifest__.py @@ -1,26 +1,14 @@ # Copyright 2004 Tech-Receptives Solutions Pvt. Ltd. # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { - 'name': 'Website reCAPTCHA Reloaded', - 'version': '12.0.0.1', - 'category': 'Website', - 'depends': ['website'], - 'author': 'Tech Receptives', - 'license': 'AGPL-3', - 'website': 'https://www.techreceptives.com', - 'description': """ - Odoo Website reCAPTCHA Reloaded - ================================ - This modules allows you to integrate Google reCAPTCHA v2.0 to your website - forms. You can configure your Google reCAPTCHA site and public keys - in "Settings" -> "Website Settings" - - You will need to install various website__recaptcha modules - to use it in your various pages. - """, - 'data': [ - 'views/website_view.xml', - 'views/res_config.xml', - ], - 'installable': True, + "name": "Website reCAPTCHA Reloaded", + "version": "12.0.0.0.1", + "category": "Website", + "depends": ["website"], + "author": "Tech Receptives", + "license": "AGPL-3", + "website": "https://www.techreceptives.com", + "summary": "Add google recaptcha to forms.", + "data": ["views/website_view.xml", "views/res_config.xml"], + "installable": True, } diff --git a/website_recaptcha_reloaded/models/res_config.py b/website_recaptcha_reloaded/models/res_config.py index 4f38a4f..d2debfb 100644 --- a/website_recaptcha_reloaded/models/res_config.py +++ b/website_recaptcha_reloaded/models/res_config.py @@ -4,25 +4,23 @@ from odoo import api, fields, models -class website_config_settings(models.TransientModel): - _inherit = 'res.config.settings' +class WebsiteConfigSettings(models.TransientModel): + _inherit = "res.config.settings" recaptcha_key_site = fields.Char( - related='website_id.recaptcha_key_site', - readonly=False, + related="website_id.recaptcha_key_site", readonly=False ) recaptcha_key_secret = fields.Char( - related='website_id.recaptcha_key_secret', - readonly=False, + related="website_id.recaptcha_key_secret", readonly=False ) has_google_recaptcha = fields.Boolean( - 'Google reCaptcha', - compute='_compute_has_google_recaptcha', - inverse='_inverse_has_google_recaptcha', + "Google reCaptcha", + compute="_compute_has_google_recaptcha", + inverse="_inverse_has_google_recaptcha", readonly=False, ) - @api.depends('website_id') + @api.depends("website_id") def _compute_has_google_recaptcha(self): self.has_google_recaptcha = bool(self.recaptcha_key_site) diff --git a/website_recaptcha_reloaded/website.py b/website_recaptcha_reloaded/website.py index 8ba7217..b39cfe6 100644 --- a/website_recaptcha_reloaded/website.py +++ b/website_recaptcha_reloaded/website.py @@ -1,15 +1,16 @@ # Copyright 2019 Simone Orsi - Camptocamp SA # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import api, fields, models, _ -from odoo.exceptions import ValidationError import requests -URL = 'https://www.google.com/recaptcha/api/siteverify' +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + +URL = "https://www.google.com/recaptcha/api/siteverify" class Website(models.Model): - _inherit = 'website' + _inherit = "website" recaptcha_key_site = fields.Char() recaptcha_key_secret = fields.Char() @@ -17,27 +18,31 @@ class Website(models.Model): @api.model def _get_error_message(self, errorcode=None): mapping = { - 'missing-input-secret': _('The secret parameter is missing.'), - 'invalid-input-secret': - _('The secret parameter is invalid or malformed.'), - 'missing-input-response': _('The response parameter is missing.'), - 'invalid-input-response': - _('The response parameter is invalid or malformed.'), + "missing-input-secret": _("The secret parameter is missing."), + "invalid-input-secret": _( + "The secret parameter is invalid or malformed." + ), + "missing-input-response": _("The response parameter is missing."), + "invalid-input-response": _( + "The response parameter is invalid or malformed." + ), } - return mapping.get(errorcode, _('There was a problem with ' - 'the captcha entry.')) + return mapping.get( + errorcode, _("There was a problem with " "the captcha entry.") + ) def is_captcha_valid(self, response): - get_res = {'secret': self.recaptcha_key_secret, - 'response': response} + get_res = {"secret": self.recaptcha_key_secret, "response": response} res = requests.post(URL, data=get_res).json() - error_msg = "\n".join(self._get_error_message(error) - for error in res.get('error-codes', [])) + error_msg = "\n".join( + self._get_error_message(error) + for error in res.get("error-codes", []) + ) if error_msg: raise ValidationError(error_msg) - if not res.get('success'): + if not res.get("success"): raise ValidationError(self._get_error_message()) return True From 4053d6a88ad174c2241fc3c1a352387176fedd01 Mon Sep 17 00:00:00 2001 From: "robin.keunen" Date: Tue, 21 Apr 2020 19:48:57 +0200 Subject: [PATCH 11/29] automatic fixes --- easy_my_coop/__init__.py | 6 +- easy_my_coop/data/easy_my_coop_data.xml | 86 +- easy_my_coop/data/mail_template_data.xml | 886 +++--- easy_my_coop/demo/coop.xml | 2 +- easy_my_coop/models/mail_template.py | 2 +- easy_my_coop/models/operation_request.py | 22 +- easy_my_coop/readme/CONTRIBUTORS.rst | 1 - .../report/cooperator_register_G001.xml | 92 +- .../report/cooperator_subscription_G001.xml | 82 +- easy_my_coop/report/easy_my_coop_report.xml | 38 +- easy_my_coop/security/ir.model.access.csv | 32 +- easy_my_coop/static/src/css/coop_report.css | 54 +- easy_my_coop/static/src/js/easy_my_coop.js | 50 +- .../static/src/js/jquery.inputmask.bundle.js | 2720 ++++++++++------- easy_my_coop/views/account_invoice_view.xml | 146 +- easy_my_coop/views/account_journal_view.xml | 52 +- .../views/cooperator_register_view.xml | 154 +- easy_my_coop/views/email_template_view.xml | 30 +- easy_my_coop/views/operation_request_view.xml | 210 +- easy_my_coop/views/product_view.xml | 306 +- easy_my_coop/views/res_company_view.xml | 68 +- easy_my_coop/views/res_partner_view.xml | 12 +- .../views/subscription_request_view.xml | 402 +-- .../wizard/cooperative_history_wizard.xml | 6 +- easy_my_coop/wizard/update_share_line.xml | 72 +- easy_my_coop_be/__init__.py | 2 +- easy_my_coop_be/models/__init__.py | 4 +- easy_my_coop_be/readme/CONTRIBUTORS.rst | 1 - easy_my_coop_ch/__init__.py | 2 +- easy_my_coop_ch/models/__init__.py | 4 +- .../views/subscription_template.xml | 52 +- easy_my_coop_dividend/__init__.py | 1 - easy_my_coop_dividend/models/__init__.py | 1 - easy_my_coop_dividend/readme/CONTRIBUTORS.rst | 1 - .../security/ir.model.access.csv | 2 +- .../views/dividend_views.xml | 328 +- easy_my_coop_eater/__init__.py | 2 +- easy_my_coop_eater/models/__init__.py | 4 +- easy_my_coop_eater/models/coop.py | 58 +- easy_my_coop_eater/models/product.py | 20 +- easy_my_coop_eater/view/product_view.xml | 26 +- easy_my_coop_export_xlsx/__init__.py | 1 - .../readme/CONTRIBUTORS.rst | 1 - easy_my_coop_export_xlsx/wizard/__init__.py | 1 - .../wizard/export_global_wizard.xml | 2 +- easy_my_coop_fr/__init__.py | 2 +- easy_my_coop_fr/models/__init__.py | 4 +- easy_my_coop_fr/readme/CONTRIBUTORS.rst | 1 - .../views/certificate_template.xml | 98 +- easy_my_coop_fr/views/layout_template.xml | 27 +- .../views/subscription_template.xml | 28 +- easy_my_coop_loan/__init__.py | 2 +- easy_my_coop_loan/readme/CONTRIBUTORS.rst | 1 - .../security/ir.model.access.csv | 14 +- easy_my_coop_loan/views/loan_view.xml | 2 +- easy_my_coop_loan/views/partner_view.xml | 102 +- easy_my_coop_loan_website/__init__.py | 2 +- .../controllers/__init__.py | 2 +- .../data/website_loan_data.xml | 32 +- .../readme/CONTRIBUTORS.rst | 1 - .../static/src/js/loan_issue.js | 18 +- .../template/loan_issue_template.xml | 108 +- .../readme/CONTRIBUTORS.rst | 1 - easy_my_coop_website/__init__.py | 2 +- easy_my_coop_website/readme/CONTRIBUTORS.rst | 1 - .../views/subscription_template.xml | 232 +- easy_my_coop_website_portal/__init__.py | 1 - .../controllers/__init__.py | 1 - .../readme/CONTRIBUTORS.rst | 1 - .../easy_my_coop_website_portal_templates.xml | 4 +- easy_my_coop_website_taxshelter/__init__.py | 1 - .../controllers/__init__.py | 1 - .../readme/CONTRIBUTORS.rst | 1 - partner_age/__init__.py | 2 +- partner_age/models/__init__.py | 2 +- partner_age/readme/CONTRIBUTORS.rst | 1 - partner_age/view/partner_view.xml | 48 +- theme_light/readme/CONTRIBUTORS.rst | 1 - theme_light/report/header_report_G002.xml | 66 +- theme_light/static/css/global_theme.sass | 4 +- theme_light/static/css/invoice_B001.css | 26 +- theme_light/static/css/invoice_B002.css | 32 +- theme_light/static/css/invoice_G001.css | 26 +- theme_light/static/css/invoice_G002.css | 48 +- theme_light/static/css/invoice_O002.css | 32 +- theme_light/static/css/invoice_P002.css | 42 +- theme_light/static/css/invoice_orange.css | 26 +- theme_light/static/css/mail_template_B001.css | 30 +- theme_light/static/css/theme_zen_black.css | 12 +- theme_light/static/css/theme_zen_blue.css | 42 +- theme_light/static/css/theme_zen_brown.css | 12 +- theme_light/static/css/theme_zen_green.css | 30 +- theme_light/static/css/theme_zen_orange.css | 70 +- theme_light/static/css/theme_zen_purple.css | 44 +- theme_light/static/css/theme_zen_red.css | 12 +- theme_light/static/css/theme_zen_white.css | 177 +- theme_light/static/css/theme_zen_yellow.css | 12 +- theme_light/views/layout_template.xml | 411 ++- .../readme/CONTRIBUTORS.rst | 1 - .../views/res_config.xml | 2 +- .../views/website_view.xml | 4 +- 101 files changed, 4138 insertions(+), 3811 deletions(-) diff --git a/easy_my_coop/__init__.py b/easy_my_coop/__init__.py index 28aa8a4..7660e7b 100644 --- a/easy_my_coop/__init__.py +++ b/easy_my_coop/__init__.py @@ -1,3 +1,3 @@ -from . import models -from . import report -from . import wizard +from . import models +from . import report +from . import wizard diff --git a/easy_my_coop/data/easy_my_coop_data.xml b/easy_my_coop/data/easy_my_coop_data.xml index 9cb4333..3f80622 100644 --- a/easy_my_coop/data/easy_my_coop_data.xml +++ b/easy_my_coop/data/easy_my_coop_data.xml @@ -1,43 +1,43 @@ - - - - - Cooperative Management - Manage your cooperative. - 3 - - - - - Company Share - - - - Account Default Subscription Journal - - SUBJ/%(year)s/ - True - - - - Subscription Journal - SUBJ - sale - - - - - Subscription Register - subscription.register - - - - - - Register Operation - register.operation - - - - - + + + + + Cooperative Management + Manage your cooperative. + 3 + + + + + Company Share + + + + Account Default Subscription Journal + + SUBJ/%(year)s/ + True + + + + Subscription Journal + SUBJ + sale + + + + + Subscription Register + subscription.register + + + + + + Register Operation + register.operation + + + + + diff --git a/easy_my_coop/data/mail_template_data.xml b/easy_my_coop/data/mail_template_data.xml index 0fe4d8f..24aeed0 100644 --- a/easy_my_coop/data/mail_template_data.xml +++ b/easy_my_coop/data/mail_template_data.xml @@ -1,443 +1,443 @@ - - - - - - - Request to Release Capital - Send by Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - ${object.company_id.name} Request to Release Capital (Ref ${object.number or 'n/a'}) - ${object.partner_id.id} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - - ${(object.number or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''} - ${object.partner_id.lang} - - - -

Hello ${object.partner_id.name},

- -

You will find in attachment all the necessary information for the payment. We kindly remind you that your subscription will be effective only once we received the payment.

- -

Do not forget to add the structured communication to the payment.

- -

Sustainably your,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
- - - Confirmation Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - Subscription request confirmation - ${object.email} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - ${object.lang} - - - -

Hello ${object.name},

- -

Your request will be soon processed by our team. If all the provided info are correct you will soon receive the payment information in another email

- -
-

If you have any question, do not hesitate to contact us.

-
- -

Sustainably your,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
- - - Waiting List Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - Subscription request added on waiting list. - ${object.email} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - ${object.lang} - - - -

Hello ${object.name},

- -

Thank you for your subscription request. There are currently no project to raise funds for, thus we added it on waiting list. - We will contact you as soon as the subscription requests are re-opened. -

- -
-

If you have any question, do not hesitate to contact us.

-
- -

Sustainably yours,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
- - - Company Confirmation Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - Subscription request confirmation - ${object.email},${object.company_email} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - ${object.lang} - - - -

Hello ${object.name},

- -

We have received your subscription request for ${object.company_id.name}. Thank you for your support.

- -

Your request will be soon processed by our team "gestion et participation des membres". If all the provided info are correct you will soon receive the payment information in another email

- -
-

If you have any question, do not hesitate to contact us.

-
- -

Sustainably your,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
- - - Payment Received Confirmation - Send By Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - Payment Received Confirmation - ${object.id} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - - Certificat ${(object.cooperator_register_number or '')} - ${object.lang} - - - -

Hello ${object.name},

- -

We confirm the reception of you payment. You are now shareholder of our cooperative

- -
-

Find in attachment your ${object.company_id.name} certificate.

-

Thank you for choosing ${object.company_id.name or 'us'}!

-
-

Sustainably your,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
- - - Share Increase - Payment Received Confirmation - Send By Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - Payment Received Confirmation - ${object.id} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - - Certificat ${(object.cooperator_register_number or '')} - ${object.lang} - - - -

Hello ${object.name},

- -

We confirm the reception of you payment for the new share(s) you have taken.

- -
-

Find in attachment your ${object.company_id.name} certificate.

-

Thank you for trusting ${object.company_id.name or 'us'}!

-
-

Sustainably your,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
- - - Share transfer - Send By Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - Share transfert - ${object.id} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - - Certificat ${(object.cooperator_register_number or '')} - ${object.lang} - - - -

Hello ${object.name},

- -

We confirm you that the shares have been transfered to you. If you was not already cooperator, you are now shareholder of our cooperative

- -
-

Find in attachment your ${object.company_id.name} certificate.

-

Thank you for choosing ${object.company_id.name or 'us'}!

-
-

Sustainably your,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
- - - Share update - Send By Email - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - Share update - ${object.id} - ${(object.company_id.coop_email_contact or object.user_id.email)|safe} - - - - Certificat ${(object.cooperator_register_number or '')} - ${object.lang} - - - -

Hello ${object.name},

- -

We confirm you that the adaptation on shares portfolio has been succesfully performed. Your cooperator certificate has been adapted accordingly

- -
-

Find in attachment your ${object.company_id.name} certificate.

-

Thank you for choosing ${object.company_id.name or 'us'}!

-
-

Sustainably your,

-

${object.company_id.name}.

- - % if object.company_id.street: - ${object.company_id.street} - % endif - % if object.company_id.street2: - ${object.company_id.street2}
- % endif - % if object.company_id.city or object.company_id.zip: - ${object.company_id.zip} ${object.company_id.city}
- % endif - % if object.company_id.country_id: - ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
- % endif - % if object.company_id.phone: - Phone:  ${object.company_id.phone} - % endif - - % if object.company_id.website: - - %endif - -
- -
- - ]]>
-
-
-
+ + + + + + + Request to Release Capital - Send by Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + ${object.company_id.name} Request to Release Capital (Ref ${object.number or 'n/a'}) + ${object.partner_id.id} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + + ${(object.number or '').replace('/','_')}_${object.state == 'draft' and 'draft' or ''} + ${object.partner_id.lang} + + + +

Hello ${object.partner_id.name},

+ +

You will find in attachment all the necessary information for the payment. We kindly remind you that your subscription will be effective only once we received the payment.

+ +

Do not forget to add the structured communication to the payment.

+ +

Sustainably your,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+ + + Confirmation Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + Subscription request confirmation + ${object.email} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + ${object.lang} + + + +

Hello ${object.name},

+ +

Your request will be soon processed by our team. If all the provided info are correct you will soon receive the payment information in another email

+ +
+

If you have any question, do not hesitate to contact us.

+
+ +

Sustainably your,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+ + + Waiting List Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + Subscription request added on waiting list. + ${object.email} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + ${object.lang} + + + +

Hello ${object.name},

+ +

Thank you for your subscription request. There are currently no project to raise funds for, thus we added it on waiting list. + We will contact you as soon as the subscription requests are re-opened. +

+ +
+

If you have any question, do not hesitate to contact us.

+
+ +

Sustainably yours,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+ + + Company Confirmation Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + Subscription request confirmation + ${object.email},${object.company_email} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + ${object.lang} + + + +

Hello ${object.name},

+ +

We have received your subscription request for ${object.company_id.name}. Thank you for your support.

+ +

Your request will be soon processed by our team "gestion et participation des membres". If all the provided info are correct you will soon receive the payment information in another email

+ +
+

If you have any question, do not hesitate to contact us.

+
+ +

Sustainably your,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+ + + Payment Received Confirmation - Send By Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + Payment Received Confirmation + ${object.id} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + + Certificat ${(object.cooperator_register_number or '')} + ${object.lang} + + + +

Hello ${object.name},

+ +

We confirm the reception of you payment. You are now shareholder of our cooperative

+ +
+

Find in attachment your ${object.company_id.name} certificate.

+

Thank you for choosing ${object.company_id.name or 'us'}!

+
+

Sustainably your,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+ + + Share Increase - Payment Received Confirmation - Send By Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + Payment Received Confirmation + ${object.id} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + + Certificat ${(object.cooperator_register_number or '')} + ${object.lang} + + + +

Hello ${object.name},

+ +

We confirm the reception of you payment for the new share(s) you have taken.

+ +
+

Find in attachment your ${object.company_id.name} certificate.

+

Thank you for trusting ${object.company_id.name or 'us'}!

+
+

Sustainably your,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+ + + Share transfer - Send By Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + Share transfert + ${object.id} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + + Certificat ${(object.cooperator_register_number or '')} + ${object.lang} + + + +

Hello ${object.name},

+ +

We confirm you that the shares have been transfered to you. If you was not already cooperator, you are now shareholder of our cooperative

+ +
+

Find in attachment your ${object.company_id.name} certificate.

+

Thank you for choosing ${object.company_id.name or 'us'}!

+
+

Sustainably your,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+ + + Share update - Send By Email + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + Share update + ${object.id} + ${(object.company_id.coop_email_contact or object.user_id.email)|safe} + + + + Certificat ${(object.cooperator_register_number or '')} + ${object.lang} + + + +

Hello ${object.name},

+ +

We confirm you that the adaptation on shares portfolio has been succesfully performed. Your cooperator certificate has been adapted accordingly

+ +
+

Find in attachment your ${object.company_id.name} certificate.

+

Thank you for choosing ${object.company_id.name or 'us'}!

+
+

Sustainably your,

+

${object.company_id.name}.

+ + % if object.company_id.street: + ${object.company_id.street} + % endif + % if object.company_id.street2: + ${object.company_id.street2}
+ % endif + % if object.company_id.city or object.company_id.zip: + ${object.company_id.zip} ${object.company_id.city}
+ % endif + % if object.company_id.country_id: + ${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}
+ % endif + % if object.company_id.phone: + Phone:  ${object.company_id.phone} + % endif + + % if object.company_id.website: + + %endif + +
+ +
+ + ]]>
+
+
+
diff --git a/easy_my_coop/demo/coop.xml b/easy_my_coop/demo/coop.xml index 1a164f1..d7b784c 100644 --- a/easy_my_coop/demo/coop.xml +++ b/easy_my_coop/demo/coop.xml @@ -68,7 +68,7 @@ 5101
- + 416101 Cooperators diff --git a/easy_my_coop/models/mail_template.py b/easy_my_coop/models/mail_template.py index b78c7f7..c120428 100644 --- a/easy_my_coop/models/mail_template.py +++ b/easy_my_coop/models/mail_template.py @@ -1,4 +1,4 @@ -from odoo import models, fields +from odoo import fields, models class MailTemplate(models.Model): diff --git a/easy_my_coop/models/operation_request.py b/easy_my_coop/models/operation_request.py index 730ef6e..d608128 100644 --- a/easy_my_coop/models/operation_request.py +++ b/easy_my_coop/models/operation_request.py @@ -376,10 +376,10 @@ class OperationRequest(models.Model): partner = self.subscription_request.create_coop_partner() # get cooperator number sub_reg_num = int(sequence_id.next_by_id()) - partner_vals.update(sub_request.get_eater_vals( - partner, - self.share_product_id)) - partner_vals['cooperator_register_number'] = sub_reg_num + partner_vals.update( + sub_request.get_eater_vals(partner, self.share_product_id) + ) + partner_vals["cooperator_register_number"] = sub_reg_num partner.write(partner_vals) self.partner_id_to = partner else: @@ -387,11 +387,15 @@ class OperationRequest(models.Model): if not self.partner_id_to.member: if self.partner_id_to.cooperator_register_number == 0: sub_reg_num = int(sequence_id.next_by_id()) - partner_vals['cooperator_register_number'] = sub_reg_num - partner_vals.update(sub_request.get_eater_vals( - self.partner_id_to, - self.share_product_id)) - partner_vals['old_member'] = False + partner_vals[ + "cooperator_register_number" + ] = sub_reg_num + partner_vals.update( + sub_request.get_eater_vals( + self.partner_id_to, self.share_product_id + ) + ) + partner_vals["old_member"] = False self.partner_id_to.write(partner_vals) # remove the parts to the giver self.hand_share_over( diff --git a/easy_my_coop/readme/CONTRIBUTORS.rst b/easy_my_coop/readme/CONTRIBUTORS.rst index cd0a487..b2844f3 100644 --- a/easy_my_coop/readme/CONTRIBUTORS.rst +++ b/easy_my_coop/readme/CONTRIBUTORS.rst @@ -1,2 +1 @@ * Coop IT Easy SCRLfs - diff --git a/easy_my_coop/report/cooperator_register_G001.xml b/easy_my_coop/report/cooperator_register_G001.xml index 781230d..6bc790b 100644 --- a/easy_my_coop/report/cooperator_register_G001.xml +++ b/easy_my_coop/report/cooperator_register_G001.xml @@ -4,39 +4,39 @@ - - - + + +
- + -




+




- + - +
- COOPERATOR REGISTER -
+ COOPERATOR REGISTER +
-




+




+ - - - - +
+ + - +
@@ -46,76 +46,76 @@ - - + + - -
-
+
+
+
- - -
+ +
- - - -
-
+
+
- - -
+
- - - -
NumberQuantity Total
- + - + + - + + + + + t-field-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/> - + + - + + - + + - + + + + t-field-options='{"widget": "monetary", "display_currency": "res_company.currency_id"}'/>
-
+ +
- + diff --git a/easy_my_coop/report/cooperator_subscription_G001.xml b/easy_my_coop/report/cooperator_subscription_G001.xml index 29f1313..70286e6 100644 --- a/easy_my_coop/report/cooperator_subscription_G001.xml +++ b/easy_my_coop/report/cooperator_subscription_G001.xml @@ -5,102 +5,102 @@ - - - + + +
- + -




- +




+ - + - +
- SUBSCRIPTION REGISTER -
+ SUBSCRIPTION REGISTER +
-




- - +




+ +

- + - +

-

-
+
+
- - - - + -
+
- - - - +

-
Operation number Cooperator Subscription date Operation typeShare numberShare number
- + - + + - + + - + + - + - + + - + + - + +
- - +
+ +
- + -
TOTAL :
-
+ +
- + diff --git a/easy_my_coop/report/easy_my_coop_report.xml b/easy_my_coop/report/easy_my_coop_report.xml index c138c21..6e2dac7 100644 --- a/easy_my_coop/report/easy_my_coop_report.xml +++ b/easy_my_coop/report/easy_my_coop_report.xml @@ -2,8 +2,8 @@ - - - + - + diff --git a/easy_my_coop/security/ir.model.access.csv b/easy_my_coop/security/ir.model.access.csv index f4a1de4..4b48364 100644 --- a/easy_my_coop/security/ir.model.access.csv +++ b/easy_my_coop/security/ir.model.access.csv @@ -1,16 +1,16 @@ -id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_product_product_easy_my_coop_user,access_product_product_easy_my_coop_user,product.model_product_product,group_easy_my_coop_user,1,1,0,0 -access_product_product_easy_my_coop_manager,access_product_product_easy_my_coop_manager,product.model_product_product,group_easy_my_coop_manager,1,1,1,1 -access_product_template_easy_my_coop_user,access_product_template_easy_my_coop_user,product.model_product_template,group_easy_my_coop_user,1,1,0,0 -access_product_template_easy_my_coop_manager,access_product_template_easy_my_coop_manager,product.model_product_template,group_easy_my_coop_manager,1,1,1,1 -access_subscription_request_user,access_subscription_request_user.subscription,model_subscription_request,base.group_user,1,0,0,0 -access_subscription_request_easy_my_coop_user,access_subscription_request_easy_my_coop_user,model_subscription_request,group_easy_my_coop_user,1,1,1,0 -access_subscription_request_easy_my_coop_manager,access_subscription_request_easy_my_coop_manager,model_subscription_request,group_easy_my_coop_manager,1,1,1,1 -access_share_line_user,access_share_line_user,model_share_line,base.group_user,1,0,0,0 -access_share_line_easy_my_coop_user,access_share_line_easy_my_coop_user,model_share_line,group_easy_my_coop_user,1,1,1,0 -access_share_line_easy_my_coop_manager,access_share_line_easy_my_coop_manager,model_share_line,group_easy_my_coop_manager,1,1,1,1 -access_res_partner_easy_my_coop_user,access_res_partner_easy_my_coop_user,base.model_res_partner,group_easy_my_coop_user,1,1,1,0 -access_account_invoice_easy_my_coop_user,access_account_invoice_easy_my_coop_user,model_account_invoice,group_easy_my_coop_user,1,1,1,0 -access_subscription_register_easy_my_coop_user,access_subscription_register_easy_my_coop_user,model_subscription_register,group_easy_my_coop_user,1,1,1,0 -access_operation_request_easy_my_coop_user,access_operation_request_easy_my_coop_user,model_operation_request,group_easy_my_coop_user,1,1,1,0 -access_operation_request_easy_my_coop_manager,access_operation_request_easy_my_coop_manager,model_operation_request,group_easy_my_coop_manager,1,1,1,1 +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_product_product_easy_my_coop_user,access_product_product_easy_my_coop_user,product.model_product_product,group_easy_my_coop_user,1,1,0,0 +access_product_product_easy_my_coop_manager,access_product_product_easy_my_coop_manager,product.model_product_product,group_easy_my_coop_manager,1,1,1,1 +access_product_template_easy_my_coop_user,access_product_template_easy_my_coop_user,product.model_product_template,group_easy_my_coop_user,1,1,0,0 +access_product_template_easy_my_coop_manager,access_product_template_easy_my_coop_manager,product.model_product_template,group_easy_my_coop_manager,1,1,1,1 +access_subscription_request_user,access_subscription_request_user.subscription,model_subscription_request,base.group_user,1,0,0,0 +access_subscription_request_easy_my_coop_user,access_subscription_request_easy_my_coop_user,model_subscription_request,group_easy_my_coop_user,1,1,1,0 +access_subscription_request_easy_my_coop_manager,access_subscription_request_easy_my_coop_manager,model_subscription_request,group_easy_my_coop_manager,1,1,1,1 +access_share_line_user,access_share_line_user,model_share_line,base.group_user,1,0,0,0 +access_share_line_easy_my_coop_user,access_share_line_easy_my_coop_user,model_share_line,group_easy_my_coop_user,1,1,1,0 +access_share_line_easy_my_coop_manager,access_share_line_easy_my_coop_manager,model_share_line,group_easy_my_coop_manager,1,1,1,1 +access_res_partner_easy_my_coop_user,access_res_partner_easy_my_coop_user,base.model_res_partner,group_easy_my_coop_user,1,1,1,0 +access_account_invoice_easy_my_coop_user,access_account_invoice_easy_my_coop_user,model_account_invoice,group_easy_my_coop_user,1,1,1,0 +access_subscription_register_easy_my_coop_user,access_subscription_register_easy_my_coop_user,model_subscription_register,group_easy_my_coop_user,1,1,1,0 +access_operation_request_easy_my_coop_user,access_operation_request_easy_my_coop_user,model_operation_request,group_easy_my_coop_user,1,1,1,0 +access_operation_request_easy_my_coop_manager,access_operation_request_easy_my_coop_manager,model_operation_request,group_easy_my_coop_manager,1,1,1,1 diff --git a/easy_my_coop/static/src/css/coop_report.css b/easy_my_coop/static/src/css/coop_report.css index 88fb46a..4633190 100644 --- a/easy_my_coop/static/src/css/coop_report.css +++ b/easy_my_coop/static/src/css/coop_report.css @@ -1,27 +1,27 @@ -.border-top-easymy-coop td { - border-top: 1pt solid #e7511e !important; -} - -.border-easymy-coop th { - border-bottom: 1pt solid #e7511e !important; -} - -.border-top-easymy-coop-cert td { - border-top: 1pt solid #fcc300 !important; -} - -.border-easymy-coop-cert th { - border-bottom: 1pt solid #fcc300 !important; -} - -.easymy-coop-normal { - font-family:Roboto-Regular; - font-size:12pt; - line-height:16pt; -} - -.easymy-coop-info-title { - font-family:Roboto-Bold; - font-size:12pt; - line-height:16pt; -} \ No newline at end of file +.border-top-easymy-coop td { + border-top: 1pt solid #e7511e !important; +} + +.border-easymy-coop th { + border-bottom: 1pt solid #e7511e !important; +} + +.border-top-easymy-coop-cert td { + border-top: 1pt solid #fcc300 !important; +} + +.border-easymy-coop-cert th { + border-bottom: 1pt solid #fcc300 !important; +} + +.easymy-coop-normal { + font-family:Roboto-Regular; + font-size:12pt; + line-height:16pt; +} + +.easymy-coop-info-title { + font-family:Roboto-Bold; + font-size:12pt; + line-height:16pt; +} diff --git a/easy_my_coop/static/src/js/easy_my_coop.js b/easy_my_coop/static/src/js/easy_my_coop.js index e87c61e..4ca05c6 100644 --- a/easy_my_coop/static/src/js/easy_my_coop.js +++ b/easy_my_coop/static/src/js/easy_my_coop.js @@ -1,52 +1,52 @@ odoo.define('easy_my_coop.oe_easymy_coop', function (require) { -$(document).ready(function () { - "use strict"; - var ajax = require('web.ajax'); - - $('.oe_easymy_coop').each(function () { + $(document).ready(function () { + "use strict"; + var ajax = require('web.ajax'); + + $('.oe_easymy_coop').each(function () { var oe_easymy_coop = this; - + $('#share_product_id').change(function () { var share_product_id = $("#share_product_id").val(); ajax.jsonRpc("/subscription/get_share_product", 'call', { - 'share_product_id': share_product_id + 'share_product_id': share_product_id, }) .then(function (data) { - $('#share_price').text(data[share_product_id].list_price); - $('input.js_quantity').val(data[share_product_id].min_qty); - if(data[share_product_id].force_min_qty == true){ - $('input.js_quantity').data("min",data[share_product_id].min_qty); - } - $('input.js_quantity').change(); - var $share_price = $('#share_price').text() - $('input[name="total_parts"]').val($('input.js_quantity').val()*$share_price); - $('input[name="total_parts"]').change(); + $('#share_price').text(data[share_product_id].list_price); + $('input.js_quantity').val(data[share_product_id].min_qty); + if (data[share_product_id].force_min_qty == true) { + $('input.js_quantity').data("min", data[share_product_id].min_qty); + } + $('input.js_quantity').change(); + var $share_price = $('#share_price').text(); + $('input[name="total_parts"]').val($('input.js_quantity').val()*$share_price); + $('input[name="total_parts"]').change(); }); }); - + $(oe_easymy_coop).on('click', 'a.js_add_cart_json', function (ev) { - var $share_price = $('#share_price').text() + var $share_price = $('#share_price').text(); var $link = $(ev.currentTarget); var $input = $link.parent().parent().find("input"); var $input_total = $("div").find(".total"); var min = parseFloat($input.data("min") || 1); var amount_max = parseFloat($('input[name="total_parts"]').data("max")); - var quantity = ($link.has(".fa-minus").length ? -1 : 1) + parseFloat($input.val(),10); + var quantity = ($link.has(".fa-minus").length ? -1 : 1) + parseFloat($input.val(), 10); var total_part = quantity * $share_price; var quantity_max = amount_max / $share_price; - $input.val(quantity > min ? (total_part <= amount_max ? quantity : quantity_max) : min); + $input.val(quantity > min ? total_part <= amount_max ? quantity : quantity_max : min); $input.change(); $('input[name="total_parts"]').val($input.val()*$share_price); return false; }); - + $(oe_easymy_coop).on('focusout', 'input.js_quantity', function (ev) { $('a.js_add_cart_json').trigger('click'); }); - + $('#share_product_id').trigger('change'); - + $("[name='birthdate']").inputmask(); - }); + }); + }); }); -}); \ No newline at end of file diff --git a/easy_my_coop/static/src/js/jquery.inputmask.bundle.js b/easy_my_coop/static/src/js/jquery.inputmask.bundle.js index d3865f8..8a3b083 100644 --- a/easy_my_coop/static/src/js/jquery.inputmask.bundle.js +++ b/easy_my_coop/static/src/js/jquery.inputmask.bundle.js @@ -1,75 +1,79 @@ -/*! +/* ! * jquery.inputmask.bundle.js * http://github.com/RobinHerbots/jquery.inputmask * Copyright (c) 2010 - 2016 Robin Herbots * Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php) * Version: 3.2.7 */ -!function($) { - function Inputmask(alias, options) { - return this instanceof Inputmask ? ($.isPlainObject(alias) ? options = alias : (options = options || {}, - options.alias = alias), this.el = void 0, this.opts = $.extend(!0, {}, this.defaults, options), - this.noMasksCache = options && void 0 !== options.definitions, this.userOptions = options || {}, +!(function ($) { + function Inputmask (alias, options) { + return this instanceof Inputmask ? ($.isPlainObject(alias) ? options = alias : (options = options || {}, + options.alias = alias), this.el = void 0, this.opts = $.extend(!0, {}, this.defaults, options), + this.noMasksCache = options && void 0 !== options.definitions, this.userOptions = options || {}, this.events = {}, void resolveAlias(this.opts.alias, options, this.opts)) : new Inputmask(alias, options); } - function isInputEventSupported(eventName) { + function isInputEventSupported (eventName) { var el = document.createElement("input"), evName = "on" + eventName, isSupported = evName in el; - return isSupported || (el.setAttribute(evName, "return;"), isSupported = "function" == typeof el[evName]), + return isSupported || (el.setAttribute(evName, "return;"), isSupported = typeof el[evName] === "function"), el = null, isSupported; } - function isElementTypeSupported(input, opts) { - var elementType = input.getAttribute("type"), isSupported = "INPUT" === input.tagName && -1 !== $.inArray(elementType, opts.supportsInputType) || input.isContentEditable || "TEXTAREA" === input.tagName; + function isElementTypeSupported (input, opts) { + var elementType = input.getAttribute("type"), isSupported = input.tagName === "INPUT" && $.inArray(elementType, opts.supportsInputType) !== -1 || input.isContentEditable || input.tagName === "TEXTAREA"; if (!isSupported) { var el = document.createElement("input"); - el.setAttribute("type", elementType), isSupported = "text" === el.type, el = null; + el.setAttribute("type", elementType), isSupported = el.type === "text", el = null; } return isSupported; } - function resolveAlias(aliasStr, options, opts) { + function resolveAlias (aliasStr, options, opts) { var aliasDefinition = opts.aliases[aliasStr]; - return aliasDefinition ? (aliasDefinition.alias && resolveAlias(aliasDefinition.alias, void 0, opts), - $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (null === opts.mask && (opts.mask = aliasStr), + return aliasDefinition ? (aliasDefinition.alias && resolveAlias(aliasDefinition.alias, void 0, opts), + $.extend(!0, opts, aliasDefinition), $.extend(!0, opts, options), !0) : (opts.mask === null && (opts.mask = aliasStr), !1); } - function importAttributeOptions(npt, opts, userOptions) { - function importOption(option, optionData) { - optionData = void 0 !== optionData ? optionData : npt.getAttribute("data-inputmask-" + option), - null !== optionData && ("string" == typeof optionData && (0 === option.indexOf("on") ? optionData = window[optionData] : "false" === optionData ? optionData = !1 : "true" === optionData && (optionData = !0)), + function importAttributeOptions (npt, opts, userOptions) { + function importOption (option, optionData) { + optionData = void 0 !== optionData ? optionData : npt.getAttribute("data-inputmask-" + option), + optionData !== null && (typeof optionData === "string" && (option.indexOf("on") === 0 ? optionData = window[optionData] : optionData === "false" ? optionData = !1 : optionData === "true" && (optionData = !0)), userOptions[option] = optionData); } var option, dataoptions, optionData, p, attrOptions = npt.getAttribute("data-inputmask"); - if (attrOptions && "" !== attrOptions && (attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'), + if (attrOptions && attrOptions !== "" && (attrOptions = attrOptions.replace(new RegExp("'", "g"), '"'), dataoptions = JSON.parse("{" + attrOptions + "}")), dataoptions) { optionData = void 0; - for (p in dataoptions) if ("alias" === p.toLowerCase()) { - optionData = dataoptions[p]; - break; + for (p in dataoptions) { + if (p.toLowerCase() === "alias") { + optionData = dataoptions[p]; + break; + } } } importOption("alias", optionData), userOptions.alias && resolveAlias(userOptions.alias, userOptions, opts); for (option in opts) { if (dataoptions) { optionData = void 0; - for (p in dataoptions) if (p.toLowerCase() === option.toLowerCase()) { - optionData = dataoptions[p]; - break; + for (p in dataoptions) { + if (p.toLowerCase() === option.toLowerCase()) { + optionData = dataoptions[p]; + break; + } } } importOption(option, optionData); } return $.extend(!0, opts, userOptions), opts; } - function generateMaskSet(opts, nocache) { - function analyseMask(mask) { - function MaskToken(isGroup, isOptional, isQuantifier, isAlternator) { - this.matches = [], this.isGroup = isGroup || !1, this.isOptional = isOptional || !1, - this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, + function generateMaskSet (opts, nocache) { + function analyseMask (mask) { + function MaskToken (isGroup, isOptional, isQuantifier, isAlternator) { + this.matches = [], this.isGroup = isGroup || !1, this.isOptional = isOptional || !1, + this.isQuantifier = isQuantifier || !1, this.isAlternator = isAlternator || !1, this.quantifier = { min: 1, - max: 1 + max: 1, }; } - function insertTestDefinition(mtoken, element, position) { + function insertTestDefinition (mtoken, element, position) { var maskdef = opts.definitions[element]; position = void 0 !== position ? position : mtoken.matches.length; var prevMatch = mtoken.matches[position - 1]; @@ -78,7 +82,7 @@ for (var prevalidators = maskdef.prevalidator, prevalidatorsL = prevalidators ? prevalidators.length : 0, i = 1; i < maskdef.cardinality; i++) { var prevalidator = prevalidatorsL >= i ? prevalidators[i - 1] : [], validator = prevalidator.validator, cardinality = prevalidator.cardinality; mtoken.matches.splice(position++, 0, { - fn: validator ? "string" == typeof validator ? new RegExp(validator) : new function() { + fn: validator ? typeof validator === "string" ? new RegExp(validator) : new function () { this.test = validator; }() : new RegExp("."), cardinality: cardinality ? cardinality : 1, @@ -87,11 +91,11 @@ casing: maskdef.casing, def: maskdef.definitionSymbol || element, placeholder: maskdef.placeholder, - mask: element + mask: element, }), prevMatch = mtoken.matches[position - 1]; } mtoken.matches.splice(position++, 0, { - fn: maskdef.validator ? "string" == typeof maskdef.validator ? new RegExp(maskdef.validator) : new function() { + fn: maskdef.validator ? typeof maskdef.validator === "string" ? new RegExp(maskdef.validator) : new function () { this.test = maskdef.validator; }() : new RegExp("."), cardinality: maskdef.cardinality, @@ -100,41 +104,47 @@ casing: maskdef.casing, def: maskdef.definitionSymbol || element, placeholder: maskdef.placeholder, - mask: element + mask: element, }); - } else mtoken.matches.splice(position++, 0, { - fn: null, - cardinality: 0, - optionality: mtoken.isOptional, - newBlockMarker: void 0 === prevMatch || prevMatch.def !== element, - casing: null, - def: opts.staticDefinitionSymbol || element, - placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0, - mask: element - }), escaped = !1; + } else { + mtoken.matches.splice(position++, 0, { + fn: null, + cardinality: 0, + optionality: mtoken.isOptional, + newBlockMarker: void 0 === prevMatch || prevMatch.def !== element, + casing: null, + def: opts.staticDefinitionSymbol || element, + placeholder: void 0 !== opts.staticDefinitionSymbol ? element : void 0, + mask: element, + }), escaped = !1; + } } - function verifyGroupMarker(lastMatch, isOpenGroup) { - lastMatch.isGroup && (lastMatch.isGroup = !1, insertTestDefinition(lastMatch, opts.groupmarker.start, 0), + function verifyGroupMarker (lastMatch, isOpenGroup) { + lastMatch.isGroup && (lastMatch.isGroup = !1, insertTestDefinition(lastMatch, opts.groupmarker.start, 0), isOpenGroup !== !0 && insertTestDefinition(lastMatch, opts.groupmarker.end)); } - function maskCurrentToken(m, currentToken, lastMatch, extraCondition) { - currentToken.matches.length > 0 && (void 0 === extraCondition || extraCondition) && (lastMatch = currentToken.matches[currentToken.matches.length - 1], + function maskCurrentToken (m, currentToken, lastMatch, extraCondition) { + currentToken.matches.length > 0 && (void 0 === extraCondition || extraCondition) && (lastMatch = currentToken.matches[currentToken.matches.length - 1], verifyGroupMarker(lastMatch)), insertTestDefinition(currentToken, m); } - function defaultCase() { + function defaultCase () { if (openenings.length > 0) { - if (currentOpeningToken = openenings[openenings.length - 1], maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator), + if (currentOpeningToken = openenings[openenings.length - 1], maskCurrentToken(m, currentOpeningToken, lastMatch, !currentOpeningToken.isAlternator), currentOpeningToken.isAlternator) { alternator = openenings.pop(); - for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1; - openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], + for (var mndx = 0; mndx < alternator.matches.length; mndx++) { + alternator.matches[mndx].isGroup = !1; + } + openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator); } - } else maskCurrentToken(m, currentToken, lastMatch); + } else { + maskCurrentToken(m, currentToken, lastMatch); + } } - function reverseTokens(maskToken) { - function reverseStatic(st) { - return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), + function reverseTokens (maskToken) { + function reverseStatic (st) { + return st === opts.optionalmarker.start ? st = opts.optionalmarker.end : st === opts.optionalmarker.end ? st = opts.optionalmarker.start : st === opts.groupmarker.start ? st = opts.groupmarker.end : st === opts.groupmarker.end && (st = opts.groupmarker.start), st; } maskToken.matches = maskToken.matches.reverse(); @@ -148,70 +158,90 @@ } return maskToken; } - for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) if (m = match[0], - escaped) defaultCase(); else switch (m.charAt(0)) { - case opts.escapeChar: - escaped = !0; - break; + for (var match, m, openingToken, currentOpeningToken, alternator, lastMatch, groupToken, tokenizer = /(?:[?*+]|\{[0-9\+\*]+(?:,[0-9\+\*]*)?\})|[^.?*+^${[]()|\\]+|./g, escaped = !1, currentToken = new MaskToken(), openenings = [], maskTokens = []; match = tokenizer.exec(mask); ) { + if (m = match[0], + escaped) { + defaultCase(); + } else { + switch (m.charAt(0)) { + case opts.escapeChar: + escaped = !0; + break; - case opts.optionalmarker.end: - case opts.groupmarker.end: - if (openingToken = openenings.pop(), void 0 !== openingToken) if (openenings.length > 0) { - if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), - currentOpeningToken.isAlternator) { - alternator = openenings.pop(); - for (var mndx = 0; mndx < alternator.matches.length; mndx++) alternator.matches[mndx].isGroup = !1; - openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], - currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator); - } - } else currentToken.matches.push(openingToken); else defaultCase(); - break; + case opts.optionalmarker.end: + case opts.groupmarker.end: + if (openingToken = openenings.pop(), void 0 !== openingToken) { + if (openenings.length > 0) { + if (currentOpeningToken = openenings[openenings.length - 1], currentOpeningToken.matches.push(openingToken), + currentOpeningToken.isAlternator) { + alternator = openenings.pop(); + for (var mndx = 0; mndx < alternator.matches.length; mndx++) { + alternator.matches[mndx].isGroup = !1; + } + openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], + currentOpeningToken.matches.push(alternator)) : currentToken.matches.push(alternator); + } + } else { + currentToken.matches.push(openingToken); + } + } else { + defaultCase(); + } + break; - case opts.optionalmarker.start: - openenings.push(new MaskToken(!1, !0)); - break; + case opts.optionalmarker.start: + openenings.push(new MaskToken(!1, !0)); + break; - case opts.groupmarker.start: - openenings.push(new MaskToken(!0)); - break; + case opts.groupmarker.start: + openenings.push(new MaskToken(!0)); + break; - case opts.quantifiermarker.start: - var quantifier = new MaskToken(!1, !1, !0); - m = m.replace(/[{}]/g, ""); - var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); - if (("*" === mq1 || "+" === mq1) && (mq0 = "*" === mq1 ? 0 : 1), quantifier.quantifier = { - min: mq0, - max: mq1 - }, openenings.length > 0) { - var matches = openenings[openenings.length - 1].matches; - match = matches.pop(), match.isGroup || (groupToken = new MaskToken(!0), groupToken.matches.push(match), - match = groupToken), matches.push(match), matches.push(quantifier); - } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken(!0), - groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), - currentToken.matches.push(quantifier); - break; + case opts.quantifiermarker.start: + var quantifier = new MaskToken(!1, !1, !0); + m = m.replace(/[{}]/g, ""); + var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = mq.length === 1 ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); + if ((mq1 === "*" || mq1 === "+") && (mq0 = mq1 === "*" ? 0 : 1), quantifier.quantifier = { + min: mq0, + max: mq1, + }, openenings.length > 0) { + var matches = openenings[openenings.length - 1].matches; + match = matches.pop(), match.isGroup || (groupToken = new MaskToken(!0), groupToken.matches.push(match), + match = groupToken), matches.push(match), matches.push(quantifier); + } else { + match = currentToken.matches.pop(), match.isGroup || (groupToken = new MaskToken(!0), + groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), + currentToken.matches.push(quantifier); + } + break; - case opts.alternatormarker: - openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], - lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), - lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken(!1, !1, !1, !0), - alternator.matches.push(lastMatch), openenings.push(alternator)); - break; + case opts.alternatormarker: + openenings.length > 0 ? (currentOpeningToken = openenings[openenings.length - 1], + lastMatch = currentOpeningToken.matches.pop()) : lastMatch = currentToken.matches.pop(), + lastMatch.isAlternator ? openenings.push(lastMatch) : (alternator = new MaskToken(!1, !1, !1, !0), + alternator.matches.push(lastMatch), openenings.push(alternator)); + break; - default: - defaultCase(); + default: + defaultCase(); + } + } } - for (;openenings.length > 0; ) openingToken = openenings.pop(), verifyGroupMarker(openingToken, !0), - currentToken.matches.push(openingToken); - return currentToken.matches.length > 0 && (lastMatch = currentToken.matches[currentToken.matches.length - 1], - verifyGroupMarker(lastMatch), maskTokens.push(currentToken)), opts.numericInput && reverseTokens(maskTokens[0]), + for (;openenings.length > 0; ) { + openingToken = openenings.pop(), verifyGroupMarker(openingToken, !0), + currentToken.matches.push(openingToken); + } + return currentToken.matches.length > 0 && (lastMatch = currentToken.matches[currentToken.matches.length - 1], + verifyGroupMarker(lastMatch), maskTokens.push(currentToken)), opts.numericInput && reverseTokens(maskTokens[0]), maskTokens; } - function generateMask(mask, metadata) { - if (null === mask || "" === mask) return void 0; - if (1 === mask.length && opts.greedy === !1 && 0 !== opts.repeat && (opts.placeholder = ""), - opts.repeat > 0 || "*" === opts.repeat || "+" === opts.repeat) { - var repeatStart = "*" === opts.repeat ? 0 : "+" === opts.repeat ? 1 : opts.repeat; + function generateMask (mask, metadata) { + if (mask === null || mask === "") { + return void 0; + } + if (mask.length === 1 && opts.greedy === !1 && opts.repeat !== 0 && (opts.placeholder = ""), + opts.repeat > 0 || opts.repeat === "*" || opts.repeat === "+") { + var repeatStart = opts.repeat === "*" ? 0 : opts.repeat === "+" ? 1 : opts.repeat; mask = opts.groupmarker.start + mask + opts.groupmarker.end + opts.quantifiermarker.start + repeatStart + "," + opts.repeat + opts.quantifiermarker.end; } var masksetDefinition; @@ -222,179 +252,221 @@ _buffer: void 0, buffer: void 0, tests: {}, - metadata: metadata - }, nocache !== !0 && (Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask] = masksetDefinition, - masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]))) : masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]), + metadata: metadata, + }, nocache !== !0 && (Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask] = masksetDefinition, + masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]))) : masksetDefinition = $.extend(!0, {}, Inputmask.prototype.masksCache[opts.numericInput ? mask.split("").reverse().join("") : mask]), masksetDefinition; } - function preProcessMask(mask) { + function preProcessMask (mask) { return mask = mask.toString(); } var ms; if ($.isFunction(opts.mask) && (opts.mask = opts.mask(opts)), $.isArray(opts.mask)) { if (opts.mask.length > 1) { - opts.keepStatic = null === opts.keepStatic ? !0 : opts.keepStatic; + opts.keepStatic = opts.keepStatic === null ? !0 : opts.keepStatic; var altMask = "("; - return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function(ndx, msk) { + return $.each(opts.numericInput ? opts.mask.reverse() : opts.mask, function (ndx, msk) { altMask.length > 1 && (altMask += ")|("), altMask += preProcessMask(void 0 === msk.mask || $.isFunction(msk.mask) ? msk : msk.mask); }), altMask += ")", generateMask(altMask, opts.mask); } opts.mask = opts.mask.pop(); } - return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(preProcessMask(opts.mask), opts.mask) : generateMask(preProcessMask(opts.mask.mask), opts.mask)), + return opts.mask && (ms = void 0 === opts.mask.mask || $.isFunction(opts.mask.mask) ? generateMask(preProcessMask(opts.mask), opts.mask) : generateMask(preProcessMask(opts.mask.mask), opts.mask)), ms; } - function maskScope(actionObj, maskset, opts) { - function getMaskTemplate(baseOnInput, minimalPos, includeInput) { + function maskScope (actionObj, maskset, opts) { + function getMaskTemplate (baseOnInput, minimalPos, includeInput) { minimalPos = minimalPos || 0; var ndxIntlzr, test, testPos, maskTemplate = [], pos = 0, lvp = getLastValidPosition(); do { if (baseOnInput === !0 && getMaskSet().validPositions[pos]) { var validPos = getMaskSet().validPositions[pos]; test = validPos.match, ndxIntlzr = validPos.locator.slice(), maskTemplate.push(includeInput === !0 ? validPos.input : getPlaceholder(pos, test)); - } else testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), test = testPos.match, - ndxIntlzr = testPos.locator.slice(), (opts.jitMasking === !1 || lvp > pos || isFinite(opts.jitMasking) && opts.jitMasking > pos) && maskTemplate.push(getPlaceholder(pos, test)); + } else { + testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), test = testPos.match, + ndxIntlzr = testPos.locator.slice(), (opts.jitMasking === !1 || lvp > pos || isFinite(opts.jitMasking) && opts.jitMasking > pos) && maskTemplate.push(getPlaceholder(pos, test)); + } pos++; - } while ((void 0 === maxLength || maxLength > pos - 1) && null !== test.fn || null === test.fn && "" !== test.def || minimalPos >= pos); - return "" === maskTemplate[maskTemplate.length - 1] && maskTemplate.pop(), maskTemplate; + } while ((void 0 === maxLength || maxLength > pos - 1) && test.fn !== null || test.fn === null && test.def !== "" || minimalPos >= pos); + return maskTemplate[maskTemplate.length - 1] === "" && maskTemplate.pop(), maskTemplate; } - function getMaskSet() { + function getMaskSet () { return maskset; } - function resetMaskSet(soft) { + function resetMaskSet (soft) { var maskset = getMaskSet(); - maskset.buffer = void 0, soft !== !0 && (maskset.tests = {}, maskset._buffer = void 0, + maskset.buffer = void 0, soft !== !0 && (maskset.tests = {}, maskset._buffer = void 0, maskset.validPositions = {}, maskset.p = 0); } - function getLastValidPosition(closestTo, strict) { + function getLastValidPosition (closestTo, strict) { var before = -1, after = -1, valids = getMaskSet().validPositions; void 0 === closestTo && (closestTo = -1); for (var posNdx in valids) { var psNdx = parseInt(posNdx); - valids[psNdx] && (strict || null !== valids[psNdx].match.fn) && (closestTo >= psNdx && (before = psNdx), + valids[psNdx] && (strict || valids[psNdx].match.fn !== null) && (closestTo >= psNdx && (before = psNdx), psNdx >= closestTo && (after = psNdx)); } - return -1 !== before && closestTo - before > 1 || closestTo > after ? before : after; + return before !== -1 && closestTo - before > 1 || closestTo > after ? before : after; } - function setValidPosition(pos, validTest, fromSetValid) { + function setValidPosition (pos, validTest, fromSetValid) { if (opts.insertMode && void 0 !== getMaskSet().validPositions[pos] && void 0 === fromSetValid) { var i, positionsClone = $.extend(!0, {}, getMaskSet().validPositions), lvp = getLastValidPosition(); - for (i = pos; lvp >= i; i++) delete getMaskSet().validPositions[i]; + for (i = pos; lvp >= i; i++) { + delete getMaskSet().validPositions[i]; + } getMaskSet().validPositions[pos] = validTest; var j, valid = !0, vps = getMaskSet().validPositions; for (i = j = pos; lvp >= i; i++) { var t = positionsClone[i]; - if (void 0 !== t) for (var posMatch = j, prevPosMatch = -1; posMatch < getMaskLength() && (null == t.match.fn && vps[i] && (vps[i].match.optionalQuantifier === !0 || vps[i].match.optionality === !0) || null != t.match.fn); ) { - if (null === t.match.fn || !opts.keepStatic && vps[i] && (void 0 !== vps[i + 1] && getTests(i + 1, vps[i].locator.slice(), i).length > 1 || void 0 !== vps[i].alternation) ? posMatch++ : posMatch = seekNext(j), - positionCanMatchDefinition(posMatch, t.match.def)) { - var result = isValid(posMatch, t.input, !0, !0); - valid = result !== !1, j = result.caret || result.insert ? getLastValidPosition() : posMatch; - break; + if (void 0 !== t) { + for (var posMatch = j, prevPosMatch = -1; posMatch < getMaskLength() && (t.match.fn == null && vps[i] && (vps[i].match.optionalQuantifier === !0 || vps[i].match.optionality === !0) || t.match.fn != null); ) { + if (t.match.fn === null || !opts.keepStatic && vps[i] && (void 0 !== vps[i + 1] && getTests(i + 1, vps[i].locator.slice(), i).length > 1 || void 0 !== vps[i].alternation) ? posMatch++ : posMatch = seekNext(j), + positionCanMatchDefinition(posMatch, t.match.def)) { + var result = isValid(posMatch, t.input, !0, !0); + valid = result !== !1, j = result.caret || result.insert ? getLastValidPosition() : posMatch; + break; + } + if (valid = t.match.fn == null, prevPosMatch === posMatch) { + break; + } + prevPosMatch = posMatch; } - if (valid = null == t.match.fn, prevPosMatch === posMatch) break; - prevPosMatch = posMatch; } - if (!valid) break; + if (!valid) { + break; + } + } + if (!valid) { + return getMaskSet().validPositions = $.extend(!0, {}, positionsClone), + resetMaskSet(!0), !1; } - if (!valid) return getMaskSet().validPositions = $.extend(!0, {}, positionsClone), - resetMaskSet(!0), !1; - } else getMaskSet().validPositions[pos] = validTest; + } else { + getMaskSet().validPositions[pos] = validTest; + } return resetMaskSet(!0), !0; } - function stripValidPositions(start, end, nocheck, strict) { + function stripValidPositions (start, end, nocheck, strict) { var i, startPos = start; - for (getMaskSet().p = start, i = startPos; end > i; i++) void 0 !== getMaskSet().validPositions[i] && (nocheck === !0 || opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) !== !1) && delete getMaskSet().validPositions[i]; + for (getMaskSet().p = start, i = startPos; end > i; i++) { + void 0 !== getMaskSet().validPositions[i] && (nocheck === !0 || opts.canClearPosition(getMaskSet(), i, getLastValidPosition(), strict, opts) !== !1) && delete getMaskSet().validPositions[i]; + } for (i = startPos + 1; i <= getLastValidPosition(); ) { - for (;void 0 !== getMaskSet().validPositions[startPos]; ) startPos++; + for (;void 0 !== getMaskSet().validPositions[startPos]; ) { + startPos++; + } var s = getMaskSet().validPositions[startPos]; - if (startPos > i && (i = startPos + 1), void 0 === getMaskSet().validPositions[i] && isMask(i) || void 0 !== s) i++; else { + if (startPos > i && (i = startPos + 1), void 0 === getMaskSet().validPositions[i] && isMask(i) || void 0 !== s) { + i++; + } else { var t = getTestTemplate(i); - positionCanMatchDefinition(startPos, t.match.def) ? isValid(startPos, t.input || getPlaceholder(i), !0) !== !1 && (delete getMaskSet().validPositions[i], + positionCanMatchDefinition(startPos, t.match.def) ? isValid(startPos, t.input || getPlaceholder(i), !0) !== !1 && (delete getMaskSet().validPositions[i], i++) : isMask(i) || (i++, startPos--), startPos++; } } var lvp = getLastValidPosition(), ml = getMaskLength(); - for (strict !== !0 && nocheck !== !0 && void 0 !== getMaskSet().validPositions[lvp] && getMaskSet().validPositions[lvp].input === opts.radixPoint && delete getMaskSet().validPositions[lvp], - i = lvp + 1; ml >= i; i++) getMaskSet().validPositions[i] && delete getMaskSet().validPositions[i]; + for (strict !== !0 && nocheck !== !0 && void 0 !== getMaskSet().validPositions[lvp] && getMaskSet().validPositions[lvp].input === opts.radixPoint && delete getMaskSet().validPositions[lvp], + i = lvp + 1; ml >= i; i++) { + getMaskSet().validPositions[i] && delete getMaskSet().validPositions[i]; + } resetMaskSet(!0); } - function getTestTemplate(pos, ndxIntlzr, tstPs) { + function getTestTemplate (pos, ndxIntlzr, tstPs) { var testPos = getMaskSet().validPositions[pos]; - if (void 0 === testPos) for (var testPositions = getTests(pos, ndxIntlzr, tstPs), lvp = getLastValidPosition(), lvTest = getMaskSet().validPositions[lvp] || getTests(0)[0], lvTestAltArr = void 0 !== lvTest.alternation ? lvTest.locator[lvTest.alternation].toString().split(",") : [], ndx = 0; ndx < testPositions.length && (testPos = testPositions[ndx], - !(testPos.match && (opts.greedy && testPos.match.optionalQuantifier !== !0 || (testPos.match.optionality === !1 || testPos.match.newBlockMarker === !1) && testPos.match.optionalQuantifier !== !0) && (void 0 === lvTest.alternation || lvTest.alternation !== testPos.alternation || void 0 !== testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAltArr)))); ndx++) ; + if (void 0 === testPos) { + for (var testPositions = getTests(pos, ndxIntlzr, tstPs), lvp = getLastValidPosition(), lvTest = getMaskSet().validPositions[lvp] || getTests(0)[0], lvTestAltArr = void 0 !== lvTest.alternation ? lvTest.locator[lvTest.alternation].toString().split(",") : [], ndx = 0; ndx < testPositions.length && (testPos = testPositions[ndx], + !(testPos.match && (opts.greedy && testPos.match.optionalQuantifier !== !0 || (testPos.match.optionality === !1 || testPos.match.newBlockMarker === !1) && testPos.match.optionalQuantifier !== !0) && (void 0 === lvTest.alternation || lvTest.alternation !== testPos.alternation || void 0 !== testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAltArr)))); ndx++) {} + } return testPos; } - function getTest(pos) { + function getTest (pos) { return getMaskSet().validPositions[pos] ? getMaskSet().validPositions[pos].match : getTests(pos)[0].match; } - function positionCanMatchDefinition(pos, def) { - for (var valid = !1, tests = getTests(pos), tndx = 0; tndx < tests.length; tndx++) if (tests[tndx].match && tests[tndx].match.def === def) { - valid = !0; - break; + function positionCanMatchDefinition (pos, def) { + for (var valid = !1, tests = getTests(pos), tndx = 0; tndx < tests.length; tndx++) { + if (tests[tndx].match && tests[tndx].match.def === def) { + valid = !0; + break; + } } return valid; } - function selectBestMatch(pos, alternateNdx) { + function selectBestMatch (pos, alternateNdx) { var bestMatch, indexPos; - return (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) && $.each(getMaskSet().tests[pos] || [ getMaskSet().validPositions[pos] ], function(ndx, lmnt) { + return (getMaskSet().tests[pos] || getMaskSet().validPositions[pos]) && $.each(getMaskSet().tests[pos] || [ getMaskSet().validPositions[pos] ], function (ndx, lmnt) { var ndxPos = lmnt.alternation ? lmnt.locator[lmnt.alternation].toString().indexOf(alternateNdx) : -1; - (void 0 === indexPos || indexPos > ndxPos) && -1 !== ndxPos && (bestMatch = lmnt, + (void 0 === indexPos || indexPos > ndxPos) && ndxPos !== -1 && (bestMatch = lmnt, indexPos = ndxPos); }), bestMatch; } - function getTests(pos, ndxIntlzr, tstPs) { - function resolveTestFromToken(maskToken, ndxInitializer, loopNdx, quantifierRecurse) { - function handleMatch(match, loopNdx, quantifierRecurse) { - function isFirstMatch(latestMatch, tokenGroup) { - var firstMatch = 0 === $.inArray(latestMatch, tokenGroup.matches); - return firstMatch || $.each(tokenGroup.matches, function(ndx, match) { + function getTests (pos, ndxIntlzr, tstPs) { + function resolveTestFromToken (maskToken, ndxInitializer, loopNdx, quantifierRecurse) { + function handleMatch (match, loopNdx, quantifierRecurse) { + function isFirstMatch (latestMatch, tokenGroup) { + var firstMatch = $.inArray(latestMatch, tokenGroup.matches) === 0; + return firstMatch || $.each(tokenGroup.matches, function (ndx, match) { return match.isQuantifier === !0 && (firstMatch = isFirstMatch(latestMatch, tokenGroup.matches[ndx - 1])) ? !1 : void 0; }), firstMatch; } - function resolveNdxInitializer(pos, alternateNdx) { + function resolveNdxInitializer (pos, alternateNdx) { var bestMatch = selectBestMatch(pos, alternateNdx); return bestMatch ? bestMatch.locator.slice(bestMatch.alternation + 1) : []; } - if (testPos > 1e4) throw "Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. " + getMaskSet().mask; - if (testPos === pos && void 0 === match.matches) return matches.push({ - match: match, - locator: loopNdx.reverse(), - cd: cacheDependency - }), !0; + if (testPos > 1e4) { + throw "Inputmask: There is probably an error in your mask definition or in the code. Create an issue on github with an example of the mask you are using. " + getMaskSet().mask; + } + if (testPos === pos && void 0 === match.matches) { + return matches.push({ + match: match, + locator: loopNdx.reverse(), + cd: cacheDependency, + }), !0; + } if (void 0 !== match.matches) { if (match.isGroup && quantifierRecurse !== match) { - if (match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx)) return !0; + if (match = handleMatch(maskToken.matches[$.inArray(match, maskToken.matches) + 1], loopNdx)) { + return !0; + } } else if (match.isOptional) { var optionalToken = match; if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) { - if (latestMatch = matches[matches.length - 1].match, !isFirstMatch(latestMatch, optionalToken)) return !0; + if (latestMatch = matches[matches.length - 1].match, !isFirstMatch(latestMatch, optionalToken)) { + return !0; + } insertStop = !0, testPos = pos; } } else if (match.isAlternator) { var maltMatches, alternateToken = match, malternateMatches = [], currentMatches = matches.slice(), loopNdxCnt = loopNdx.length, altIndex = ndxInitializer.length > 0 ? ndxInitializer.shift() : -1; - if (-1 === altIndex || "string" == typeof altIndex) { + if (altIndex === -1 || typeof altIndex === "string") { var amndx, currentPos = testPos, ndxInitializerClone = ndxInitializer.slice(), altIndexArr = []; - if ("string" == typeof altIndex) altIndexArr = altIndex.split(","); else for (amndx = 0; amndx < alternateToken.matches.length; amndx++) altIndexArr.push(amndx); + if (typeof altIndex === "string") { + altIndexArr = altIndex.split(","); + } else { + for (amndx = 0; amndx < alternateToken.matches.length; amndx++) { + altIndexArr.push(amndx); + } + } for (var ndx = 0; ndx < altIndexArr.length; ndx++) { - if (amndx = parseInt(altIndexArr[ndx]), matches = [], ndxInitializer = resolveNdxInitializer(testPos, amndx), - match = handleMatch(alternateToken.matches[amndx] || maskToken.matches[amndx], [ amndx ].concat(loopNdx), quantifierRecurse) || match, + if (amndx = parseInt(altIndexArr[ndx]), matches = [], ndxInitializer = resolveNdxInitializer(testPos, amndx), + match = handleMatch(alternateToken.matches[amndx] || maskToken.matches[amndx], [ amndx ].concat(loopNdx), quantifierRecurse) || match, match !== !0 && void 0 !== match && altIndexArr[altIndexArr.length - 1] < alternateToken.matches.length) { var ntndx = $.inArray(match, maskToken.matches) + 1; - maskToken.matches.length > ntndx && (match = handleMatch(maskToken.matches[ntndx], [ ntndx ].concat(loopNdx.slice(1, loopNdx.length)), quantifierRecurse), - match && (altIndexArr.push(ntndx.toString()), $.each(matches, function(ndx, lmnt) { + maskToken.matches.length > ntndx && (match = handleMatch(maskToken.matches[ntndx], [ ntndx ].concat(loopNdx.slice(1, loopNdx.length)), quantifierRecurse), + match && (altIndexArr.push(ntndx.toString()), $.each(matches, function (ndx, lmnt) { lmnt.alternation = loopNdx.length - 1; }))); } maltMatches = matches.slice(), testPos = currentPos, matches = []; - for (var i = 0; i < ndxInitializerClone.length; i++) ndxInitializer[i] = ndxInitializerClone[i]; + for (var i = 0; i < ndxInitializerClone.length; i++) { + ndxInitializer[i] = ndxInitializerClone[i]; + } for (var ndx1 = 0; ndx1 < maltMatches.length; ndx1++) { var altMatch = maltMatches[ndx1]; altMatch.alternation = altMatch.alternation || loopNdxCnt; for (var ndx2 = 0; ndx2 < malternateMatches.length; ndx2++) { var altMatch2 = malternateMatches[ndx2]; - if (altMatch.match.def === altMatch2.match.def && ("string" != typeof altIndex || -1 !== $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr))) { - altMatch.match.mask === altMatch2.match.mask && (maltMatches.splice(ndx1, 1), ndx1--), - -1 === altMatch2.locator[altMatch.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) && (altMatch2.locator[altMatch.alternation] = altMatch2.locator[altMatch.alternation] + "," + altMatch.locator[altMatch.alternation], + if (altMatch.match.def === altMatch2.match.def && (typeof altIndex !== "string" || $.inArray(altMatch.locator[altMatch.alternation].toString(), altIndexArr) !== -1)) { + altMatch.match.mask === altMatch2.match.mask && (maltMatches.splice(ndx1, 1), ndx1--), + altMatch2.locator[altMatch.alternation].toString().indexOf(altMatch.locator[altMatch.alternation]) === -1 && (altMatch2.locator[altMatch.alternation] = altMatch2.locator[altMatch.alternation] + "," + altMatch.locator[altMatch.alternation], altMatch2.alternation = altMatch.alternation); break; } @@ -402,404 +474,518 @@ } malternateMatches = malternateMatches.concat(maltMatches); } - "string" == typeof altIndex && (malternateMatches = $.map(malternateMatches, function(lmnt, ndx) { + typeof altIndex === "string" && (malternateMatches = $.map(malternateMatches, function (lmnt, ndx) { if (isFinite(ndx)) { var mamatch, alternation = lmnt.alternation, altLocArr = lmnt.locator[alternation].toString().split(","); lmnt.locator[alternation] = void 0, lmnt.alternation = void 0; - for (var alndx = 0; alndx < altLocArr.length; alndx++) mamatch = -1 !== $.inArray(altLocArr[alndx], altIndexArr), - mamatch && (void 0 !== lmnt.locator[alternation] ? (lmnt.locator[alternation] += ",", - lmnt.locator[alternation] += altLocArr[alndx]) : lmnt.locator[alternation] = parseInt(altLocArr[alndx]), - lmnt.alternation = alternation); - if (void 0 !== lmnt.locator[alternation]) return lmnt; + for (var alndx = 0; alndx < altLocArr.length; alndx++) { + mamatch = $.inArray(altLocArr[alndx], altIndexArr) !== -1, + mamatch && (void 0 !== lmnt.locator[alternation] ? (lmnt.locator[alternation] += ",", + lmnt.locator[alternation] += altLocArr[alndx]) : lmnt.locator[alternation] = parseInt(altLocArr[alndx]), + lmnt.alternation = alternation); + } + if (void 0 !== lmnt.locator[alternation]) { + return lmnt; + } } })), matches = currentMatches.concat(malternateMatches), testPos = pos, insertStop = matches.length > 0; - } else match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [ altIndex ].concat(loopNdx), quantifierRecurse); - if (match) return !0; - } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) for (var qt = match, qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && pos >= testPos; qndx++) { - var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1]; - if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) { - if (latestMatch = matches[matches.length - 1].match, latestMatch.optionalQuantifier = qndx > qt.quantifier.min - 1, - isFirstMatch(latestMatch, tokenGroup)) { - if (qndx > qt.quantifier.min - 1) { - insertStop = !0, testPos = pos; - break; + } else { + match = handleMatch(alternateToken.matches[altIndex] || maskToken.matches[altIndex], [ altIndex ].concat(loopNdx), quantifierRecurse); + } + if (match) { + return !0; + } + } else if (match.isQuantifier && quantifierRecurse !== maskToken.matches[$.inArray(match, maskToken.matches) - 1]) { + for (var qt = match, qndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; qndx < (isNaN(qt.quantifier.max) ? qndx + 1 : qt.quantifier.max) && pos >= testPos; qndx++) { + var tokenGroup = maskToken.matches[$.inArray(qt, maskToken.matches) - 1]; + if (match = handleMatch(tokenGroup, [ qndx ].concat(loopNdx), tokenGroup)) { + if (latestMatch = matches[matches.length - 1].match, latestMatch.optionalQuantifier = qndx > qt.quantifier.min - 1, + isFirstMatch(latestMatch, tokenGroup)) { + if (qndx > qt.quantifier.min - 1) { + insertStop = !0, testPos = pos; + break; + } + return !0; } return !0; } - return !0; } - } else if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) return !0; - } else testPos++; + } else if (match = resolveTestFromToken(match, ndxInitializer, loopNdx, quantifierRecurse)) { + return !0; + } + } else { + testPos++; + } } - for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) if (maskToken.matches[tndx].isQuantifier !== !0) { - var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse); - if (match && testPos === pos) return match; - if (testPos > pos) break; + for (var tndx = ndxInitializer.length > 0 ? ndxInitializer.shift() : 0; tndx < maskToken.matches.length; tndx++) { + if (maskToken.matches[tndx].isQuantifier !== !0) { + var match = handleMatch(maskToken.matches[tndx], [ tndx ].concat(loopNdx), quantifierRecurse); + if (match && testPos === pos) { + return match; + } + if (testPos > pos) { + break; + } + } } } - function mergeLocators(tests) { + function mergeLocators (tests) { var test = tests[0] || tests; return test.locator.slice(); } var latestMatch, maskTokens = getMaskSet().maskToken, testPos = ndxIntlzr ? tstPs : 0, ndxInitializer = ndxIntlzr || [ 0 ], matches = [], insertStop = !1, cacheDependency = ndxIntlzr ? ndxIntlzr.join("") : ""; if (pos > -1) { if (void 0 === ndxIntlzr) { - for (var test, previousPos = pos - 1; void 0 === (test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) && previousPos > -1; ) previousPos--; - void 0 !== test && previousPos > -1 && (ndxInitializer = mergeLocators(test), cacheDependency = ndxInitializer.join(""), + for (var test, previousPos = pos - 1; void 0 === (test = getMaskSet().validPositions[previousPos] || getMaskSet().tests[previousPos]) && previousPos > -1; ) { + previousPos--; + } + void 0 !== test && previousPos > -1 && (ndxInitializer = mergeLocators(test), cacheDependency = ndxInitializer.join(""), test = test[0] || test, testPos = previousPos); } - if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) return getMaskSet().tests[pos]; + if (getMaskSet().tests[pos] && getMaskSet().tests[pos][0].cd === cacheDependency) { + return getMaskSet().tests[pos]; + } for (var mtndx = ndxInitializer.shift(); mtndx < maskTokens.length; mtndx++) { var match = resolveTestFromToken(maskTokens[mtndx], ndxInitializer, [ mtndx ]); - if (match && testPos === pos || testPos > pos) break; + if (match && testPos === pos || testPos > pos) { + break; + } } } - return (0 === matches.length || insertStop) && matches.push({ + return (matches.length === 0 || insertStop) && matches.push({ match: { fn: null, cardinality: 0, optionality: !0, casing: null, - def: "" + def: "", }, - locator: [] + locator: [], }), getMaskSet().tests[pos] = $.extend(!0, [], matches), getMaskSet().tests[pos]; } - function getBufferTemplate() { - return void 0 === getMaskSet()._buffer && (getMaskSet()._buffer = getMaskTemplate(!1, 1)), + function getBufferTemplate () { + return void 0 === getMaskSet()._buffer && (getMaskSet()._buffer = getMaskTemplate(!1, 1)), getMaskSet()._buffer; } - function getBuffer(noCache) { + function getBuffer (noCache) { if (void 0 === getMaskSet().buffer || noCache === !0) { - if (noCache === !0) for (var testNdx in getMaskSet().tests) void 0 === getMaskSet().validPositions[testNdx] && delete getMaskSet().tests[testNdx]; + if (noCache === !0) { + for (var testNdx in getMaskSet().tests) { + void 0 === getMaskSet().validPositions[testNdx] && delete getMaskSet().tests[testNdx]; + } + } getMaskSet().buffer = getMaskTemplate(!0, getLastValidPosition(), !0); } return getMaskSet().buffer; } - function refreshFromBuffer(start, end, buffer) { + function refreshFromBuffer (start, end, buffer) { var i; - if (buffer = buffer, start === !0) resetMaskSet(), start = 0, end = buffer.length; else for (i = start; end > i; i++) delete getMaskSet().validPositions[i], - delete getMaskSet().tests[i]; - for (i = start; end > i; i++) resetMaskSet(!0), buffer[i] !== opts.skipOptionalPartCharacter && isValid(i, buffer[i], !0, !0); + if (buffer = buffer, start === !0) { + resetMaskSet(), start = 0, end = buffer.length; + } else { + for (i = start; end > i; i++) { + delete getMaskSet().validPositions[i], + delete getMaskSet().tests[i]; + } + } + for (i = start; end > i; i++) { + resetMaskSet(!0), buffer[i] !== opts.skipOptionalPartCharacter && isValid(i, buffer[i], !0, !0); + } } - function casing(elem, test) { + function casing (elem, test) { switch (test.casing) { - case "upper": + case "upper": elem = elem.toUpperCase(); break; - case "lower": + case "lower": elem = elem.toLowerCase(); } return elem; } - function checkAlternationMatch(altArr1, altArr2) { - for (var altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1), isMatch = !1, alndx = 0; alndx < altArr1.length; alndx++) if (-1 !== $.inArray(altArr1[alndx], altArrC)) { - isMatch = !0; - break; + function checkAlternationMatch (altArr1, altArr2) { + for (var altArrC = opts.greedy ? altArr2 : altArr2.slice(0, 1), isMatch = !1, alndx = 0; alndx < altArr1.length; alndx++) { + if ($.inArray(altArr1[alndx], altArrC) !== -1) { + isMatch = !0; + break; + } } return isMatch; } - function isValid(pos, c, strict, fromSetValid) { - function _isValid(position, c, strict, fromSetValid) { + function isValid (pos, c, strict, fromSetValid) { + function _isValid (position, c, strict, fromSetValid) { var rslt = !1; - return $.each(getTests(position), function(ndx, tst) { - for (var test = tst.match, loopend = c ? 1 : 0, chrs = "", i = test.cardinality; i > loopend; i--) chrs += getBufferElement(position - (i - 1)); - if (c && (chrs += c), getBuffer(!0), rslt = null != test.fn ? test.fn.test(chrs, getMaskSet(), position, strict, opts) : c !== test.def && c !== opts.skipOptionalPartCharacter || "" === test.def ? !1 : { + return $.each(getTests(position), function (ndx, tst) { + for (var test = tst.match, loopend = c ? 1 : 0, chrs = "", i = test.cardinality; i > loopend; i--) { + chrs += getBufferElement(position - (i - 1)); + } + if (c && (chrs += c), getBuffer(!0), rslt = test.fn != null ? test.fn.test(chrs, getMaskSet(), position, strict, opts) : c !== test.def && c !== opts.skipOptionalPartCharacter || test.def === "" ? !1 : { c: test.placeholder || test.def, - pos: position + pos: position, }, rslt !== !1) { var elem = void 0 !== rslt.c ? rslt.c : c; - elem = elem === opts.skipOptionalPartCharacter && null === test.fn ? test.placeholder || test.def : elem; + elem = elem === opts.skipOptionalPartCharacter && test.fn === null ? test.placeholder || test.def : elem; var validatedPos = position, possibleModifiedBuffer = getBuffer(); - if (void 0 !== rslt.remove && ($.isArray(rslt.remove) || (rslt.remove = [ rslt.remove ]), - $.each(rslt.remove.sort(function(a, b) { + if (void 0 !== rslt.remove && ($.isArray(rslt.remove) || (rslt.remove = [ rslt.remove ]), + $.each(rslt.remove.sort(function (a, b) { return b - a; - }), function(ndx, lmnt) { + }), function (ndx, lmnt) { stripValidPositions(lmnt, lmnt + 1, !0); - })), void 0 !== rslt.insert && ($.isArray(rslt.insert) || (rslt.insert = [ rslt.insert ]), - $.each(rslt.insert.sort(function(a, b) { + })), void 0 !== rslt.insert && ($.isArray(rslt.insert) || (rslt.insert = [ rslt.insert ]), + $.each(rslt.insert.sort(function (a, b) { return a - b; - }), function(ndx, lmnt) { + }), function (ndx, lmnt) { isValid(lmnt.pos, lmnt.c, !1, fromSetValid); })), rslt.refreshFromBuffer) { var refresh = rslt.refreshFromBuffer; - if (strict = !0, refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, possibleModifiedBuffer), - void 0 === rslt.pos && void 0 === rslt.c) return rslt.pos = getLastValidPosition(), - !1; - if (validatedPos = void 0 !== rslt.pos ? rslt.pos : position, validatedPos !== position) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0, fromSetValid)), + if (strict = !0, refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, possibleModifiedBuffer), + void 0 === rslt.pos && void 0 === rslt.c) { + return rslt.pos = getLastValidPosition(), + !1; + } + if (validatedPos = void 0 !== rslt.pos ? rslt.pos : position, validatedPos !== position) { + return rslt = $.extend(rslt, isValid(validatedPos, elem, !0, fromSetValid)), + !1; + } + } else if (rslt !== !0 && void 0 !== rslt.pos && rslt.pos !== position && (validatedPos = rslt.pos, + refreshFromBuffer(position, validatedPos, getBuffer().slice()), validatedPos !== position)) { + return rslt = $.extend(rslt, isValid(validatedPos, elem, !0)), !1; - } else if (rslt !== !0 && void 0 !== rslt.pos && rslt.pos !== position && (validatedPos = rslt.pos, - refreshFromBuffer(position, validatedPos, getBuffer().slice()), validatedPos !== position)) return rslt = $.extend(rslt, isValid(validatedPos, elem, !0)), - !1; - return rslt !== !0 && void 0 === rslt.pos && void 0 === rslt.c ? !1 : (ndx > 0 && resetMaskSet(!0), + } + return rslt !== !0 && void 0 === rslt.pos && void 0 === rslt.c ? !1 : (ndx > 0 && resetMaskSet(!0), setValidPosition(validatedPos, $.extend({}, tst, { - input: casing(elem, test) + input: casing(elem, test), }), fromSetValid) || (rslt = !1), !1); } }), rslt; } - function alternate(pos, c, strict, fromSetValid) { - for (var lastAlt, alternation, isValidRslt, altPos, i, validPos, validPsClone = $.extend(!0, {}, getMaskSet().validPositions), testsClone = $.extend(!0, {}, getMaskSet().tests), lAlt = getLastValidPosition(); lAlt >= 0 && (altPos = getMaskSet().validPositions[lAlt], - !altPos || void 0 === altPos.alternation || (lastAlt = lAlt, alternation = getMaskSet().validPositions[lastAlt].alternation, - getTestTemplate(lastAlt).locator[altPos.alternation] === altPos.locator[altPos.alternation])); lAlt--) ; + function alternate (pos, c, strict, fromSetValid) { + for (var lastAlt, alternation, isValidRslt, altPos, i, validPos, validPsClone = $.extend(!0, {}, getMaskSet().validPositions), testsClone = $.extend(!0, {}, getMaskSet().tests), lAlt = getLastValidPosition(); lAlt >= 0 && (altPos = getMaskSet().validPositions[lAlt], + !altPos || void 0 === altPos.alternation || (lastAlt = lAlt, alternation = getMaskSet().validPositions[lastAlt].alternation, + getTestTemplate(lastAlt).locator[altPos.alternation] === altPos.locator[altPos.alternation])); lAlt--) {} if (void 0 !== alternation) { lastAlt = parseInt(lastAlt); - for (var decisionPos in getMaskSet().validPositions) if (decisionPos = parseInt(decisionPos), - altPos = getMaskSet().validPositions[decisionPos], decisionPos >= lastAlt && void 0 !== altPos.alternation) { - var altNdxs; - 0 === lastAlt ? (altNdxs = [], $.each(getMaskSet().tests[lastAlt], function(ndx, test) { - void 0 !== test.locator[alternation] && (altNdxs = altNdxs.concat(test.locator[alternation].toString().split(","))); - })) : altNdxs = getMaskSet().validPositions[lastAlt].locator[alternation].toString().split(","); - var decisionTaker = void 0 !== altPos.locator[alternation] ? altPos.locator[alternation] : altNdxs[0]; - decisionTaker.length > 0 && (decisionTaker = decisionTaker.split(",")[0]); - for (var mndx = 0; mndx < altNdxs.length; mndx++) { - var validInputs = [], staticInputsBeforePos = 0, staticInputsBeforePosAlternate = 0; - if (decisionTaker < altNdxs[mndx]) { - for (var possibilityPos, possibilities, dp = decisionPos; dp >= 0; dp--) if (possibilityPos = getMaskSet().validPositions[dp], - void 0 !== possibilityPos) { - var bestMatch = selectBestMatch(dp, altNdxs[mndx]); - getMaskSet().validPositions[dp].match.def !== bestMatch.match.def && (validInputs.push(getMaskSet().validPositions[dp].input), - getMaskSet().validPositions[dp] = bestMatch, getMaskSet().validPositions[dp].input = getPlaceholder(dp), - null === getMaskSet().validPositions[dp].match.fn && staticInputsBeforePosAlternate++, - possibilityPos = bestMatch), possibilities = possibilityPos.locator[alternation], - possibilityPos.locator[alternation] = parseInt(altNdxs[mndx]); - break; - } - if (decisionTaker !== possibilityPos.locator[alternation]) { - for (i = decisionPos + 1; i < getLastValidPosition(void 0, !0) + 1; i++) validPos = getMaskSet().validPositions[i], - validPos && null != validPos.match.fn ? validInputs.push(validPos.input) : pos > i && staticInputsBeforePos++, - delete getMaskSet().validPositions[i], delete getMaskSet().tests[i]; - for (resetMaskSet(!0), opts.keepStatic = !opts.keepStatic, isValidRslt = !0; validInputs.length > 0; ) { - var input = validInputs.shift(); - if (input !== opts.skipOptionalPartCharacter && !(isValidRslt = isValid(getLastValidPosition(void 0, !0) + 1, input, !1, fromSetValid))) break; + for (var decisionPos in getMaskSet().validPositions) { + if (decisionPos = parseInt(decisionPos), + altPos = getMaskSet().validPositions[decisionPos], decisionPos >= lastAlt && void 0 !== altPos.alternation) { + var altNdxs; + lastAlt === 0 ? (altNdxs = [], $.each(getMaskSet().tests[lastAlt], function (ndx, test) { + void 0 !== test.locator[alternation] && (altNdxs = altNdxs.concat(test.locator[alternation].toString().split(","))); + })) : altNdxs = getMaskSet().validPositions[lastAlt].locator[alternation].toString().split(","); + var decisionTaker = void 0 !== altPos.locator[alternation] ? altPos.locator[alternation] : altNdxs[0]; + decisionTaker.length > 0 && (decisionTaker = decisionTaker.split(",")[0]); + for (var mndx = 0; mndx < altNdxs.length; mndx++) { + var validInputs = [], staticInputsBeforePos = 0, staticInputsBeforePosAlternate = 0; + if (decisionTaker < altNdxs[mndx]) { + for (var possibilityPos, possibilities, dp = decisionPos; dp >= 0; dp--) { + if (possibilityPos = getMaskSet().validPositions[dp], + void 0 !== possibilityPos) { + var bestMatch = selectBestMatch(dp, altNdxs[mndx]); + getMaskSet().validPositions[dp].match.def !== bestMatch.match.def && (validInputs.push(getMaskSet().validPositions[dp].input), + getMaskSet().validPositions[dp] = bestMatch, getMaskSet().validPositions[dp].input = getPlaceholder(dp), + getMaskSet().validPositions[dp].match.fn === null && staticInputsBeforePosAlternate++, + possibilityPos = bestMatch), possibilities = possibilityPos.locator[alternation], + possibilityPos.locator[alternation] = parseInt(altNdxs[mndx]); + break; + } } - if (possibilityPos.alternation = alternation, possibilityPos.locator[alternation] = possibilities, - isValidRslt) { - var targetLvp = getLastValidPosition(pos) + 1; - for (i = decisionPos + 1; i < getLastValidPosition() + 1; i++) validPos = getMaskSet().validPositions[i], - (void 0 === validPos || null == validPos.match.fn) && pos > i && staticInputsBeforePosAlternate++; - pos += staticInputsBeforePosAlternate - staticInputsBeforePos, isValidRslt = isValid(pos > targetLvp ? targetLvp : pos, c, strict, fromSetValid); + if (decisionTaker !== possibilityPos.locator[alternation]) { + for (i = decisionPos + 1; i < getLastValidPosition(void 0, !0) + 1; i++) { + validPos = getMaskSet().validPositions[i], + validPos && validPos.match.fn != null ? validInputs.push(validPos.input) : pos > i && staticInputsBeforePos++, + delete getMaskSet().validPositions[i], delete getMaskSet().tests[i]; + } + for (resetMaskSet(!0), opts.keepStatic = !opts.keepStatic, isValidRslt = !0; validInputs.length > 0; ) { + var input = validInputs.shift(); + if (input !== opts.skipOptionalPartCharacter && !(isValidRslt = isValid(getLastValidPosition(void 0, !0) + 1, input, !1, fromSetValid))) { + break; + } + } + if (possibilityPos.alternation = alternation, possibilityPos.locator[alternation] = possibilities, + isValidRslt) { + var targetLvp = getLastValidPosition(pos) + 1; + for (i = decisionPos + 1; i < getLastValidPosition() + 1; i++) { + validPos = getMaskSet().validPositions[i], + (void 0 === validPos || validPos.match.fn == null) && pos > i && staticInputsBeforePosAlternate++; + } + pos += staticInputsBeforePosAlternate - staticInputsBeforePos, isValidRslt = isValid(pos > targetLvp ? targetLvp : pos, c, strict, fromSetValid); + } + if (opts.keepStatic = !opts.keepStatic, isValidRslt) { + return isValidRslt; + } + resetMaskSet(), getMaskSet().validPositions = $.extend(!0, {}, validPsClone), getMaskSet().tests = $.extend(!0, {}, testsClone); } - if (opts.keepStatic = !opts.keepStatic, isValidRslt) return isValidRslt; - resetMaskSet(), getMaskSet().validPositions = $.extend(!0, {}, validPsClone), getMaskSet().tests = $.extend(!0, {}, testsClone); } } + break; } - break; } } return !1; } - function trackbackAlternations(originalPos, newPos) { - for (var vp = getMaskSet().validPositions[newPos], targetLocator = vp.locator, tll = targetLocator.length, ps = originalPos; newPos > ps; ps++) if (void 0 === getMaskSet().validPositions[ps] && !isMask(ps, !0)) { - var tests = getTests(ps), bestMatch = tests[0], equality = -1; - $.each(tests, function(ndx, tst) { - for (var i = 0; tll > i && (void 0 !== tst.locator[i] && checkAlternationMatch(tst.locator[i].toString().split(","), targetLocator[i].toString().split(","))); i++) i > equality && (equality = i, - bestMatch = tst); - }), setValidPosition(ps, $.extend({}, bestMatch, { - input: bestMatch.match.placeholder || bestMatch.match.def - }), !0); + function trackbackAlternations (originalPos, newPos) { + for (var vp = getMaskSet().validPositions[newPos], targetLocator = vp.locator, tll = targetLocator.length, ps = originalPos; newPos > ps; ps++) { + if (void 0 === getMaskSet().validPositions[ps] && !isMask(ps, !0)) { + var tests = getTests(ps), bestMatch = tests[0], equality = -1; + $.each(tests, function (ndx, tst) { + for (var i = 0; tll > i && (void 0 !== tst.locator[i] && checkAlternationMatch(tst.locator[i].toString().split(","), targetLocator[i].toString().split(","))); i++) { + i > equality && (equality = i, + bestMatch = tst); + } + }), setValidPosition(ps, $.extend({}, bestMatch, { + input: bestMatch.match.placeholder || bestMatch.match.def, + }), !0); + } } } strict = strict === !0; - for (var buffer = getBuffer(), pndx = pos - 1; pndx > -1 && !getMaskSet().validPositions[pndx]; pndx--) ; - for (pndx++; pos > pndx; pndx++) void 0 === getMaskSet().validPositions[pndx] && ((!isMask(pndx) || buffer[pndx] !== getPlaceholder(pndx)) && getTests(pndx).length > 1 || buffer[pndx] === opts.radixPoint || "0" === buffer[pndx] && $.inArray(opts.radixPoint, buffer) < pndx) && _isValid(pndx, buffer[pndx], !0, fromSetValid); + for (var buffer = getBuffer(), pndx = pos - 1; pndx > -1 && !getMaskSet().validPositions[pndx]; pndx--) {} + for (pndx++; pos > pndx; pndx++) { + void 0 === getMaskSet().validPositions[pndx] && ((!isMask(pndx) || buffer[pndx] !== getPlaceholder(pndx)) && getTests(pndx).length > 1 || buffer[pndx] === opts.radixPoint || buffer[pndx] === "0" && $.inArray(opts.radixPoint, buffer) < pndx) && _isValid(pndx, buffer[pndx], !0, fromSetValid); + } var maskPos = pos, result = !1, positionsClone = $.extend(!0, {}, getMaskSet().validPositions); - if (maskPos < getMaskLength() && (result = _isValid(maskPos, c, strict, fromSetValid), + if (maskPos < getMaskLength() && (result = _isValid(maskPos, c, strict, fromSetValid), (!strict || fromSetValid === !0) && result === !1)) { var currentPosValid = getMaskSet().validPositions[maskPos]; - if (!currentPosValid || null !== currentPosValid.match.fn || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) { + if (!currentPosValid || currentPosValid.match.fn !== null || currentPosValid.match.def !== c && c !== opts.skipOptionalPartCharacter) { if ((opts.insertMode || void 0 === getMaskSet().validPositions[seekNext(maskPos)]) && !isMask(maskPos, !0)) { var staticChar = getTestTemplate(maskPos).match, staticChar = staticChar.placeholder || staticChar.def; _isValid(maskPos, staticChar, strict, fromSetValid); - for (var nPos = maskPos + 1, snPos = seekNext(maskPos); snPos >= nPos; nPos++) if (result = _isValid(nPos, c, strict, fromSetValid), - result !== !1) { - trackbackAlternations(maskPos, nPos), maskPos = nPos; - break; + for (var nPos = maskPos + 1, snPos = seekNext(maskPos); snPos >= nPos; nPos++) { + if (result = _isValid(nPos, c, strict, fromSetValid), + result !== !1) { + trackbackAlternations(maskPos, nPos), maskPos = nPos; + break; + } } } - } else result = { - caret: seekNext(maskPos) - }; + } else { + result = { + caret: seekNext(maskPos), + }; + } } - if (result === !1 && opts.keepStatic && (result = alternate(pos, c, strict, fromSetValid)), + if (result === !1 && opts.keepStatic && (result = alternate(pos, c, strict, fromSetValid)), result === !0 && (result = { - pos: maskPos + pos: maskPos, }), $.isFunction(opts.postValidation) && result !== !1 && !strict && fromSetValid !== !0) { var postValidResult = opts.postValidation(getBuffer(!0), result, opts); if (postValidResult) { if (postValidResult.refreshFromBuffer) { var refresh = postValidResult.refreshFromBuffer; - refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, postValidResult.buffer), + refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, postValidResult.buffer), resetMaskSet(!0), result = postValidResult; } - } else resetMaskSet(!0), getMaskSet().validPositions = $.extend(!0, {}, positionsClone), - result = !1; + } else { + resetMaskSet(!0), getMaskSet().validPositions = $.extend(!0, {}, positionsClone), + result = !1; + } } return result; } - function isMask(pos, strict) { + function isMask (pos, strict) { var test; - if (strict ? (test = getTestTemplate(pos).match, "" == test.def && (test = getTest(pos))) : test = getTest(pos), - null != test.fn) return test.fn; + if (strict ? (test = getTestTemplate(pos).match, test.def == "" && (test = getTest(pos))) : test = getTest(pos), + test.fn != null) { + return test.fn; + } if (strict !== !0 && pos > -1 && !opts.keepStatic && void 0 === getMaskSet().validPositions[pos]) { var tests = getTests(pos); return tests.length > 2; } return !1; } - function getMaskLength() { + function getMaskLength () { var maskLength; - maxLength = void 0 !== el ? el.maxLength : void 0, -1 === maxLength && (maxLength = void 0); + maxLength = void 0 !== el ? el.maxLength : void 0, maxLength === -1 && (maxLength = void 0); var pos, lvp = getLastValidPosition(), testPos = getMaskSet().validPositions[lvp], ndxIntlzr = void 0 !== testPos ? testPos.locator.slice() : void 0; - for (pos = lvp + 1; void 0 === testPos || null !== testPos.match.fn || null === testPos.match.fn && "" !== testPos.match.def; pos++) testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), - ndxIntlzr = testPos.locator.slice(); + for (pos = lvp + 1; void 0 === testPos || testPos.match.fn !== null || testPos.match.fn === null && testPos.match.def !== ""; pos++) { + testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), + ndxIntlzr = testPos.locator.slice(); + } var lastTest = getTest(pos - 1); - return maskLength = "" !== lastTest.def ? pos : pos - 1, void 0 === maxLength || maxLength > maskLength ? maskLength : maxLength; + return maskLength = lastTest.def !== "" ? pos : pos - 1, void 0 === maxLength || maxLength > maskLength ? maskLength : maxLength; } - function seekNext(pos, newBlock) { + function seekNext (pos, newBlock) { var maskL = getMaskLength(); - if (pos >= maskL) return maskL; - for (var position = pos; ++position < maskL && (newBlock === !0 && (getTest(position).newBlockMarker !== !0 || !isMask(position)) || newBlock !== !0 && !isMask(position) && (opts.nojumps !== !0 || opts.nojumpsThreshold > position)); ) ; + if (pos >= maskL) { + return maskL; + } + for (var position = pos; ++position < maskL && (newBlock === !0 && (getTest(position).newBlockMarker !== !0 || !isMask(position)) || newBlock !== !0 && !isMask(position) && (opts.nojumps !== !0 || opts.nojumpsThreshold > position)); ) {} return position; } - function seekPrevious(pos, newBlock) { + function seekPrevious (pos, newBlock) { var position = pos; - if (0 >= position) return 0; - for (;--position > 0 && (newBlock === !0 && getTest(position).newBlockMarker !== !0 || newBlock !== !0 && !isMask(position)); ) ; + if (position <= 0) { + return 0; + } + for (;--position > 0 && (newBlock === !0 && getTest(position).newBlockMarker !== !0 || newBlock !== !0 && !isMask(position)); ) {} return position; } - function getBufferElement(position) { + function getBufferElement (position) { return void 0 === getMaskSet().validPositions[position] ? getPlaceholder(position) : getMaskSet().validPositions[position].input; } - function writeBuffer(input, buffer, caretPos, event, triggerInputEvent) { + function writeBuffer (input, buffer, caretPos, event, triggerInputEvent) { if (event && $.isFunction(opts.onBeforeWrite)) { var result = opts.onBeforeWrite(event, buffer, caretPos, opts); if (result) { if (result.refreshFromBuffer) { var refresh = result.refreshFromBuffer; - refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer || buffer), + refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer || buffer), buffer = getBuffer(!0); } void 0 !== caretPos && (caretPos = void 0 !== result.caret ? result.caret : caretPos); } } - input.inputmask._valueSet(buffer.join("")), void 0 === caretPos || void 0 !== event && "blur" === event.type || caret(input, caretPos), + input.inputmask._valueSet(buffer.join("")), void 0 === caretPos || void 0 !== event && event.type === "blur" || caret(input, caretPos), triggerInputEvent === !0 && (skipInputEvent = !0, $(input).trigger("input")); } - function getPlaceholder(pos, test) { - if (test = test || getTest(pos), void 0 !== test.placeholder) return test.placeholder; - if (null === test.fn) { + function getPlaceholder (pos, test) { + if (test = test || getTest(pos), void 0 !== test.placeholder) { + return test.placeholder; + } + if (test.fn === null) { if (pos > -1 && !opts.keepStatic && void 0 === getMaskSet().validPositions[pos]) { var prevTest, tests = getTests(pos), staticAlternations = 0; - if (tests.length > 2) for (var i = 0; i < tests.length; i++) if (tests[i].match.optionality !== !0 && tests[i].match.optionalQuantifier !== !0 && (null === tests[i].match.fn || void 0 === prevTest || tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, !0, opts) !== !1) && (staticAlternations++, - null === tests[i].match.fn && (prevTest = tests[i]), staticAlternations > 1)) return opts.placeholder.charAt(pos % opts.placeholder.length); + if (tests.length > 2) { + for (var i = 0; i < tests.length; i++) { + if (tests[i].match.optionality !== !0 && tests[i].match.optionalQuantifier !== !0 && (tests[i].match.fn === null || void 0 === prevTest || tests[i].match.fn.test(prevTest.match.def, getMaskSet(), pos, !0, opts) !== !1) && (staticAlternations++, + tests[i].match.fn === null && (prevTest = tests[i]), staticAlternations > 1)) { + return opts.placeholder.charAt(pos % opts.placeholder.length); + } + } + } } return test.def; } return opts.placeholder.charAt(pos % opts.placeholder.length); } - function checkVal(input, writeOut, strict, nptvl) { - function isTemplateMatch() { + function checkVal (input, writeOut, strict, nptvl) { + function isTemplateMatch () { var isMatch = !1, charCodeNdx = getBufferTemplate().slice(initialNdx, seekNext(initialNdx)).join("").indexOf(charCodes); - if (-1 !== charCodeNdx && !isMask(initialNdx)) { + if (charCodeNdx !== -1 && !isMask(initialNdx)) { isMatch = !0; - for (var bufferTemplateArr = getBufferTemplate().slice(initialNdx, initialNdx + charCodeNdx), i = 0; i < bufferTemplateArr.length; i++) if (" " !== bufferTemplateArr[i]) { - isMatch = !1; - break; + for (var bufferTemplateArr = getBufferTemplate().slice(initialNdx, initialNdx + charCodeNdx), i = 0; i < bufferTemplateArr.length; i++) { + if (bufferTemplateArr[i] !== " ") { + isMatch = !1; + break; + } } } return isMatch; } var inputValue = nptvl.slice(), charCodes = "", initialNdx = 0; - if (resetMaskSet(), getMaskSet().p = seekNext(-1), !strict) if (opts.autoUnmask !== !0) { - var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(""), matches = inputValue.join("").match(new RegExp("^" + Inputmask.escapeRegex(staticInput), "g")); - matches && matches.length > 0 && (inputValue.splice(0, matches.length * staticInput.length), - initialNdx = seekNext(initialNdx)); - } else initialNdx = seekNext(initialNdx); - $.each(inputValue, function(ndx, charCode) { + if (resetMaskSet(), getMaskSet().p = seekNext(-1), !strict) { + if (opts.autoUnmask !== !0) { + var staticInput = getBufferTemplate().slice(0, seekNext(-1)).join(""), matches = inputValue.join("").match(new RegExp("^" + Inputmask.escapeRegex(staticInput), "g")); + matches && matches.length > 0 && (inputValue.splice(0, matches.length * staticInput.length), + initialNdx = seekNext(initialNdx)); + } else { + initialNdx = seekNext(initialNdx); + } + } + $.each(inputValue, function (ndx, charCode) { if (void 0 !== charCode) { var keypress = new $.Event("keypress"); keypress.which = charCode.charCodeAt(0), charCodes += charCode; var lvp = getLastValidPosition(void 0, !0), lvTest = getMaskSet().validPositions[lvp], nextTest = getTestTemplate(lvp + 1, lvTest ? lvTest.locator.slice() : void 0, lvp); if (!isTemplateMatch() || strict || opts.autoUnmask) { - var pos = strict ? ndx : null == nextTest.match.fn && nextTest.match.optionality && lvp + 1 < getMaskSet().p ? lvp + 1 : getMaskSet().p; - keypressEvent.call(input, keypress, !0, !1, strict, pos), initialNdx = pos + 1, + var pos = strict ? ndx : nextTest.match.fn == null && nextTest.match.optionality && lvp + 1 < getMaskSet().p ? lvp + 1 : getMaskSet().p; + keypressEvent.call(input, keypress, !0, !1, strict, pos), initialNdx = pos + 1, charCodes = ""; - } else keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1); + } else { + keypressEvent.call(input, keypress, !0, !1, !0, lvp + 1); + } } }), writeOut && writeBuffer(input, getBuffer(), document.activeElement === input ? seekNext(getLastValidPosition(0)) : void 0, new $.Event("checkval")); } - function unmaskedvalue(input) { - if (input && void 0 === input.inputmask) return input.value; + function unmaskedvalue (input) { + if (input && void 0 === input.inputmask) { + return input.value; + } var umValue = [], vps = getMaskSet().validPositions; - for (var pndx in vps) vps[pndx].match && null != vps[pndx].match.fn && umValue.push(vps[pndx].input); - var unmaskedValue = 0 === umValue.length ? null : (isRTL ? umValue.reverse() : umValue).join(""); - if (null !== unmaskedValue) { + for (var pndx in vps) { + vps[pndx].match && vps[pndx].match.fn != null && umValue.push(vps[pndx].input); + } + var unmaskedValue = umValue.length === 0 ? null : (isRTL ? umValue.reverse() : umValue).join(""); + if (unmaskedValue !== null) { var bufferValue = (isRTL ? getBuffer().slice().reverse() : getBuffer()).join(""); $.isFunction(opts.onUnMask) && (unmaskedValue = opts.onUnMask(bufferValue, unmaskedValue, opts) || unmaskedValue); } return unmaskedValue; } - function caret(input, begin, end, notranslate) { - function translatePosition(pos) { - if (notranslate !== !0 && isRTL && "number" == typeof pos && (!opts.greedy || "" !== opts.placeholder)) { + function caret (input, begin, end, notranslate) { + function translatePosition (pos) { + if (notranslate !== !0 && isRTL && typeof pos === "number" && (!opts.greedy || opts.placeholder !== "")) { var bffrLght = getBuffer().join("").length; pos = bffrLght - pos; } return pos; } var range; - if ("number" != typeof begin) return input.setSelectionRange ? (begin = input.selectionStart, - end = input.selectionEnd) : window.getSelection ? (range = window.getSelection().getRangeAt(0), - (range.commonAncestorContainer.parentNode === input || range.commonAncestorContainer === input) && (begin = range.startOffset, - end = range.endOffset)) : document.selection && document.selection.createRange && (range = document.selection.createRange(), - begin = 0 - range.duplicate().moveStart("character", -1e5), end = begin + range.text.length), - { - begin: translatePosition(begin), - end: translatePosition(end) - }; - begin = translatePosition(begin), end = translatePosition(end), end = "number" == typeof end ? end : begin; + if (typeof begin !== "number") { + return input.setSelectionRange ? (begin = input.selectionStart, + end = input.selectionEnd) : window.getSelection ? (range = window.getSelection().getRangeAt(0), + (range.commonAncestorContainer.parentNode === input || range.commonAncestorContainer === input) && (begin = range.startOffset, + end = range.endOffset)) : document.selection && document.selection.createRange && (range = document.selection.createRange(), + begin = 0 - range.duplicate().moveStart("character", -1e5), end = begin + range.text.length), + { + begin: translatePosition(begin), + end: translatePosition(end), + }; + } + begin = translatePosition(begin), end = translatePosition(end), end = typeof end === "number" ? end : begin; var scrollCalc = parseInt(((input.ownerDocument.defaultView || window).getComputedStyle ? (input.ownerDocument.defaultView || window).getComputedStyle(input, null) : input.currentStyle).fontSize) * end; - if (input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0, mobile || opts.insertMode !== !1 || begin !== end || end++, - input.setSelectionRange) input.selectionStart = begin, input.selectionEnd = end; else if (window.getSelection) { - if (range = document.createRange(), void 0 === input.firstChild || null === input.firstChild) { + if (input.scrollLeft = scrollCalc > input.scrollWidth ? scrollCalc : 0, mobile || opts.insertMode !== !1 || begin !== end || end++, + input.setSelectionRange) { + input.selectionStart = begin, input.selectionEnd = end; + } else if (window.getSelection) { + if (range = document.createRange(), void 0 === input.firstChild || input.firstChild === null) { var textNode = document.createTextNode(""); input.appendChild(textNode); } - range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length), - range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length), + range.setStart(input.firstChild, begin < input.inputmask._valueGet().length ? begin : input.inputmask._valueGet().length), + range.setEnd(input.firstChild, end < input.inputmask._valueGet().length ? end : input.inputmask._valueGet().length), range.collapse(!0); var sel = window.getSelection(); sel.removeAllRanges(), sel.addRange(range); - } else input.createTextRange && (range = input.createTextRange(), range.collapse(!0), - range.moveEnd("character", end), range.moveStart("character", begin), range.select()); + } else { + input.createTextRange && (range = input.createTextRange(), range.collapse(!0), + range.moveEnd("character", end), range.moveStart("character", begin), range.select()); + } } - function determineLastRequiredPosition(returnDefinition) { + function determineLastRequiredPosition (returnDefinition) { var pos, testPos, buffer = getBuffer(), bl = buffer.length, lvp = getLastValidPosition(), positions = {}, lvTest = getMaskSet().validPositions[lvp], ndxIntlzr = void 0 !== lvTest ? lvTest.locator.slice() : void 0; - for (pos = lvp + 1; pos < buffer.length; pos++) testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), - ndxIntlzr = testPos.locator.slice(), positions[pos] = $.extend(!0, {}, testPos); + for (pos = lvp + 1; pos < buffer.length; pos++) { + testPos = getTestTemplate(pos, ndxIntlzr, pos - 1), + ndxIntlzr = testPos.locator.slice(), positions[pos] = $.extend(!0, {}, testPos); + } var lvTestAlt = lvTest && void 0 !== lvTest.alternation ? lvTest.locator[lvTest.alternation] : void 0; - for (pos = bl - 1; pos > lvp && (testPos = positions[pos], (testPos.match.optionality || testPos.match.optionalQuantifier || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && null != testPos.match.fn || null === testPos.match.fn && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAlt.toString().split(",")) && "" !== getTests(pos)[0].def)) && buffer[pos] === getPlaceholder(pos, testPos.match)); pos--) bl--; + for (pos = bl - 1; pos > lvp && (testPos = positions[pos], (testPos.match.optionality || testPos.match.optionalQuantifier || lvTestAlt && (lvTestAlt !== positions[pos].locator[lvTest.alternation] && testPos.match.fn != null || testPos.match.fn === null && testPos.locator[lvTest.alternation] && checkAlternationMatch(testPos.locator[lvTest.alternation].toString().split(","), lvTestAlt.toString().split(",")) && getTests(pos)[0].def !== "")) && buffer[pos] === getPlaceholder(pos, testPos.match)); pos--) { + bl--; + } return returnDefinition ? { l: bl, - def: positions[bl] ? positions[bl].match : void 0 + def: positions[bl] ? positions[bl].match : void 0, } : bl; } - function clearOptionalTail(buffer) { - for (var rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) ; + function clearOptionalTail (buffer) { + for (var rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) {} return buffer.splice(rl, lmib + 1 - rl), buffer; } - function isComplete(buffer) { - if ($.isFunction(opts.isComplete)) return opts.isComplete(buffer, opts); - if ("*" === opts.repeat) return void 0; + function isComplete (buffer) { + if ($.isFunction(opts.isComplete)) { + return opts.isComplete(buffer, opts); + } + if (opts.repeat === "*") { + return void 0; + } var complete = !1, lrp = determineLastRequiredPosition(!0), aml = seekPrevious(lrp.l); if (void 0 === lrp.def || lrp.def.newBlockMarker || lrp.def.optionality || lrp.def.optionalQuantifier) { complete = !0; for (var i = 0; aml >= i; i++) { var test = getTestTemplate(i).match; - if (null !== test.fn && void 0 === getMaskSet().validPositions[i] && test.optionality !== !0 && test.optionalQuantifier !== !0 || null === test.fn && buffer[i] !== getPlaceholder(i, test)) { + if (test.fn !== null && void 0 === getMaskSet().validPositions[i] && test.optionality !== !0 && test.optionalQuantifier !== !0 || test.fn === null && buffer[i] !== getPlaceholder(i, test)) { complete = !1; break; } @@ -807,140 +993,156 @@ } return complete; } - function isSelection(begin, end) { + function isSelection (begin, end) { return isRTL ? begin - end > 1 || begin - end === 1 && opts.insertMode : end - begin > 1 || end - begin === 1 && opts.insertMode; } - function patchValueProperty(npt) { - function patchValhook(type) { + function patchValueProperty (npt) { + function patchValhook (type) { if ($.valHooks && (void 0 === $.valHooks[type] || $.valHooks[type].inputmaskpatch !== !0)) { - var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function(elem) { - return elem.value; - }, valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function(elem, value) { - return elem.value = value, elem; - }; + var valhookGet = $.valHooks[type] && $.valHooks[type].get ? $.valHooks[type].get : function (elem) { + return elem.value; + }, valhookSet = $.valHooks[type] && $.valHooks[type].set ? $.valHooks[type].set : function (elem, value) { + return elem.value = value, elem; + }; $.valHooks[type] = { - get: function(elem) { + get: function (elem) { if (elem.inputmask) { - if (elem.inputmask.opts.autoUnmask) return elem.inputmask.unmaskedvalue(); + if (elem.inputmask.opts.autoUnmask) { + return elem.inputmask.unmaskedvalue(); + } var result = valhookGet(elem), maskset = elem.inputmask.maskset, bufferTemplate = maskset._buffer; return bufferTemplate = bufferTemplate ? bufferTemplate.join("") : "", result !== bufferTemplate ? result : ""; } return valhookGet(elem); }, - set: function(elem, value) { + set: function (elem, value) { var result, $elem = $(elem); - return result = valhookSet(elem, value), elem.inputmask && $elem.trigger("setvalue"), + return result = valhookSet(elem, value), elem.inputmask && $elem.trigger("setvalue"), result; }, - inputmaskpatch: !0 + inputmaskpatch: !0, }; } } - function getter() { + function getter () { return this.inputmask ? this.inputmask.opts.autoUnmask ? this.inputmask.unmaskedvalue() : valueGet.call(this) !== getBufferTemplate().join("") ? document.activeElement === this && opts.clearMaskOnLostFocus ? (isRTL ? clearOptionalTail(getBuffer().slice()).reverse() : clearOptionalTail(getBuffer().slice())).join("") : valueGet.call(this) : "" : valueGet.call(this); } - function setter(value) { + function setter (value) { valueSet.call(this, value), this.inputmask && $(this).trigger("setvalue"); } - function installNativeValueSetFallback(npt) { - EventRuler.on(npt, "mouseenter", function(event) { + function installNativeValueSetFallback (npt) { + EventRuler.on(npt, "mouseenter", function (event) { var $input = $(this), input = this, value = input.inputmask._valueGet(); value !== getBuffer().join("") && getLastValidPosition() > 0 && $input.trigger("setvalue"); }); } var valueGet, valueSet; - npt.inputmask.__valueGet || (Object.getOwnPropertyDescriptor && void 0 === npt.value ? (valueGet = function() { + npt.inputmask.__valueGet || (Object.getOwnPropertyDescriptor && void 0 === npt.value ? (valueGet = function () { return this.textContent; - }, valueSet = function(value) { + }, valueSet = function (value) { this.textContent = value; }, Object.defineProperty(npt, "value", { get: getter, - set: setter - })) : document.__lookupGetter__ && npt.__lookupGetter__("value") ? (valueGet = npt.__lookupGetter__("value"), - valueSet = npt.__lookupSetter__("value"), npt.__defineGetter__("value", getter), - npt.__defineSetter__("value", setter)) : (valueGet = function() { + set: setter, + })) : document.__lookupGetter__ && npt.__lookupGetter__("value") ? (valueGet = npt.__lookupGetter__("value"), + valueSet = npt.__lookupSetter__("value"), npt.__defineGetter__("value", getter), + npt.__defineSetter__("value", setter)) : (valueGet = function () { return npt.value; - }, valueSet = function(value) { + }, valueSet = function (value) { npt.value = value; - }, patchValhook(npt.type), installNativeValueSetFallback(npt)), npt.inputmask.__valueGet = valueGet, - npt.inputmask._valueGet = function(overruleRTL) { + }, patchValhook(npt.type), installNativeValueSetFallback(npt)), npt.inputmask.__valueGet = valueGet, + npt.inputmask._valueGet = function (overruleRTL) { return isRTL && overruleRTL !== !0 ? valueGet.call(this.el).split("").reverse().join("") : valueGet.call(this.el); - }, npt.inputmask.__valueSet = valueSet, npt.inputmask._valueSet = function(value, overruleRTL) { - valueSet.call(this.el, null === value || void 0 === value ? "" : overruleRTL !== !0 && isRTL ? value.split("").reverse().join("") : value); + }, npt.inputmask.__valueSet = valueSet, npt.inputmask._valueSet = function (value, overruleRTL) { + valueSet.call(this.el, value === null || void 0 === value ? "" : overruleRTL !== !0 && isRTL ? value.split("").reverse().join("") : value); }); } - function handleRemove(input, k, pos, strict) { - function generalize() { + function handleRemove (input, k, pos, strict) { + function generalize () { if (opts.keepStatic) { resetMaskSet(!0); var lastAlt, validInputs = [], positionsClone = $.extend(!0, {}, getMaskSet().validPositions); for (lastAlt = getLastValidPosition(); lastAlt >= 0; lastAlt--) { var validPos = getMaskSet().validPositions[lastAlt]; - if (validPos && (null != validPos.match.fn && validInputs.push(validPos.input), - delete getMaskSet().validPositions[lastAlt], void 0 !== validPos.alternation && validPos.locator[validPos.alternation] === getTestTemplate(lastAlt).locator[validPos.alternation])) break; + if (validPos && (validPos.match.fn != null && validInputs.push(validPos.input), + delete getMaskSet().validPositions[lastAlt], void 0 !== validPos.alternation && validPos.locator[validPos.alternation] === getTestTemplate(lastAlt).locator[validPos.alternation])) { + break; + } + } + if (lastAlt > -1) { + for (;validInputs.length > 0; ) { + getMaskSet().p = seekNext(getLastValidPosition()); + var keypress = new $.Event("keypress"); + keypress.which = validInputs.pop().charCodeAt(0), keypressEvent.call(input, keypress, !0, !1, !1, getMaskSet().p); + } + } else { + getMaskSet().validPositions = $.extend(!0, {}, positionsClone); } - if (lastAlt > -1) for (;validInputs.length > 0; ) { - getMaskSet().p = seekNext(getLastValidPosition()); - var keypress = new $.Event("keypress"); - keypress.which = validInputs.pop().charCodeAt(0), keypressEvent.call(input, keypress, !0, !1, !1, getMaskSet().p); - } else getMaskSet().validPositions = $.extend(!0, {}, positionsClone); } } - if ((opts.numericInput || isRTL) && (k === Inputmask.keyCode.BACKSPACE ? k = Inputmask.keyCode.DELETE : k === Inputmask.keyCode.DELETE && (k = Inputmask.keyCode.BACKSPACE), + if ((opts.numericInput || isRTL) && (k === Inputmask.keyCode.BACKSPACE ? k = Inputmask.keyCode.DELETE : k === Inputmask.keyCode.DELETE && (k = Inputmask.keyCode.BACKSPACE), isRTL)) { var pend = pos.end; pos.end = pos.begin, pos.begin = pend; } - k === Inputmask.keyCode.BACKSPACE && (pos.end - pos.begin < 1 || opts.insertMode === !1) ? (pos.begin = seekPrevious(pos.begin), - void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.begin--) : k === Inputmask.keyCode.DELETE && pos.begin === pos.end && (pos.end = isMask(pos.end) ? pos.end + 1 : seekNext(pos.end) + 1, - void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.end++), + k === Inputmask.keyCode.BACKSPACE && (pos.end - pos.begin < 1 || opts.insertMode === !1) ? (pos.begin = seekPrevious(pos.begin), + void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.begin--) : k === Inputmask.keyCode.DELETE && pos.begin === pos.end && (pos.end = isMask(pos.end) ? pos.end + 1 : seekNext(pos.end) + 1, + void 0 === getMaskSet().validPositions[pos.begin] || getMaskSet().validPositions[pos.begin].input !== opts.groupSeparator && getMaskSet().validPositions[pos.begin].input !== opts.radixPoint || pos.end++), stripValidPositions(pos.begin, pos.end, !1, strict), strict !== !0 && generalize(); var lvp = getLastValidPosition(pos.begin); - lvp < pos.begin ? (-1 === lvp && resetMaskSet(), getMaskSet().p = seekNext(lvp)) : strict !== !0 && (getMaskSet().p = pos.begin); + lvp < pos.begin ? (lvp === -1 && resetMaskSet(), getMaskSet().p = seekNext(lvp)) : strict !== !0 && (getMaskSet().p = pos.begin); } - function keydownEvent(e) { + function keydownEvent (e) { var input = this, $input = $(input), k = e.keyCode, pos = caret(input); - if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && 127 === k || e.ctrlKey && 88 === k && !isInputEventSupported("cut")) e.preventDefault(), - 88 === k && (undoValue = getBuffer().join("")), handleRemove(input, k, pos), writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), - input.inputmask._valueGet() === getBufferTemplate().join("") ? $input.trigger("cleared") : isComplete(getBuffer()) === !0 && $input.trigger("complete"), - opts.showTooltip && (input.title = opts.tooltip || getMaskSet().mask); else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) { + if (k === Inputmask.keyCode.BACKSPACE || k === Inputmask.keyCode.DELETE || iphone && k === 127 || e.ctrlKey && k === 88 && !isInputEventSupported("cut")) { + e.preventDefault(), + k === 88 && (undoValue = getBuffer().join("")), handleRemove(input, k, pos), writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), + input.inputmask._valueGet() === getBufferTemplate().join("") ? $input.trigger("cleared") : isComplete(getBuffer()) === !0 && $input.trigger("complete"), + opts.showTooltip && (input.title = opts.tooltip || getMaskSet().mask); + } else if (k === Inputmask.keyCode.END || k === Inputmask.keyCode.PAGE_DOWN) { e.preventDefault(); var caretPos = seekNext(getLastValidPosition()); opts.insertMode || caretPos !== getMaskLength() || e.shiftKey || caretPos--, caret(input, e.shiftKey ? pos.begin : caretPos, caretPos, !0); - } else k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP ? (e.preventDefault(), - caret(input, 0, e.shiftKey ? pos.begin : 0, !0)) : (opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || 90 === k && e.ctrlKey) && e.altKey !== !0 ? (checkVal(input, !0, !1, undoValue.split("")), - $input.trigger("click")) : k !== Inputmask.keyCode.INSERT || e.shiftKey || e.ctrlKey ? opts.tabThrough === !0 && k === Inputmask.keyCode.TAB ? (e.shiftKey === !0 ? (null === getTest(pos.begin).fn && (pos.begin = seekNext(pos.begin)), - pos.end = seekPrevious(pos.begin, !0), pos.begin = seekPrevious(pos.end, !0)) : (pos.begin = seekNext(pos.begin, !0), - pos.end = seekNext(pos.begin, !0), pos.end < getMaskLength() && pos.end--), pos.begin < getMaskLength() && (e.preventDefault(), - caret(input, pos.begin, pos.end))) : opts.insertMode !== !1 || e.shiftKey || (k === Inputmask.keyCode.RIGHT ? setTimeout(function() { - var caretPos = caret(input); - caret(input, caretPos.begin); - }, 0) : k === Inputmask.keyCode.LEFT && setTimeout(function() { - var caretPos = caret(input); - caret(input, isRTL ? caretPos.begin + 1 : caretPos.begin - 1); - }, 0)) : (opts.insertMode = !opts.insertMode, caret(input, opts.insertMode || pos.begin !== getMaskLength() ? pos.begin : pos.begin - 1)); - opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts), ignorable = -1 !== $.inArray(k, opts.ignorables); + } else { + k === Inputmask.keyCode.HOME && !e.shiftKey || k === Inputmask.keyCode.PAGE_UP ? (e.preventDefault(), + caret(input, 0, e.shiftKey ? pos.begin : 0, !0)) : (opts.undoOnEscape && k === Inputmask.keyCode.ESCAPE || k === 90 && e.ctrlKey) && e.altKey !== !0 ? (checkVal(input, !0, !1, undoValue.split("")), + $input.trigger("click")) : k !== Inputmask.keyCode.INSERT || e.shiftKey || e.ctrlKey ? opts.tabThrough === !0 && k === Inputmask.keyCode.TAB ? (e.shiftKey === !0 ? (getTest(pos.begin).fn === null && (pos.begin = seekNext(pos.begin)), + pos.end = seekPrevious(pos.begin, !0), pos.begin = seekPrevious(pos.end, !0)) : (pos.begin = seekNext(pos.begin, !0), + pos.end = seekNext(pos.begin, !0), pos.end < getMaskLength() && pos.end--), pos.begin < getMaskLength() && (e.preventDefault(), + caret(input, pos.begin, pos.end))) : opts.insertMode !== !1 || e.shiftKey || (k === Inputmask.keyCode.RIGHT ? setTimeout(function () { + var caretPos = caret(input); + caret(input, caretPos.begin); + }, 0) : k === Inputmask.keyCode.LEFT && setTimeout(function () { + var caretPos = caret(input); + caret(input, isRTL ? caretPos.begin + 1 : caretPos.begin - 1); + }, 0)) : (opts.insertMode = !opts.insertMode, caret(input, opts.insertMode || pos.begin !== getMaskLength() ? pos.begin : pos.begin - 1)); + } + opts.onKeyDown.call(this, e, getBuffer(), caret(input).begin, opts), ignorable = $.inArray(k, opts.ignorables) !== -1; } - function keypressEvent(e, checkval, writeOut, strict, ndx) { + function keypressEvent (e, checkval, writeOut, strict, ndx) { var input = this, $input = $(input), k = e.which || e.charCode || e.keyCode; - if (!(checkval === !0 || e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) return k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join("") && (undoValue = getBuffer().join(""), - setTimeout(function() { - $input.trigger("change"); - }, 0)), !0; + if (!(checkval === !0 || e.ctrlKey && e.altKey) && (e.ctrlKey || e.metaKey || ignorable)) { + return k === Inputmask.keyCode.ENTER && undoValue !== getBuffer().join("") && (undoValue = getBuffer().join(""), + setTimeout(function () { + $input.trigger("change"); + }, 0)), !0; + } if (k) { - 46 === k && e.shiftKey === !1 && "," === opts.radixPoint && (k = 44); + k === 46 && e.shiftKey === !1 && opts.radixPoint === "," && (k = 44); var forwardPosition, pos = checkval ? { - begin: ndx, - end: ndx - } : caret(input), c = String.fromCharCode(k), isSlctn = isSelection(pos.begin, pos.end); - isSlctn && (getMaskSet().undoPositions = $.extend(!0, {}, getMaskSet().validPositions), - handleRemove(input, Inputmask.keyCode.DELETE, pos, !0), pos.begin = getMaskSet().p, - opts.insertMode || (opts.insertMode = !opts.insertMode, setValidPosition(pos.begin, strict), + begin: ndx, + end: ndx, + } : caret(input), c = String.fromCharCode(k), isSlctn = isSelection(pos.begin, pos.end); + isSlctn && (getMaskSet().undoPositions = $.extend(!0, {}, getMaskSet().validPositions), + handleRemove(input, Inputmask.keyCode.DELETE, pos, !0), pos.begin = getMaskSet().p, + opts.insertMode || (opts.insertMode = !opts.insertMode, setValidPosition(pos.begin, strict), opts.insertMode = !opts.insertMode), isSlctn = !opts.multi), getMaskSet().writeOutBuffer = !0; var p = isRTL && !isSlctn ? pos.end : pos.begin, valResult = isValid(p, c, strict); if (valResult !== !1) { - if (valResult !== !0 && (p = void 0 !== valResult.pos ? valResult.pos : p, c = void 0 !== valResult.c ? valResult.c : c), - resetMaskSet(!0), void 0 !== valResult.caret) forwardPosition = valResult.caret; else { + if (valResult !== !0 && (p = void 0 !== valResult.pos ? valResult.pos : p, c = void 0 !== valResult.c ? valResult.c : c), + resetMaskSet(!0), void 0 !== valResult.caret) { + forwardPosition = valResult.caret; + } else { var vps = getMaskSet().validPositions; forwardPosition = !opts.keepStatic && (void 0 !== vps[p + 1] && getTests(p + 1, vps[p].locator.slice(), p).length > 1 || void 0 !== vps[p].alternation) ? p + 1 : seekNext(p); } @@ -948,111 +1150,129 @@ } if (writeOut !== !1) { var self = this; - if (setTimeout(function() { + if (setTimeout(function () { opts.onKeyValidation.call(self, k, valResult, opts); }, 0), getMaskSet().writeOutBuffer && valResult !== !1) { var buffer = getBuffer(); - writeBuffer(input, buffer, opts.numericInput && void 0 === valResult.caret ? seekPrevious(forwardPosition) : forwardPosition, e, checkval !== !0), - checkval !== !0 && setTimeout(function() { + writeBuffer(input, buffer, opts.numericInput && void 0 === valResult.caret ? seekPrevious(forwardPosition) : forwardPosition, e, checkval !== !0), + checkval !== !0 && setTimeout(function () { isComplete(buffer) === !0 && $input.trigger("complete"); }, 0); - } else isSlctn && (getMaskSet().buffer = void 0, getMaskSet().validPositions = getMaskSet().undoPositions); - } else isSlctn && (getMaskSet().buffer = void 0, getMaskSet().validPositions = getMaskSet().undoPositions); + } else { + isSlctn && (getMaskSet().buffer = void 0, getMaskSet().validPositions = getMaskSet().undoPositions); + } + } else { + isSlctn && (getMaskSet().buffer = void 0, getMaskSet().validPositions = getMaskSet().undoPositions); + } if (opts.showTooltip && (input.title = opts.tooltip || getMaskSet().mask), checkval && $.isFunction(opts.onBeforeWrite)) { var result = opts.onBeforeWrite(e, getBuffer(), forwardPosition, opts); if (result && result.refreshFromBuffer) { var refresh = result.refreshFromBuffer; - refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), + refreshFromBuffer(refresh === !0 ? refresh : refresh.start, refresh.end, result.buffer), resetMaskSet(!0), result.caret && (getMaskSet().p = result.caret); } } - if (e.preventDefault(), checkval) return valResult; + if (e.preventDefault(), checkval) { + return valResult; + } } } - function pasteEvent(e) { + function pasteEvent (e) { var input = this, ev = e.originalEvent || e, $input = $(input), inputValue = input.inputmask._valueGet(!0), caretPos = caret(input), valueBeforeCaret = inputValue.substr(0, caretPos.begin), valueAfterCaret = inputValue.substr(caretPos.end, inputValue.length); - valueBeforeCaret === getBufferTemplate().slice(0, caretPos.begin).join("") && (valueBeforeCaret = ""), - valueAfterCaret === getBufferTemplate().slice(caretPos.end).join("") && (valueAfterCaret = ""), + valueBeforeCaret === getBufferTemplate().slice(0, caretPos.begin).join("") && (valueBeforeCaret = ""), + valueAfterCaret === getBufferTemplate().slice(caretPos.end).join("") && (valueAfterCaret = ""), window.clipboardData && window.clipboardData.getData ? inputValue = valueBeforeCaret + window.clipboardData.getData("Text") + valueAfterCaret : ev.clipboardData && ev.clipboardData.getData && (inputValue = valueBeforeCaret + ev.clipboardData.getData("text/plain") + valueAfterCaret); var pasteValue = inputValue; if ($.isFunction(opts.onBeforePaste)) { - if (pasteValue = opts.onBeforePaste(inputValue, opts), pasteValue === !1) return e.preventDefault(), - !1; + if (pasteValue = opts.onBeforePaste(inputValue, opts), pasteValue === !1) { + return e.preventDefault(), + !1; + } pasteValue || (pasteValue = inputValue); } - return checkVal(input, !1, !1, isRTL ? pasteValue.split("").reverse() : pasteValue.toString().split("")), - writeBuffer(input, getBuffer(), void 0, e, !0), $input.trigger("click"), isComplete(getBuffer()) === !0 && $input.trigger("complete"), + return checkVal(input, !1, !1, isRTL ? pasteValue.split("").reverse() : pasteValue.toString().split("")), + writeBuffer(input, getBuffer(), void 0, e, !0), $input.trigger("click"), isComplete(getBuffer()) === !0 && $input.trigger("complete"), !1; } - function inputFallBackEvent(e) { + function inputFallBackEvent (e) { var input = this, inputValue = input.inputmask._valueGet(); if (getBuffer().join("") !== inputValue) { var caretPos = caret(input); - if (inputValue = inputValue.replace(new RegExp("(" + Inputmask.escapeRegex(getBufferTemplate().join("")) + ")*"), ""), + if (inputValue = inputValue.replace(new RegExp("(" + Inputmask.escapeRegex(getBufferTemplate().join("")) + ")*"), ""), iemobile) { var inputChar = inputValue.replace(getBuffer().join(""), ""); - if (1 === inputChar.length) { + if (inputChar.length === 1) { var keypress = new $.Event("keypress"); - return keypress.which = inputChar.charCodeAt(0), keypressEvent.call(input, keypress, !0, !0, !1, getMaskSet().validPositions[caretPos.begin - 1] ? caretPos.begin : caretPos.begin - 1), + return keypress.which = inputChar.charCodeAt(0), keypressEvent.call(input, keypress, !0, !0, !1, getMaskSet().validPositions[caretPos.begin - 1] ? caretPos.begin : caretPos.begin - 1), !1; } } - if (caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)), + if (caretPos.begin > inputValue.length && (caret(input, inputValue.length), caretPos = caret(input)), getBuffer().length - inputValue.length !== 1 || inputValue.charAt(caretPos.begin) === getBuffer()[caretPos.begin] || inputValue.charAt(caretPos.begin + 1) === getBuffer()[caretPos.begin] || isMask(caretPos.begin)) { - for (var lvp = getLastValidPosition() + 1, bufferTemplate = getBuffer().slice(lvp).join(""); null === inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$"); ) bufferTemplate = bufferTemplate.slice(1); - inputValue = inputValue.replace(bufferTemplate, ""), inputValue = inputValue.split(""), + for (var lvp = getLastValidPosition() + 1, bufferTemplate = getBuffer().slice(lvp).join(""); inputValue.match(Inputmask.escapeRegex(bufferTemplate) + "$") === null; ) { + bufferTemplate = bufferTemplate.slice(1); + } + inputValue = inputValue.replace(bufferTemplate, ""), inputValue = inputValue.split(""), checkVal(input, !0, !1, inputValue), isComplete(getBuffer()) === !0 && $(input).trigger("complete"); - } else e.keyCode = Inputmask.keyCode.BACKSPACE, keydownEvent.call(input, e); + } else { + e.keyCode = Inputmask.keyCode.BACKSPACE, keydownEvent.call(input, e); + } e.preventDefault(); } } - function compositionStartEvent(e) { + function compositionStartEvent (e) { var ev = e.originalEvent || e; - undoValue = getBuffer().join(""), "" === compositionData || 0 !== ev.data.indexOf(compositionData); + undoValue = getBuffer().join(""), compositionData === "" || ev.data.indexOf(compositionData) !== 0; } - function compositionUpdateEvent(e) { + function compositionUpdateEvent (e) { var input = this, ev = e.originalEvent || e, inputBuffer = getBuffer().join(""); - 0 === ev.data.indexOf(compositionData) && (resetMaskSet(), getMaskSet().p = seekNext(-1)); + ev.data.indexOf(compositionData) === 0 && (resetMaskSet(), getMaskSet().p = seekNext(-1)); for (var newData = ev.data, i = 0; i < newData.length; i++) { var keypress = new $.Event("keypress"); - keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, + keypress.which = newData.charCodeAt(i), skipKeyPressEvent = !1, ignorable = !1, keypressEvent.call(input, keypress, !0, !1, !1, getMaskSet().p); } - inputBuffer !== getBuffer().join("") && setTimeout(function() { + inputBuffer !== getBuffer().join("") && setTimeout(function () { var forwardPosition = getMaskSet().p; writeBuffer(input, getBuffer(), opts.numericInput ? seekPrevious(forwardPosition) : forwardPosition); }, 0), compositionData = ev.data; } - function compositionEndEvent(e) {} - function setValueEvent(e) { + function compositionEndEvent (e) {} + function setValueEvent (e) { var input = this, value = input.inputmask._valueGet(); - checkVal(input, !0, !1, ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(value, opts) || value : value).split("")), + checkVal(input, !0, !1, ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(value, opts) || value : value).split("")), undoValue = getBuffer().join(""), (opts.clearMaskOnLostFocus || opts.clearIncomplete) && input.inputmask._valueGet() === getBufferTemplate().join("") && input.inputmask._valueSet(""); } - function focusEvent(e) { + function focusEvent (e) { var input = this, nptValue = input.inputmask._valueGet(); - opts.showMaskOnFocus && (!opts.showMaskOnHover || opts.showMaskOnHover && "" === nptValue) ? input.inputmask._valueGet() !== getBuffer().join("") && writeBuffer(input, getBuffer(), seekNext(getLastValidPosition())) : mouseEnter === !1 && caret(input, seekNext(getLastValidPosition())), - opts.positionCaretOnTab === !0 && setTimeout(function() { + opts.showMaskOnFocus && (!opts.showMaskOnHover || opts.showMaskOnHover && nptValue === "") ? input.inputmask._valueGet() !== getBuffer().join("") && writeBuffer(input, getBuffer(), seekNext(getLastValidPosition())) : mouseEnter === !1 && caret(input, seekNext(getLastValidPosition())), + opts.positionCaretOnTab === !0 && setTimeout(function () { caret(input, seekNext(getLastValidPosition())); }, 0), undoValue = getBuffer().join(""); } - function mouseleaveEvent(e) { + function mouseleaveEvent (e) { var input = this; if (mouseEnter = !1, opts.clearMaskOnLostFocus && document.activeElement !== input) { var buffer = getBuffer().slice(), nptValue = input.inputmask._valueGet(); - nptValue !== input.getAttribute("placeholder") && "" !== nptValue && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer), + nptValue !== input.getAttribute("placeholder") && nptValue !== "" && (getLastValidPosition() === -1 && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer), writeBuffer(input, buffer)); } } - function clickEvent(e) { - function doRadixFocus(clickPos) { - if (opts.radixFocus && "" !== opts.radixPoint) { + function clickEvent (e) { + function doRadixFocus (clickPos) { + if (opts.radixFocus && opts.radixPoint !== "") { var vps = getMaskSet().validPositions; if (void 0 === vps[clickPos] || vps[clickPos].input === getPlaceholder(clickPos)) { - if (clickPos < seekNext(-1)) return !0; + if (clickPos < seekNext(-1)) { + return !0; + } var radixPos = $.inArray(opts.radixPoint, getBuffer()); - if (-1 !== radixPos) { - for (var vp in vps) if (vp > radixPos && vps[vp].input !== getPlaceholder(vp)) return !1; + if (radixPos !== -1) { + for (var vp in vps) { + if (vp > radixPos && vps[vp].input !== getPlaceholder(vp)) { + return !1; + } + } return !0; } } @@ -1062,122 +1282,130 @@ var input = this; if (document.activeElement === input) { var selectedCaret = caret(input); - if (selectedCaret.begin === selectedCaret.end) if (doRadixFocus(selectedCaret.begin)) caret(input, opts.numericInput ? seekNext($.inArray(opts.radixPoint, getBuffer())) : $.inArray(opts.radixPoint, getBuffer())); else { - var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition), lastPosition = seekNext(lvclickPosition); - lastPosition > clickPosition ? caret(input, isMask(clickPosition) || isMask(clickPosition - 1) ? clickPosition : seekNext(clickPosition)) : ((getBuffer()[lastPosition] !== getPlaceholder(lastPosition) || !isMask(lastPosition, !0) && getTest(lastPosition).def === getPlaceholder(lastPosition)) && (lastPosition = seekNext(lastPosition)), - caret(input, lastPosition)); + if (selectedCaret.begin === selectedCaret.end) { + if (doRadixFocus(selectedCaret.begin)) { + caret(input, opts.numericInput ? seekNext($.inArray(opts.radixPoint, getBuffer())) : $.inArray(opts.radixPoint, getBuffer())); + } else { + var clickPosition = selectedCaret.begin, lvclickPosition = getLastValidPosition(clickPosition), lastPosition = seekNext(lvclickPosition); + lastPosition > clickPosition ? caret(input, isMask(clickPosition) || isMask(clickPosition - 1) ? clickPosition : seekNext(clickPosition)) : ((getBuffer()[lastPosition] !== getPlaceholder(lastPosition) || !isMask(lastPosition, !0) && getTest(lastPosition).def === getPlaceholder(lastPosition)) && (lastPosition = seekNext(lastPosition)), + caret(input, lastPosition)); + } } } } - function dblclickEvent(e) { + function dblclickEvent (e) { var input = this; - setTimeout(function() { + setTimeout(function () { caret(input, 0, seekNext(getLastValidPosition())); }, 0); } - function cutEvent(e) { + function cutEvent (e) { var input = this, $input = $(input), pos = caret(input), ev = e.originalEvent || e, clipboardData = window.clipboardData || ev.clipboardData, clipData = isRTL ? getBuffer().slice(pos.end, pos.begin) : getBuffer().slice(pos.begin, pos.end); - clipboardData.setData("text", isRTL ? clipData.reverse().join("") : clipData.join("")), - document.execCommand && document.execCommand("copy"), handleRemove(input, Inputmask.keyCode.DELETE, pos), - writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), - input.inputmask._valueGet() === getBufferTemplate().join("") && $input.trigger("cleared"), + clipboardData.setData("text", isRTL ? clipData.reverse().join("") : clipData.join("")), + document.execCommand && document.execCommand("copy"), handleRemove(input, Inputmask.keyCode.DELETE, pos), + writeBuffer(input, getBuffer(), getMaskSet().p, e, undoValue !== getBuffer().join("")), + input.inputmask._valueGet() === getBufferTemplate().join("") && $input.trigger("cleared"), opts.showTooltip && (input.title = opts.tooltip || getMaskSet().mask); } - function blurEvent(e) { + function blurEvent (e) { var $input = $(this), input = this; if (input.inputmask) { var nptValue = input.inputmask._valueGet(), buffer = getBuffer().slice(); - undoValue !== buffer.join("") && setTimeout(function() { + undoValue !== buffer.join("") && setTimeout(function () { $input.trigger("change"), undoValue = buffer.join(""); - }, 0), "" !== nptValue && (opts.clearMaskOnLostFocus && (-1 === getLastValidPosition() && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer)), - isComplete(buffer) === !1 && (setTimeout(function() { + }, 0), nptValue !== "" && (opts.clearMaskOnLostFocus && (getLastValidPosition() === -1 && nptValue === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer)), + isComplete(buffer) === !1 && (setTimeout(function () { $input.trigger("incomplete"); - }, 0), opts.clearIncomplete && (resetMaskSet(), buffer = opts.clearMaskOnLostFocus ? [] : getBufferTemplate().slice())), + }, 0), opts.clearIncomplete && (resetMaskSet(), buffer = opts.clearMaskOnLostFocus ? [] : getBufferTemplate().slice())), writeBuffer(input, buffer, void 0, e)); } } - function mouseenterEvent(e) { + function mouseenterEvent (e) { var input = this; mouseEnter = !0, document.activeElement !== input && opts.showMaskOnHover && input.inputmask._valueGet() !== getBuffer().join("") && writeBuffer(input, getBuffer()); } - function submitEvent(e) { - undoValue !== getBuffer().join("") && $el.trigger("change"), opts.clearMaskOnLostFocus && -1 === getLastValidPosition() && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join("") && el.inputmask._valueSet(""), - opts.removeMaskOnSubmit && (el.inputmask._valueSet(el.inputmask.unmaskedvalue(), !0), - setTimeout(function() { + function submitEvent (e) { + undoValue !== getBuffer().join("") && $el.trigger("change"), opts.clearMaskOnLostFocus && getLastValidPosition() === -1 && el.inputmask._valueGet && el.inputmask._valueGet() === getBufferTemplate().join("") && el.inputmask._valueSet(""), + opts.removeMaskOnSubmit && (el.inputmask._valueSet(el.inputmask.unmaskedvalue(), !0), + setTimeout(function () { writeBuffer(el, getBuffer()); }, 0)); } - function resetEvent(e) { - setTimeout(function() { + function resetEvent (e) { + setTimeout(function () { $el.trigger("setvalue"); }, 0); } - function mask(elem) { - if (el = elem, $el = $(el), opts.showTooltip && (el.title = opts.tooltip || getMaskSet().mask), - ("rtl" === el.dir || opts.rightAlign) && (el.style.textAlign = "right"), ("rtl" === el.dir || opts.numericInput) && (el.dir = "ltr", - el.removeAttribute("dir"), el.inputmask.isRTL = !0, isRTL = !0), EventRuler.off(el), - patchValueProperty(el), isElementTypeSupported(el, opts) && (EventRuler.on(el, "submit", submitEvent), - EventRuler.on(el, "reset", resetEvent), EventRuler.on(el, "mouseenter", mouseenterEvent), - EventRuler.on(el, "blur", blurEvent), EventRuler.on(el, "focus", focusEvent), EventRuler.on(el, "mouseleave", mouseleaveEvent), - EventRuler.on(el, "click", clickEvent), EventRuler.on(el, "dblclick", dblclickEvent), - EventRuler.on(el, "paste", pasteEvent), EventRuler.on(el, "dragdrop", pasteEvent), - EventRuler.on(el, "drop", pasteEvent), EventRuler.on(el, "cut", cutEvent), EventRuler.on(el, "complete", opts.oncomplete), - EventRuler.on(el, "incomplete", opts.onincomplete), EventRuler.on(el, "cleared", opts.oncleared), - EventRuler.on(el, "keydown", keydownEvent), EventRuler.on(el, "keypress", keypressEvent), - EventRuler.on(el, "input", inputFallBackEvent), mobile || (EventRuler.on(el, "compositionstart", compositionStartEvent), - EventRuler.on(el, "compositionupdate", compositionUpdateEvent), EventRuler.on(el, "compositionend", compositionEndEvent))), - EventRuler.on(el, "setvalue", setValueEvent), "" !== el.inputmask._valueGet() || opts.clearMaskOnLostFocus === !1) { + function mask (elem) { + if (el = elem, $el = $(el), opts.showTooltip && (el.title = opts.tooltip || getMaskSet().mask), + (el.dir === "rtl" || opts.rightAlign) && (el.style.textAlign = "right"), (el.dir === "rtl" || opts.numericInput) && (el.dir = "ltr", + el.removeAttribute("dir"), el.inputmask.isRTL = !0, isRTL = !0), EventRuler.off(el), + patchValueProperty(el), isElementTypeSupported(el, opts) && (EventRuler.on(el, "submit", submitEvent), + EventRuler.on(el, "reset", resetEvent), EventRuler.on(el, "mouseenter", mouseenterEvent), + EventRuler.on(el, "blur", blurEvent), EventRuler.on(el, "focus", focusEvent), EventRuler.on(el, "mouseleave", mouseleaveEvent), + EventRuler.on(el, "click", clickEvent), EventRuler.on(el, "dblclick", dblclickEvent), + EventRuler.on(el, "paste", pasteEvent), EventRuler.on(el, "dragdrop", pasteEvent), + EventRuler.on(el, "drop", pasteEvent), EventRuler.on(el, "cut", cutEvent), EventRuler.on(el, "complete", opts.oncomplete), + EventRuler.on(el, "incomplete", opts.onincomplete), EventRuler.on(el, "cleared", opts.oncleared), + EventRuler.on(el, "keydown", keydownEvent), EventRuler.on(el, "keypress", keypressEvent), + EventRuler.on(el, "input", inputFallBackEvent), mobile || (EventRuler.on(el, "compositionstart", compositionStartEvent), + EventRuler.on(el, "compositionupdate", compositionUpdateEvent), EventRuler.on(el, "compositionend", compositionEndEvent))), + EventRuler.on(el, "setvalue", setValueEvent), el.inputmask._valueGet() !== "" || opts.clearMaskOnLostFocus === !1) { var initialValue = $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(el.inputmask._valueGet(), opts) || el.inputmask._valueGet() : el.inputmask._valueGet(); checkVal(el, !0, !1, initialValue.split("")); var buffer = getBuffer().slice(); - undoValue = buffer.join(""), isComplete(buffer) === !1 && opts.clearIncomplete && resetMaskSet(), - opts.clearMaskOnLostFocus && (buffer.join("") === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer)), + undoValue = buffer.join(""), isComplete(buffer) === !1 && opts.clearIncomplete && resetMaskSet(), + opts.clearMaskOnLostFocus && (buffer.join("") === getBufferTemplate().join("") ? buffer = [] : clearOptionalTail(buffer)), writeBuffer(el, buffer), document.activeElement === el && caret(el, seekNext(getLastValidPosition())); } } var undoValue, compositionData, el, $el, maxLength, valueBuffer, isRTL = !1, skipKeyPressEvent = !1, skipInputEvent = !1, ignorable = !1, mouseEnter = !0, inComposition = !1, EventRuler = { - on: function(input, eventName, eventHandler) { - var ev = function(e) { - if (void 0 === this.inputmask && "FORM" !== this.nodeName) { + on: function (input, eventName, eventHandler) { + var ev = function (e) { + if (void 0 === this.inputmask && this.nodeName !== "FORM") { var imOpts = $.data(this, "_inputmask_opts"); imOpts ? new Inputmask(imOpts).mask(this) : EventRuler.off(this); } else { - if ("setvalue" === e.type || !(this.disabled || this.readOnly && !("keydown" === e.type && e.ctrlKey && 67 === e.keyCode || opts.tabThrough === !1 && e.keyCode === Inputmask.keyCode.TAB))) { + if (e.type === "setvalue" || !(this.disabled || this.readOnly && !(e.type === "keydown" && e.ctrlKey && e.keyCode === 67 || opts.tabThrough === !1 && e.keyCode === Inputmask.keyCode.TAB))) { switch (e.type) { - case "input": - if (skipInputEvent === !0 || inComposition === !0) return skipInputEvent = inComposition, - e.preventDefault(); + case "input": + if (skipInputEvent === !0 || inComposition === !0) { + return skipInputEvent = inComposition, + e.preventDefault(); + } break; - case "keydown": + case "keydown": skipKeyPressEvent = !1, skipInputEvent = !1, inComposition = !1; break; - case "keypress": - if (skipKeyPressEvent === !0) return e.preventDefault(); + case "keypress": + if (skipKeyPressEvent === !0) { + return e.preventDefault(); + } skipKeyPressEvent = !0; break; - case "compositionstart": + case "compositionstart": inComposition = !0; break; - case "compositionupdate": + case "compositionupdate": skipInputEvent = !0; break; - case "compositionend": + case "compositionend": inComposition = !1; break; - case "cut": + case "cut": skipInputEvent = !0; break; - case "click": + case "click": if (iemobile) { var that = this; - return setTimeout(function() { + return setTimeout(function () { eventHandler.apply(that, arguments); }, 0), !1; } @@ -1187,79 +1415,83 @@ e.preventDefault(); } }; - input.inputmask.events[eventName] = input.inputmask.events[eventName] || [], input.inputmask.events[eventName].push(ev), - -1 !== $.inArray(eventName, [ "submit", "reset" ]) ? null != input.form && $(input.form).on(eventName, ev) : $(input).on(eventName, ev); + input.inputmask.events[eventName] = input.inputmask.events[eventName] || [], input.inputmask.events[eventName].push(ev), + $.inArray(eventName, [ "submit", "reset" ]) !== -1 ? input.form != null && $(input.form).on(eventName, ev) : $(input).on(eventName, ev); }, - off: function(input, event) { + off: function (input, event) { if (input.inputmask && input.inputmask.events) { var events; - event ? (events = [], events[event] = input.inputmask.events[event]) : events = input.inputmask.events, - $.each(events, function(eventName, evArr) { + event ? (events = [], events[event] = input.inputmask.events[event]) : events = input.inputmask.events, + $.each(events, function (eventName, evArr) { for (;evArr.length > 0; ) { var ev = evArr.pop(); - -1 !== $.inArray(eventName, [ "submit", "reset" ]) ? null != input.form && $(input.form).off(eventName, ev) : $(input).off(eventName, ev); + $.inArray(eventName, [ "submit", "reset" ]) !== -1 ? input.form != null && $(input.form).off(eventName, ev) : $(input).off(eventName, ev); } delete input.inputmask.events[eventName]; }); } - } + }, }; - if (void 0 !== actionObj) switch (actionObj.action) { - case "isComplete": - return el = actionObj.el, isComplete(getBuffer()); + if (void 0 !== actionObj) { + switch (actionObj.action) { + case "isComplete": + return el = actionObj.el, isComplete(getBuffer()); - case "unmaskedvalue": - return el = actionObj.el, void 0 !== el && void 0 !== el.inputmask ? (maskset = el.inputmask.maskset, - opts = el.inputmask.opts, isRTL = el.inputmask.isRTL) : (valueBuffer = actionObj.value, - opts.numericInput && (isRTL = !0), valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(valueBuffer, opts) || valueBuffer : valueBuffer).split(""), - checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts)), - unmaskedvalue(el); + case "unmaskedvalue": + return el = actionObj.el, void 0 !== el && void 0 !== el.inputmask ? (maskset = el.inputmask.maskset, + opts = el.inputmask.opts, isRTL = el.inputmask.isRTL) : (valueBuffer = actionObj.value, + opts.numericInput && (isRTL = !0), valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(valueBuffer, opts) || valueBuffer : valueBuffer).split(""), + checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts)), + unmaskedvalue(el); - case "mask": - el = actionObj.el, maskset = el.inputmask.maskset, opts = el.inputmask.opts, isRTL = el.inputmask.isRTL, - undoValue = getBuffer().join(""), mask(el); - break; + case "mask": + el = actionObj.el, maskset = el.inputmask.maskset, opts = el.inputmask.opts, isRTL = el.inputmask.isRTL, + undoValue = getBuffer().join(""), mask(el); + break; - case "format": - return opts.numericInput && (isRTL = !0), valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(actionObj.value, opts) || actionObj.value : actionObj.value).split(""), - checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts), - actionObj.metadata ? { - value: isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""), - metadata: maskScope({ - action: "getmetadata" - }, maskset, opts) - } : isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""); + case "format": + return opts.numericInput && (isRTL = !0), valueBuffer = ($.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(actionObj.value, opts) || actionObj.value : actionObj.value).split(""), + checkVal(void 0, !1, !1, isRTL ? valueBuffer.reverse() : valueBuffer), $.isFunction(opts.onBeforeWrite) && opts.onBeforeWrite(void 0, getBuffer(), 0, opts), + actionObj.metadata ? { + value: isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""), + metadata: maskScope({ + action: "getmetadata", + }, maskset, opts), + } : isRTL ? getBuffer().slice().reverse().join("") : getBuffer().join(""); - case "isValid": - opts.numericInput && (isRTL = !0), actionObj.value ? (valueBuffer = actionObj.value.split(""), - checkVal(void 0, !1, !0, isRTL ? valueBuffer.reverse() : valueBuffer)) : actionObj.value = getBuffer().join(""); - for (var buffer = getBuffer(), rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) ; - return buffer.splice(rl, lmib + 1 - rl), isComplete(buffer) && actionObj.value === getBuffer().join(""); + case "isValid": + opts.numericInput && (isRTL = !0), actionObj.value ? (valueBuffer = actionObj.value.split(""), + checkVal(void 0, !1, !0, isRTL ? valueBuffer.reverse() : valueBuffer)) : actionObj.value = getBuffer().join(""); + for (var buffer = getBuffer(), rl = determineLastRequiredPosition(), lmib = buffer.length - 1; lmib > rl && !isMask(lmib); lmib--) {} + return buffer.splice(rl, lmib + 1 - rl), isComplete(buffer) && actionObj.value === getBuffer().join(""); - case "getemptymask": - return getBufferTemplate(); + case "getemptymask": + return getBufferTemplate(); - case "remove": - el = actionObj.el, $el = $(el), maskset = el.inputmask.maskset, opts = el.inputmask.opts, - el.inputmask._valueSet(unmaskedvalue(el)), EventRuler.off(el); - var valueProperty; - Object.getOwnPropertyDescriptor && (valueProperty = Object.getOwnPropertyDescriptor(el, "value")), - valueProperty && valueProperty.get ? el.inputmask.__valueGet && Object.defineProperty(el, "value", { - get: el.inputmask.__valueGet, - set: el.inputmask.__valueSet - }) : document.__lookupGetter__ && el.__lookupGetter__("value") && el.inputmask.__valueGet && (el.__defineGetter__("value", el.inputmask.__valueGet), - el.__defineSetter__("value", el.inputmask.__valueSet)), el.inputmask = void 0; - break; + case "remove": + el = actionObj.el, $el = $(el), maskset = el.inputmask.maskset, opts = el.inputmask.opts, + el.inputmask._valueSet(unmaskedvalue(el)), EventRuler.off(el); + var valueProperty; + Object.getOwnPropertyDescriptor && (valueProperty = Object.getOwnPropertyDescriptor(el, "value")), + valueProperty && valueProperty.get ? el.inputmask.__valueGet && Object.defineProperty(el, "value", { + get: el.inputmask.__valueGet, + set: el.inputmask.__valueSet, + }) : document.__lookupGetter__ && el.__lookupGetter__("value") && el.inputmask.__valueGet && (el.__defineGetter__("value", el.inputmask.__valueGet), + el.__defineSetter__("value", el.inputmask.__valueSet)), el.inputmask = void 0; + break; - case "getmetadata": - if ($.isArray(maskset.metadata)) { - for (var alternation, lvp = getLastValidPosition(), firstAlt = lvp; firstAlt >= 0; firstAlt--) if (getMaskSet().validPositions[firstAlt] && void 0 !== getMaskSet().validPositions[firstAlt].alternation) { - alternation = getMaskSet().validPositions[firstAlt].alternation; - break; + case "getmetadata": + if ($.isArray(maskset.metadata)) { + for (var alternation, lvp = getLastValidPosition(), firstAlt = lvp; firstAlt >= 0; firstAlt--) { + if (getMaskSet().validPositions[firstAlt] && void 0 !== getMaskSet().validPositions[firstAlt].alternation) { + alternation = getMaskSet().validPositions[firstAlt].alternation; + break; + } + } + return void 0 !== alternation ? maskset.metadata[getMaskSet().validPositions[lvp].locator[alternation]] : maskset.metadata[0]; } - return void 0 !== alternation ? maskset.metadata[getMaskSet().validPositions[lvp].locator[alternation]] : maskset.metadata[0]; + return maskset.metadata; } - return maskset.metadata; } } Inputmask.prototype = { @@ -1267,15 +1499,15 @@ placeholder: "_", optionalmarker: { start: "[", - end: "]" + end: "]", }, quantifiermarker: { start: "{", - end: "}" + end: "}", }, groupmarker: { start: "(", - end: ")" + end: ")", }, alternatormarker: "|", escapeChar: "\\", @@ -1294,7 +1526,7 @@ alias: null, onKeyDown: $.noop, onBeforeMask: null, - onBeforePaste: function(pastedValue, opts) { + onBeforePaste: function (pastedValue, opts) { return $.isFunction(opts.onBeforeMask) ? opts.onBeforeMask(pastedValue, opts) : pastedValue; }, onBeforeWrite: null, @@ -1321,112 +1553,112 @@ "9": { validator: "[0-9]", cardinality: 1, - definitionSymbol: "*" + definitionSymbol: "*", }, a: { validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", cardinality: 1, - definitionSymbol: "*" + definitionSymbol: "*", }, "*": { validator: "[0-9A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", - cardinality: 1 - } + cardinality: 1, + }, }, ignorables: [ 8, 9, 13, 19, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46, 93, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123 ], isComplete: null, canClearPosition: $.noop, postValidation: null, staticDefinitionSymbol: void 0, - jitMasking: !1 + jitMasking: !1, }, masksCache: {}, - mask: function(elems) { + mask: function (elems) { var that = this; - return "string" == typeof elems && (elems = document.getElementById(elems) || document.querySelectorAll(elems)), - elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function(ndx, el) { + return typeof elems === "string" && (elems = document.getElementById(elems) || document.querySelectorAll(elems)), + elems = elems.nodeName ? [ elems ] : elems, $.each(elems, function (ndx, el) { var scopedOpts = $.extend(!0, {}, that.opts); importAttributeOptions(el, scopedOpts, $.extend(!0, {}, that.userOptions)); var maskset = generateMaskSet(scopedOpts, that.noMasksCache); - void 0 !== maskset && (void 0 !== el.inputmask && el.inputmask.remove(), el.inputmask = new Inputmask(), - el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.inputmask.userOptions = $.extend(!0, {}, that.userOptions), - el.inputmask.el = el, el.inputmask.maskset = maskset, el.inputmask.isRTL = !1, $.data(el, "_inputmask_opts", scopedOpts), + void 0 !== maskset && (void 0 !== el.inputmask && el.inputmask.remove(), el.inputmask = new Inputmask(), + el.inputmask.opts = scopedOpts, el.inputmask.noMasksCache = that.noMasksCache, el.inputmask.userOptions = $.extend(!0, {}, that.userOptions), + el.inputmask.el = el, el.inputmask.maskset = maskset, el.inputmask.isRTL = !1, $.data(el, "_inputmask_opts", scopedOpts), maskScope({ action: "mask", - el: el + el: el, })); }), elems && elems[0] ? elems[0].inputmask || this : this; }, - option: function(options) { - return "string" == typeof options ? this.opts[options] : "object" == typeof options ? ($.extend(this.opts, options), - $.extend(this.userOptions, options), this.el && (void 0 !== options.mask || void 0 !== options.alias ? this.mask(this.el) : ($.data(this.el, "_inputmask_opts", this.opts), + option: function (options) { + return typeof options === "string" ? this.opts[options] : typeof options === "object" ? ($.extend(this.opts, options), + $.extend(this.userOptions, options), this.el && (void 0 !== options.mask || void 0 !== options.alias ? this.mask(this.el) : ($.data(this.el, "_inputmask_opts", this.opts), maskScope({ action: "mask", - el: this.el + el: this.el, }))), this) : void 0; }, - unmaskedvalue: function(value) { + unmaskedvalue: function (value) { return maskScope({ action: "unmaskedvalue", el: this.el, - value: value + value: value, }, this.el && this.el.inputmask ? this.el.inputmask.maskset : generateMaskSet(this.opts, this.noMasksCache), this.opts); }, - remove: function() { + remove: function () { return this.el ? (maskScope({ action: "remove", - el: this.el + el: this.el, }), this.el.inputmask = void 0, this.el) : void 0; }, - getemptymask: function() { + getemptymask: function () { return maskScope({ - action: "getemptymask" + action: "getemptymask", }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts); }, - hasMaskedValue: function() { + hasMaskedValue: function () { return !this.opts.autoUnmask; }, - isComplete: function() { + isComplete: function () { return maskScope({ action: "isComplete", - el: this.el + el: this.el, }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts); }, - getmetadata: function() { + getmetadata: function () { return maskScope({ - action: "getmetadata" + action: "getmetadata", }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts); }, - isValid: function(value) { + isValid: function (value) { return maskScope({ action: "isValid", - value: value + value: value, }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts); }, - format: function(value, metadata) { + format: function (value, metadata) { return maskScope({ action: "format", value: value, - metadata: metadata + metadata: metadata, }, this.maskset || generateMaskSet(this.opts, this.noMasksCache), this.opts); - } - }, Inputmask.extendDefaults = function(options) { + }, + }, Inputmask.extendDefaults = function (options) { $.extend(!0, Inputmask.prototype.defaults, options); - }, Inputmask.extendDefinitions = function(definition) { + }, Inputmask.extendDefinitions = function (definition) { $.extend(!0, Inputmask.prototype.defaults.definitions, definition); - }, Inputmask.extendAliases = function(alias) { + }, Inputmask.extendAliases = function (alias) { $.extend(!0, Inputmask.prototype.defaults.aliases, alias); - }, Inputmask.format = function(value, options, metadata) { + }, Inputmask.format = function (value, options, metadata) { return Inputmask(options).format(value, metadata); - }, Inputmask.unmask = function(value, options) { + }, Inputmask.unmask = function (value, options) { return Inputmask(options).unmaskedvalue(value); - }, Inputmask.isValid = function(value, options) { + }, Inputmask.isValid = function (value, options) { return Inputmask(options).isValid(value); - }, Inputmask.remove = function(elems) { - $.each(elems, function(ndx, el) { + }, Inputmask.remove = function (elems) { + $.each(elems, function (ndx, el) { el.inputmask && el.inputmask.remove(); }); - }, Inputmask.escapeRegex = function(str) { + }, Inputmask.escapeRegex = function (str) { var specials = [ "/", ".", "*", "+", "?", "|", "(", ")", "[", "]", "{", "}", "\\", "$", "^" ]; return str.replace(new RegExp("(\\" + specials.join("|\\") + ")", "gim"), "\\$1"); }, Inputmask.keyCode = { @@ -1461,109 +1693,119 @@ SPACE: 32, TAB: 9, UP: 38, - WINDOWS: 91 + WINDOWS: 91, }; - var ua = navigator.userAgent, mobile = /mobile/i.test(ua), iemobile = /iemobile/i.test(ua), iphone = /iphone/i.test(ua) && !iemobile; - /android.*safari.*/i.test(ua) && !iemobile; + var ua = navigator.userAgent, mobile = (/mobile/i).test(ua), iemobile = (/iemobile/i).test(ua), iphone = (/iphone/i).test(ua) && !iemobile; + (/android.*safari.*/i).test(ua) && !iemobile; return window.Inputmask = Inputmask, Inputmask; -}(jQuery), function($, Inputmask) { - return void 0 === $.fn.inputmask && ($.fn.inputmask = function(fn, options) { +}(jQuery)), (function ($, Inputmask) { + return void 0 === $.fn.inputmask && ($.fn.inputmask = function (fn, options) { var nptmask, input = this[0]; - if (options = options || {}, "string" == typeof fn) switch (fn) { - case "unmaskedvalue": - return input && input.inputmask ? input.inputmask.unmaskedvalue() : $(input).val(); + if (options = options || {}, typeof fn === "string") { + switch (fn) { + case "unmaskedvalue": + return input && input.inputmask ? input.inputmask.unmaskedvalue() : $(input).val(); - case "remove": - return this.each(function() { - this.inputmask && this.inputmask.remove(); - }); + case "remove": + return this.each(function () { + this.inputmask && this.inputmask.remove(); + }); - case "getemptymask": - return input && input.inputmask ? input.inputmask.getemptymask() : ""; + case "getemptymask": + return input && input.inputmask ? input.inputmask.getemptymask() : ""; - case "hasMaskedValue": - return input && input.inputmask ? input.inputmask.hasMaskedValue() : !1; + case "hasMaskedValue": + return input && input.inputmask ? input.inputmask.hasMaskedValue() : !1; - case "isComplete": - return input && input.inputmask ? input.inputmask.isComplete() : !0; + case "isComplete": + return input && input.inputmask ? input.inputmask.isComplete() : !0; - case "getmetadata": - return input && input.inputmask ? input.inputmask.getmetadata() : void 0; + case "getmetadata": + return input && input.inputmask ? input.inputmask.getmetadata() : void 0; - case "setvalue": - $(input).val(options), input && void 0 !== input.inputmask && $(input).triggerHandler("setvalue"); - break; + case "setvalue": + $(input).val(options), input && void 0 !== input.inputmask && $(input).triggerHandler("setvalue"); + break; - case "option": - if ("string" != typeof options) return this.each(function() { - return void 0 !== this.inputmask ? this.inputmask.option(options) : void 0; - }); - if (input && void 0 !== input.inputmask) return input.inputmask.option(options); - break; + case "option": + if (typeof options !== "string") { + return this.each(function () { + return void 0 !== this.inputmask ? this.inputmask.option(options) : void 0; + }); + } + if (input && void 0 !== input.inputmask) { + return input.inputmask.option(options); + } + break; - default: - return options.alias = fn, nptmask = new Inputmask(options), this.each(function() { - nptmask.mask(this); - }); + default: + return options.alias = fn, nptmask = new Inputmask(options), this.each(function () { + nptmask.mask(this); + }); + } } else { - if ("object" == typeof fn) return nptmask = new Inputmask(fn), void 0 === fn.mask && void 0 === fn.alias ? this.each(function() { - return void 0 !== this.inputmask ? this.inputmask.option(fn) : void nptmask.mask(this); - }) : this.each(function() { - nptmask.mask(this); - }); - if (void 0 === fn) return this.each(function() { - nptmask = new Inputmask(options), nptmask.mask(this); - }); + if (typeof fn === "object") { + return nptmask = new Inputmask(fn), void 0 === fn.mask && void 0 === fn.alias ? this.each(function () { + return void 0 !== this.inputmask ? this.inputmask.option(fn) : void nptmask.mask(this); + }) : this.each(function () { + nptmask.mask(this); + }); + } + if (void 0 === fn) { + return this.each(function () { + nptmask = new Inputmask(options), nptmask.mask(this); + }); + } } }), $.fn.inputmask; -}(jQuery, Inputmask), function($, Inputmask) { +}(jQuery, Inputmask)), (function ($, Inputmask) { return Inputmask.extendDefinitions({ h: { validator: "[01][0-9]|2[0-3]", cardinality: 2, prevalidator: [ { validator: "[0-2]", - cardinality: 1 - } ] + cardinality: 1, + } ], }, s: { validator: "[0-5][0-9]", cardinality: 2, prevalidator: [ { validator: "[0-5]", - cardinality: 1 - } ] + cardinality: 1, + } ], }, d: { validator: "0[1-9]|[12][0-9]|3[01]", cardinality: 2, prevalidator: [ { validator: "[0-3]", - cardinality: 1 - } ] + cardinality: 1, + } ], }, m: { validator: "0[1-9]|1[012]", cardinality: 2, prevalidator: [ { validator: "[01]", - cardinality: 1 - } ] + cardinality: 1, + } ], }, y: { validator: "(19|20)\\d{2}", cardinality: 4, prevalidator: [ { validator: "[12]", - cardinality: 1 + cardinality: 1, }, { validator: "(19|20)", - cardinality: 2 + cardinality: 2, }, { validator: "(19|20)\\d", - cardinality: 3 - } ] - } + cardinality: 3, + } ], + }, }), Inputmask.extendAliases({ "dd/mm/yyyy": { mask: "1/2/y", @@ -1571,46 +1813,52 @@ regex: { val1pre: new RegExp("[0-3]"), val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), - val2pre: function(separator) { + val2pre: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])"); }, - val2: function(separator) { + val2: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))"); - } + }, }, leapday: "29/02/", separator: "/", yearrange: { minyear: 1900, - maxyear: 2099 + maxyear: 2099, }, - isInYearRange: function(chrs, minyear, maxyear) { - if (isNaN(chrs)) return !1; + isInYearRange: function (chrs, minyear, maxyear) { + if (isNaN(chrs)) { + return !1; + } var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length))), enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length))); return (isNaN(enteredyear) ? !1 : enteredyear >= minyear && maxyear >= enteredyear) || (isNaN(enteredyear2) ? !1 : enteredyear2 >= minyear && maxyear >= enteredyear2); }, - determinebaseyear: function(minyear, maxyear, hint) { + determinebaseyear: function (minyear, maxyear, hint) { var currentyear = new Date().getFullYear(); - if (minyear > currentyear) return minyear; + if (minyear > currentyear) { + return minyear; + } if (currentyear > maxyear) { - for (var maxYearPrefix = maxyear.toString().slice(0, 2), maxYearPostfix = maxyear.toString().slice(2, 4); maxYearPrefix + hint > maxyear; ) maxYearPrefix--; + for (var maxYearPrefix = maxyear.toString().slice(0, 2), maxYearPostfix = maxyear.toString().slice(2, 4); maxYearPrefix + hint > maxyear; ) { + maxYearPrefix--; + } var maxxYear = maxYearPrefix + maxYearPostfix; return minyear > maxxYear ? minyear : maxxYear; } return currentyear; }, - onKeyDown: function(e, buffer, caretPos, opts) { + onKeyDown: function (e, buffer, caretPos, opts) { var $input = $(this); if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { var today = new Date(); - $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()), + $input.val(today.getDate().toString() + (today.getMonth() + 1).toString() + today.getFullYear().toString()), $input.trigger("setvalue"); } }, - getFrontValue: function(mask, buffer, opts) { - for (var start = 0, length = 0, i = 0; i < mask.length && "2" !== mask.charAt(i); i++) { + getFrontValue: function (mask, buffer, opts) { + for (var start = 0, length = 0, i = 0; i < mask.length && mask.charAt(i) !== "2"; i++) { var definition = opts.definitions[mask.charAt(i)]; definition ? (start += length, length = definition.cardinality) : length++; } @@ -1618,57 +1866,65 @@ }, definitions: { "1": { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.regex.val1.test(chrs); - return strict || isValid || chrs.charAt(1) !== opts.separator && -1 === "-./".indexOf(chrs.charAt(1)) || !(isValid = opts.regex.val1.test("0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", + return strict || isValid || chrs.charAt(1) !== opts.separator && "-./".indexOf(chrs.charAt(1)) === -1 || !(isValid = opts.regex.val1.test("0" + chrs.charAt(0))) ? isValid : (maskset.buffer[pos - 1] = "0", { refreshFromBuffer: { start: pos - 1, - end: pos + end: pos, }, pos: pos, - c: chrs.charAt(0) + c: chrs.charAt(0), }); }, cardinality: 2, prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var pchrs = chrs; isNaN(maskset.buffer[pos + 1]) || (pchrs += maskset.buffer[pos + 1]); - var isValid = 1 === pchrs.length ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs); + var isValid = pchrs.length === 1 ? opts.regex.val1pre.test(pchrs) : opts.regex.val1.test(pchrs); if (!strict && !isValid) { - if (isValid = opts.regex.val1.test(chrs + "0")) return maskset.buffer[pos] = chrs, - maskset.buffer[++pos] = "0", { - pos: pos, - c: "0" - }; - if (isValid = opts.regex.val1.test("0" + chrs)) return maskset.buffer[pos] = "0", - pos++, { - pos: pos - }; + if (isValid = opts.regex.val1.test(chrs + "0")) { + return maskset.buffer[pos] = chrs, + maskset.buffer[++pos] = "0", { + pos: pos, + c: "0", + }; + } + if (isValid = opts.regex.val1.test("0" + chrs)) { + return maskset.buffer[pos] = "0", + pos++, { + pos: pos, + }; + } } return isValid; }, - cardinality: 1 - } ] + cardinality: 1, + } ], }, "2": { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); - -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator); + frontValue.indexOf(opts.placeholder[0]) !== -1 && (frontValue = "01" + opts.separator); var isValid = opts.regex.val2(opts.separator).test(frontValue + chrs); - if (!strict && !isValid && (chrs.charAt(1) === opts.separator || -1 !== "-./".indexOf(chrs.charAt(1))) && (isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", - { - refreshFromBuffer: { - start: pos - 1, - end: pos - }, - pos: pos, - c: chrs.charAt(0) - }; + if (!strict && !isValid && (chrs.charAt(1) === opts.separator || "-./".indexOf(chrs.charAt(1)) !== -1) && (isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs.charAt(0)))) { + return maskset.buffer[pos - 1] = "0", + { + refreshFromBuffer: { + start: pos - 1, + end: pos, + }, + pos: pos, + c: chrs.charAt(0), + }; + } if (opts.mask.indexOf("2") === opts.mask.length - 1 && isValid) { var dayMonthValue = maskset.buffer.join("").substr(4, 4) + chrs; - if (dayMonthValue !== opts.leapday) return !0; + if (dayMonthValue !== opts.leapday) { + return !0; + } var year = parseInt(maskset.buffer.join("").substr(0, 4), 10); return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1; } @@ -1676,24 +1932,26 @@ }, cardinality: 2, prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { isNaN(maskset.buffer[pos + 1]) || (chrs += maskset.buffer[pos + 1]); var frontValue = opts.getFrontValue(maskset.mask, maskset.buffer, opts); - -1 !== frontValue.indexOf(opts.placeholder[0]) && (frontValue = "01" + opts.separator); - var isValid = 1 === chrs.length ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs); - return strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + frontValue.indexOf(opts.placeholder[0]) !== -1 && (frontValue = "01" + opts.separator); + var isValid = chrs.length === 1 ? opts.regex.val2pre(opts.separator).test(frontValue + chrs) : opts.regex.val2(opts.separator).test(frontValue + chrs); + return strict || isValid || !(isValid = opts.regex.val2(opts.separator).test(frontValue + "0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", pos++, { - pos: pos + pos: pos, }); }, - cardinality: 1 - } ] + cardinality: 1, + } ], }, y: { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { var dayMonthValue = maskset.buffer.join("").substr(0, 6); - if (dayMonthValue !== opts.leapday) return !0; + if (dayMonthValue !== opts.leapday) { + return !0; + } var year = parseInt(chrs, 10); return year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1; } @@ -1701,143 +1959,155 @@ }, cardinality: 4, prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); if (!strict && !isValid) { var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 1); - if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), - { - pos: pos - }; - if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2), - isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(0), - maskset.buffer[pos++] = yearPrefix.charAt(1), { - pos: pos - }; + if (isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { + return maskset.buffer[pos++] = yearPrefix.charAt(0), + { + pos: pos, + }; + } + if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs + "0").toString().slice(0, 2), + isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { + return maskset.buffer[pos++] = yearPrefix.charAt(0), + maskset.buffer[pos++] = yearPrefix.charAt(1), { + pos: pos, + }; + } } return isValid; }, - cardinality: 1 + cardinality: 1, }, { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); if (!strict && !isValid) { var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2); - if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) return maskset.buffer[pos++] = yearPrefix.charAt(1), - { - pos: pos - }; - if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2), + if (isValid = opts.isInYearRange(chrs[0] + yearPrefix[1] + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear)) { + return maskset.buffer[pos++] = yearPrefix.charAt(1), + { + pos: pos, + }; + } + if (yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear, chrs).toString().slice(0, 2), opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) { var dayMonthValue = maskset.buffer.join("").substr(0, 6); - if (dayMonthValue !== opts.leapday) isValid = !0; else { + if (dayMonthValue !== opts.leapday) { + isValid = !0; + } else { var year = parseInt(chrs, 10); isValid = year % 4 === 0 ? year % 100 === 0 ? year % 400 === 0 ? !0 : !1 : !0 : !1; } - } else isValid = !1; - if (isValid) return maskset.buffer[pos - 1] = yearPrefix.charAt(0), maskset.buffer[pos++] = yearPrefix.charAt(1), - maskset.buffer[pos++] = chrs.charAt(0), { - refreshFromBuffer: { - start: pos - 3, - end: pos - }, - pos: pos - }; + } else { + isValid = !1; + } + if (isValid) { + return maskset.buffer[pos - 1] = yearPrefix.charAt(0), maskset.buffer[pos++] = yearPrefix.charAt(1), + maskset.buffer[pos++] = chrs.charAt(0), { + refreshFromBuffer: { + start: pos - 3, + end: pos, + }, + pos: pos, + }; + } } return isValid; }, - cardinality: 2 + cardinality: 2, }, { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear); }, - cardinality: 3 - } ] - } + cardinality: 3, + } ], + }, }, insertMode: !1, - autoUnmask: !1 + autoUnmask: !1, }, "mm/dd/yyyy": { placeholder: "mm/dd/yyyy", alias: "dd/mm/yyyy", regex: { - val2pre: function(separator) { + val2pre: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); }, - val2: function(separator) { + val2: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); }, val1pre: new RegExp("[01]"), - val1: new RegExp("0[1-9]|1[012]") + val1: new RegExp("0[1-9]|1[012]"), }, leapday: "02/29/", - onKeyDown: function(e, buffer, caretPos, opts) { + onKeyDown: function (e, buffer, caretPos, opts) { var $input = $(this); if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { var today = new Date(); - $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), + $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), $input.trigger("setvalue"); } - } + }, }, "yyyy/mm/dd": { mask: "y/1/2", placeholder: "yyyy/mm/dd", alias: "mm/dd/yyyy", leapday: "/02/29", - onKeyDown: function(e, buffer, caretPos, opts) { + onKeyDown: function (e, buffer, caretPos, opts) { var $input = $(this); if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { var today = new Date(); - $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()), + $input.val(today.getFullYear().toString() + (today.getMonth() + 1).toString() + today.getDate().toString()), $input.trigger("setvalue"); } - } + }, }, "dd.mm.yyyy": { mask: "1.2.y", placeholder: "dd.mm.yyyy", leapday: "29.02.", separator: ".", - alias: "dd/mm/yyyy" + alias: "dd/mm/yyyy", }, "dd-mm-yyyy": { mask: "1-2-y", placeholder: "dd-mm-yyyy", leapday: "29-02-", separator: "-", - alias: "dd/mm/yyyy" + alias: "dd/mm/yyyy", }, "mm.dd.yyyy": { mask: "1.2.y", placeholder: "mm.dd.yyyy", leapday: "02.29.", separator: ".", - alias: "mm/dd/yyyy" + alias: "mm/dd/yyyy", }, "mm-dd-yyyy": { mask: "1-2-y", placeholder: "mm-dd-yyyy", leapday: "02-29-", separator: "-", - alias: "mm/dd/yyyy" + alias: "mm/dd/yyyy", }, "yyyy.mm.dd": { mask: "y.1.2", placeholder: "yyyy.mm.dd", leapday: ".02.29", separator: ".", - alias: "yyyy/mm/dd" + alias: "yyyy/mm/dd", }, "yyyy-mm-dd": { mask: "y-1-2", placeholder: "yyyy-mm-dd", leapday: "-02-29", separator: "-", - alias: "yyyy/mm/dd" + alias: "yyyy/mm/dd", }, datetime: { mask: "1/2/y h:s", @@ -1849,265 +2119,271 @@ hrs: new RegExp("[01][0-9]|2[0-4]"), ampm: new RegExp("^[a|p|A|P][m|M]"), mspre: new RegExp("[0-5]"), - ms: new RegExp("[0-5][0-9]") + ms: new RegExp("[0-5][0-9]"), }, timeseparator: ":", hourFormat: "24", definitions: { h: { - validator: function(chrs, maskset, pos, strict, opts) { - if ("24" === opts.hourFormat && 24 === parseInt(chrs, 10)) return maskset.buffer[pos - 1] = "0", - maskset.buffer[pos] = "0", { - refreshFromBuffer: { - start: pos - 1, - end: pos - }, - c: "0" - }; + validator: function (chrs, maskset, pos, strict, opts) { + if (opts.hourFormat === "24" && parseInt(chrs, 10) === 24) { + return maskset.buffer[pos - 1] = "0", + maskset.buffer[pos] = "0", { + refreshFromBuffer: { + start: pos - 1, + end: pos, + }, + c: "0", + }; + } var isValid = opts.regex.hrs.test(chrs); - if (!strict && !isValid && (chrs.charAt(1) === opts.timeseparator || -1 !== "-.:".indexOf(chrs.charAt(1))) && (isValid = opts.regex.hrs.test("0" + chrs.charAt(0)))) return maskset.buffer[pos - 1] = "0", - maskset.buffer[pos] = chrs.charAt(0), pos++, { - refreshFromBuffer: { - start: pos - 2, - end: pos - }, - pos: pos, - c: opts.timeseparator - }; - if (isValid && "24" !== opts.hourFormat && opts.regex.hrs24.test(chrs)) { + if (!strict && !isValid && (chrs.charAt(1) === opts.timeseparator || "-.:".indexOf(chrs.charAt(1)) !== -1) && (isValid = opts.regex.hrs.test("0" + chrs.charAt(0)))) { + return maskset.buffer[pos - 1] = "0", + maskset.buffer[pos] = chrs.charAt(0), pos++, { + refreshFromBuffer: { + start: pos - 2, + end: pos, + }, + pos: pos, + c: opts.timeseparator, + }; + } + if (isValid && opts.hourFormat !== "24" && opts.regex.hrs24.test(chrs)) { var tmp = parseInt(chrs, 10); - return 24 === tmp ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p", - maskset.buffer[pos + 6] = "m"), tmp -= 12, 10 > tmp ? (maskset.buffer[pos] = tmp.toString(), - maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1), + return tmp === 24 ? (maskset.buffer[pos + 5] = "a", maskset.buffer[pos + 6] = "m") : (maskset.buffer[pos + 5] = "p", + maskset.buffer[pos + 6] = "m"), tmp -= 12, tmp < 10 ? (maskset.buffer[pos] = tmp.toString(), + maskset.buffer[pos - 1] = "0") : (maskset.buffer[pos] = tmp.toString().charAt(1), maskset.buffer[pos - 1] = tmp.toString().charAt(0)), { refreshFromBuffer: { start: pos - 1, - end: pos + 6 + end: pos + 6, }, - c: maskset.buffer[pos] + c: maskset.buffer[pos], }; } return isValid; }, cardinality: 2, prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.regex.hrspre.test(chrs); - return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + return strict || isValid || !(isValid = opts.regex.hrs.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", pos++, { - pos: pos + pos: pos, }); }, - cardinality: 1 - } ] + cardinality: 1, + } ], }, s: { validator: "[0-5][0-9]", cardinality: 2, prevalidator: [ { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.regex.mspre.test(chrs); - return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", + return strict || isValid || !(isValid = opts.regex.ms.test("0" + chrs)) ? isValid : (maskset.buffer[pos] = "0", pos++, { - pos: pos + pos: pos, }); }, - cardinality: 1 - } ] + cardinality: 1, + } ], }, t: { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { return opts.regex.ampm.test(chrs + "m"); }, casing: "lower", - cardinality: 1 - } + cardinality: 1, + }, }, insertMode: !1, - autoUnmask: !1 + autoUnmask: !1, }, datetime12: { mask: "1/2/y h:s t\\m", placeholder: "dd/mm/yyyy hh:mm xm", alias: "datetime", - hourFormat: "12" + hourFormat: "12", }, "mm/dd/yyyy hh:mm xm": { mask: "1/2/y h:s t\\m", placeholder: "mm/dd/yyyy hh:mm xm", alias: "datetime12", regex: { - val2pre: function(separator) { + val2pre: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[13-9]|1[012])" + escapedSeparator + "[0-3])|(02" + escapedSeparator + "[0-2])"); }, - val2: function(separator) { + val2: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[13-9]|1[012])" + escapedSeparator + "30)|((0[13578]|1[02])" + escapedSeparator + "31)"); }, val1pre: new RegExp("[01]"), - val1: new RegExp("0[1-9]|1[012]") + val1: new RegExp("0[1-9]|1[012]"), }, leapday: "02/29/", - onKeyDown: function(e, buffer, caretPos, opts) { + onKeyDown: function (e, buffer, caretPos, opts) { var $input = $(this); if (e.ctrlKey && e.keyCode === Inputmask.keyCode.RIGHT) { var today = new Date(); - $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), + $input.val((today.getMonth() + 1).toString() + today.getDate().toString() + today.getFullYear().toString()), $input.trigger("setvalue"); } - } + }, }, "hh:mm t": { mask: "h:s t\\m", placeholder: "hh:mm xm", alias: "datetime", - hourFormat: "12" + hourFormat: "12", }, "h:s t": { mask: "h:s t\\m", placeholder: "hh:mm xm", alias: "datetime", - hourFormat: "12" + hourFormat: "12", }, "hh:mm:ss": { mask: "h:s:s", placeholder: "hh:mm:ss", alias: "datetime", - autoUnmask: !1 + autoUnmask: !1, }, "hh:mm": { mask: "h:s", placeholder: "hh:mm", alias: "datetime", - autoUnmask: !1 + autoUnmask: !1, }, date: { - alias: "dd/mm/yyyy" + alias: "dd/mm/yyyy", }, "mm/yyyy": { mask: "1/y", placeholder: "mm/yyyy", leapday: "donotuse", separator: "/", - alias: "mm/dd/yyyy" + alias: "mm/dd/yyyy", }, shamsi: { regex: { - val2pre: function(separator) { + val2pre: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "[0-3])"); }, - val2: function(separator) { + val2: function (separator) { var escapedSeparator = Inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|1[012])" + escapedSeparator + "(0[1-9]|[12][0-9]))|((0[1-9]|1[012])" + escapedSeparator + "30)|((0[1-6])" + escapedSeparator + "31)"); }, val1pre: new RegExp("[01]"), - val1: new RegExp("0[1-9]|1[012]") + val1: new RegExp("0[1-9]|1[012]"), }, yearrange: { minyear: 1300, - maxyear: 1499 + maxyear: 1499, }, mask: "y/1/2", leapday: "/12/30", placeholder: "yyyy/mm/dd", alias: "mm/dd/yyyy", - clearIncomplete: !0 - } + clearIncomplete: !0, + }, }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { +}(jQuery, Inputmask)), (function ($, Inputmask) { return Inputmask.extendDefinitions({ A: { validator: "[A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", cardinality: 1, - casing: "upper" + casing: "upper", }, "&": { validator: "[0-9A-Za-z\u0410-\u044f\u0401\u0451\xc0-\xff\xb5]", cardinality: 1, - casing: "upper" + casing: "upper", }, "#": { validator: "[0-9A-Fa-f]", cardinality: 1, - casing: "upper" - } + casing: "upper", + }, }), Inputmask.extendAliases({ url: { definitions: { i: { validator: ".", - cardinality: 1 - } + cardinality: 1, + }, }, mask: "(\\http://)|(\\http\\s://)|(ftp://)|(ftp\\s://)i{+}", insertMode: !1, - autoUnmask: !1 + autoUnmask: !1, }, ip: { mask: "i[i[i]].i[i[i]].i[i[i]].i[i[i]]", definitions: { i: { - validator: function(chrs, maskset, pos, strict, opts) { - return pos - 1 > -1 && "." !== maskset.buffer[pos - 1] ? (chrs = maskset.buffer[pos - 1] + chrs, - chrs = pos - 2 > -1 && "." !== maskset.buffer[pos - 2] ? maskset.buffer[pos - 2] + chrs : "0" + chrs) : chrs = "00" + chrs, + validator: function (chrs, maskset, pos, strict, opts) { + return pos - 1 > -1 && maskset.buffer[pos - 1] !== "." ? (chrs = maskset.buffer[pos - 1] + chrs, + chrs = pos - 2 > -1 && maskset.buffer[pos - 2] !== "." ? maskset.buffer[pos - 2] + chrs : "0" + chrs) : chrs = "00" + chrs, new RegExp("25[0-5]|2[0-4][0-9]|[01][0-9][0-9]").test(chrs); }, - cardinality: 1 - } + cardinality: 1, + }, }, - onUnMask: function(maskedValue, unmaskedValue, opts) { + onUnMask: function (maskedValue, unmaskedValue, opts) { return maskedValue; - } + }, }, email: { mask: "*{1,64}[.*{1,64}][.*{1,64}][.*{1,64}]@*{1,64}[.*{2,64}][.*{2,6}][.*{1,2}]", greedy: !1, - onBeforePaste: function(pastedValue, opts) { + onBeforePaste: function (pastedValue, opts) { return pastedValue = pastedValue.toLowerCase(), pastedValue.replace("mailto:", ""); }, definitions: { "*": { validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~-]", cardinality: 1, - casing: "lower" - } + casing: "lower", + }, }, - onUnMask: function(maskedValue, unmaskedValue, opts) { + onUnMask: function (maskedValue, unmaskedValue, opts) { return maskedValue; - } + }, }, mac: { - mask: "##:##:##:##:##:##" - } + mask: "##:##:##:##:##:##", + }, }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { +}(jQuery, Inputmask)), (function ($, Inputmask) { return Inputmask.extendAliases({ numeric: { - mask: function(opts) { - function autoEscape(txt) { - for (var escapedTxt = "", i = 0; i < txt.length; i++) escapedTxt += opts.definitions[txt.charAt(i)] ? "\\" + txt.charAt(i) : txt.charAt(i); + mask: function (opts) { + function autoEscape (txt) { + for (var escapedTxt = "", i = 0; i < txt.length; i++) { + escapedTxt += opts.definitions[txt.charAt(i)] ? "\\" + txt.charAt(i) : txt.charAt(i); + } return escapedTxt; } - if (0 !== opts.repeat && isNaN(opts.integerDigits) && (opts.integerDigits = opts.repeat), - opts.repeat = 0, opts.groupSeparator === opts.radixPoint && ("." === opts.radixPoint ? opts.groupSeparator = "," : "," === opts.radixPoint ? opts.groupSeparator = "." : opts.groupSeparator = ""), - " " === opts.groupSeparator && (opts.skipOptionalPartCharacter = void 0), opts.autoGroup = opts.autoGroup && "" !== opts.groupSeparator, - opts.autoGroup && ("string" == typeof opts.groupSize && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)), + if (opts.repeat !== 0 && isNaN(opts.integerDigits) && (opts.integerDigits = opts.repeat), + opts.repeat = 0, opts.groupSeparator === opts.radixPoint && (opts.radixPoint === "." ? opts.groupSeparator = "," : opts.radixPoint === "," ? opts.groupSeparator = "." : opts.groupSeparator = ""), + opts.groupSeparator === " " && (opts.skipOptionalPartCharacter = void 0), opts.autoGroup = opts.autoGroup && opts.groupSeparator !== "", + opts.autoGroup && (typeof opts.groupSize === "string" && isFinite(opts.groupSize) && (opts.groupSize = parseInt(opts.groupSize)), isFinite(opts.integerDigits))) { var seps = Math.floor(opts.integerDigits / opts.groupSize), mod = opts.integerDigits % opts.groupSize; - opts.integerDigits = parseInt(opts.integerDigits) + (0 === mod ? seps - 1 : seps), + opts.integerDigits = parseInt(opts.integerDigits) + (mod === 0 ? seps - 1 : seps), opts.integerDigits < 1 && (opts.integerDigits = "*"); } - opts.placeholder.length > 1 && (opts.placeholder = opts.placeholder.charAt(0)), - opts.radixFocus = opts.radixFocus && "" !== opts.placeholder && opts.integerOptional === !0, - opts.definitions[";"] = opts.definitions["~"], opts.definitions[";"].definitionSymbol = "~", - 1 == opts.numericInput && (opts.radixFocus = !1, opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), + opts.placeholder.length > 1 && (opts.placeholder = opts.placeholder.charAt(0)), + opts.radixFocus = opts.radixFocus && opts.placeholder !== "" && opts.integerOptional === !0, + opts.definitions[";"] = opts.definitions["~"], opts.definitions[";"].definitionSymbol = "~", + opts.numericInput == 1 && (opts.radixFocus = !1, opts.digitsOptional = !1, isNaN(opts.digits) && (opts.digits = 2), opts.decimalProtect = !1); var mask = autoEscape(opts.prefix); - return mask += "[+]", mask += opts.integerOptional === !0 ? "~{1," + opts.integerDigits + "}" : "~{" + opts.integerDigits + "}", - void 0 !== opts.digits && (isNaN(opts.digits) || parseInt(opts.digits) > 0) && (mask += opts.digitsOptional ? "[" + (opts.decimalProtect ? ":" : opts.radixPoint) + ";{1," + opts.digits + "}]" : (opts.decimalProtect ? ":" : opts.radixPoint) + ";{" + opts.digits + "}"), - "" !== opts.negationSymbol.back && (mask += "[-]"), mask += autoEscape(opts.suffix), + return mask += "[+]", mask += opts.integerOptional === !0 ? "~{1," + opts.integerDigits + "}" : "~{" + opts.integerDigits + "}", + void 0 !== opts.digits && (isNaN(opts.digits) || parseInt(opts.digits) > 0) && (mask += opts.digitsOptional ? "[" + (opts.decimalProtect ? ":" : opts.radixPoint) + ";{1," + opts.digits + "}]" : (opts.decimalProtect ? ":" : opts.radixPoint) + ";{" + opts.digits + "}"), + opts.negationSymbol.back !== "" && (mask += "[-]"), mask += autoEscape(opts.suffix), opts.greedy = !1, mask; }, placeholder: "", @@ -2123,7 +2399,7 @@ allowMinus: !0, negationSymbol: { front: "-", - back: "" + back: "", }, integerDigits: "+", integerOptional: !0, @@ -2137,71 +2413,91 @@ insertMode: !0, autoUnmask: !1, unmaskAsNumber: !1, - postFormat: function(buffer, pos, reformatOnly, opts) { + postFormat: function (buffer, pos, reformatOnly, opts) { opts.numericInput === !0 && (buffer = buffer.reverse(), isFinite(pos) && (pos = buffer.join("").length - pos - 1)); var i, l, suffixStripped = !1; - buffer.length >= opts.suffix.length && buffer.join("").indexOf(opts.suffix) === buffer.length - opts.suffix.length && (buffer.length = buffer.length - opts.suffix.length, + buffer.length >= opts.suffix.length && buffer.join("").indexOf(opts.suffix) === buffer.length - opts.suffix.length && (buffer.length -= opts.suffix.length, suffixStripped = !0), pos = pos >= buffer.length ? buffer.length - 1 : pos < opts.prefix.length ? opts.prefix.length : pos; var needsRefresh = !1, charAtPos = buffer[pos]; - if ("" === opts.groupSeparator || opts.numericInput !== !0 && -1 !== $.inArray(opts.radixPoint, buffer) && pos > $.inArray(opts.radixPoint, buffer) || new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]").test(charAtPos)) { - if (suffixStripped) for (i = 0, l = opts.suffix.length; l > i; i++) buffer.push(opts.suffix.charAt(i)); + if (opts.groupSeparator === "" || opts.numericInput !== !0 && $.inArray(opts.radixPoint, buffer) !== -1 && pos > $.inArray(opts.radixPoint, buffer) || new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]").test(charAtPos)) { + if (suffixStripped) { + for (i = 0, l = opts.suffix.length; l > i; i++) { + buffer.push(opts.suffix.charAt(i)); + } + } return { - pos: pos + pos: pos, }; } var cbuf = buffer.slice(); - charAtPos === opts.groupSeparator && (cbuf.splice(pos--, 1), charAtPos = cbuf[pos]), + charAtPos === opts.groupSeparator && (cbuf.splice(pos--, 1), charAtPos = cbuf[pos]), reformatOnly ? charAtPos !== opts.radixPoint && (cbuf[pos] = "?") : cbuf.splice(pos, 0, "?"); var bufVal = cbuf.join(""), bufValOrigin = bufVal; - if (bufVal.length > 0 && opts.autoGroup || reformatOnly && -1 !== bufVal.indexOf(opts.groupSeparator)) { + if (bufVal.length > 0 && opts.autoGroup || reformatOnly && bufVal.indexOf(opts.groupSeparator) !== -1) { var escapedGroupSeparator = Inputmask.escapeRegex(opts.groupSeparator); - needsRefresh = 0 === bufVal.indexOf(opts.groupSeparator), bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), ""); + needsRefresh = bufVal.indexOf(opts.groupSeparator) === 0, bufVal = bufVal.replace(new RegExp(escapedGroupSeparator, "g"), ""); var radixSplit = bufVal.split(opts.radixPoint); - if (bufVal = "" === opts.radixPoint ? bufVal : radixSplit[0], bufVal !== opts.prefix + "?0" && bufVal.length >= opts.groupSize + opts.prefix.length) for (var reg = new RegExp("([-+]?[\\d?]+)([\\d?]{" + opts.groupSize + "})"); reg.test(bufVal); ) bufVal = bufVal.replace(reg, "$1" + opts.groupSeparator + "$2"), - bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator); - "" !== opts.radixPoint && radixSplit.length > 1 && (bufVal += opts.radixPoint + radixSplit[1]); + if (bufVal = opts.radixPoint === "" ? bufVal : radixSplit[0], bufVal !== opts.prefix + "?0" && bufVal.length >= opts.groupSize + opts.prefix.length) { + for (var reg = new RegExp("([-+]?[\\d?]+)([\\d?]{" + opts.groupSize + "})"); reg.test(bufVal); ) { + bufVal = bufVal.replace(reg, "$1" + opts.groupSeparator + "$2"), + bufVal = bufVal.replace(opts.groupSeparator + opts.groupSeparator, opts.groupSeparator); + } + } + opts.radixPoint !== "" && radixSplit.length > 1 && (bufVal += opts.radixPoint + radixSplit[1]); + } + for (needsRefresh = bufValOrigin !== bufVal, buffer.length = bufVal.length, i = 0, + l = bufVal.length; l > i; i++) { + buffer[i] = bufVal.charAt(i); } - for (needsRefresh = bufValOrigin !== bufVal, buffer.length = bufVal.length, i = 0, - l = bufVal.length; l > i; i++) buffer[i] = bufVal.charAt(i); var newPos = $.inArray("?", buffer); - if (-1 === newPos && charAtPos === opts.radixPoint && (newPos = $.inArray(opts.radixPoint, buffer)), - reformatOnly ? buffer[newPos] = charAtPos : buffer.splice(newPos, 1), !needsRefresh && suffixStripped) for (i = 0, - l = opts.suffix.length; l > i; i++) buffer.push(opts.suffix.charAt(i)); - return newPos = opts.numericInput && isFinite(pos) ? buffer.join("").length - newPos - 1 : newPos, - opts.numericInput && (buffer = buffer.reverse(), $.inArray(opts.radixPoint, buffer) < newPos && buffer.join("").length - opts.suffix.length !== newPos && (newPos -= 1)), + if (newPos === -1 && charAtPos === opts.radixPoint && (newPos = $.inArray(opts.radixPoint, buffer)), + reformatOnly ? buffer[newPos] = charAtPos : buffer.splice(newPos, 1), !needsRefresh && suffixStripped) { + for (i = 0, + l = opts.suffix.length; l > i; i++) { + buffer.push(opts.suffix.charAt(i)); + } + } + return newPos = opts.numericInput && isFinite(pos) ? buffer.join("").length - newPos - 1 : newPos, + opts.numericInput && (buffer = buffer.reverse(), $.inArray(opts.radixPoint, buffer) < newPos && buffer.join("").length - opts.suffix.length !== newPos && (newPos -= 1)), { pos: newPos, refreshFromBuffer: needsRefresh, - buffer: buffer + buffer: buffer, }; }, - onBeforeWrite: function(e, buffer, caretPos, opts) { - if (e && ("blur" === e.type || "checkval" === e.type)) { + onBeforeWrite: function (e, buffer, caretPos, opts) { + if (e && (e.type === "blur" || e.type === "checkval")) { var maskedValue = buffer.join(""), processValue = maskedValue.replace(opts.prefix, ""); - if (processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - "," === opts.radixPoint && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), - isFinite(processValue) && isFinite(opts.min) && parseFloat(processValue) < parseFloat(opts.min)) return $.extend(!0, { - refreshFromBuffer: !0, - buffer: (opts.prefix + opts.min).split("") - }, opts.postFormat((opts.prefix + opts.min).split(""), 0, !0, opts)); + if (processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + opts.radixPoint === "," && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), + isFinite(processValue) && isFinite(opts.min) && parseFloat(processValue) < parseFloat(opts.min)) { + return $.extend(!0, { + refreshFromBuffer: !0, + buffer: (opts.prefix + opts.min).split(""), + }, opts.postFormat((opts.prefix + opts.min).split(""), 0, !0, opts)); + } if (opts.numericInput !== !0) { - var tmpBufSplit = "" !== opts.radixPoint ? buffer.join("").split(opts.radixPoint) : [ buffer.join("") ], matchRslt = tmpBufSplit[0].match(opts.regex.integerPart(opts)), matchRsltDigits = 2 === tmpBufSplit.length ? tmpBufSplit[1].match(opts.regex.integerNPart(opts)) : void 0; + var tmpBufSplit = opts.radixPoint !== "" ? buffer.join("").split(opts.radixPoint) : [ buffer.join("") ], matchRslt = tmpBufSplit[0].match(opts.regex.integerPart(opts)), matchRsltDigits = tmpBufSplit.length === 2 ? tmpBufSplit[1].match(opts.regex.integerNPart(opts)) : void 0; if (matchRslt) { - matchRslt[0] !== opts.negationSymbol.front + "0" && matchRslt[0] !== opts.negationSymbol.front && "+" !== matchRslt[0] || void 0 !== matchRsltDigits && !matchRsltDigits[0].match(/^0+$/) || buffer.splice(matchRslt.index, 1); + matchRslt[0] !== opts.negationSymbol.front + "0" && matchRslt[0] !== opts.negationSymbol.front && matchRslt[0] !== "+" || void 0 !== matchRsltDigits && !matchRsltDigits[0].match(/^0+$/) || buffer.splice(matchRslt.index, 1); var radixPosition = $.inArray(opts.radixPoint, buffer); - if (-1 !== radixPosition) { + if (radixPosition !== -1) { if (isFinite(opts.digits) && !opts.digitsOptional) { - for (var i = 1; i <= opts.digits; i++) (void 0 === buffer[radixPosition + i] || buffer[radixPosition + i] === opts.placeholder.charAt(0)) && (buffer[radixPosition + i] = "0"); + for (var i = 1; i <= opts.digits; i++) { + (void 0 === buffer[radixPosition + i] || buffer[radixPosition + i] === opts.placeholder.charAt(0)) && (buffer[radixPosition + i] = "0"); + } return { refreshFromBuffer: maskedValue !== buffer.join(""), - buffer: buffer + buffer: buffer, + }; + } + if (radixPosition === buffer.length - opts.suffix.length - 1) { + return buffer.splice(radixPosition, 1), + { + refreshFromBuffer: !0, + buffer: buffer, }; } - if (radixPosition === buffer.length - opts.suffix.length - 1) return buffer.splice(radixPosition, 1), - { - refreshFromBuffer: !0, - buffer: buffer - }; } } } @@ -2212,265 +2508,301 @@ } }, regex: { - integerPart: function(opts) { + integerPart: function (opts) { return new RegExp("[" + Inputmask.escapeRegex(opts.negationSymbol.front) + "+]?\\d+"); }, - integerNPart: function(opts) { + integerNPart: function (opts) { return new RegExp("[\\d" + Inputmask.escapeRegex(opts.groupSeparator) + "]+"); - } + }, }, - signHandler: function(chrs, maskset, pos, strict, opts) { - if (!strict && opts.allowMinus && "-" === chrs || opts.allowPlus && "+" === chrs) { + signHandler: function (chrs, maskset, pos, strict, opts) { + if (!strict && opts.allowMinus && chrs === "-" || opts.allowPlus && chrs === "+") { var matchRslt = maskset.buffer.join("").match(opts.regex.integerPart(opts)); - if (matchRslt && matchRslt[0].length > 0) return maskset.buffer[matchRslt.index] === ("-" === chrs ? "+" : opts.negationSymbol.front) ? "-" === chrs ? "" !== opts.negationSymbol.back ? { - pos: matchRslt.index, - c: opts.negationSymbol.front, - remove: matchRslt.index, - caret: pos, - insert: { - pos: maskset.buffer.length - opts.suffix.length - 1, - c: opts.negationSymbol.back - } - } : { - pos: matchRslt.index, - c: opts.negationSymbol.front, - remove: matchRslt.index, - caret: pos - } : "" !== opts.negationSymbol.back ? { - pos: matchRslt.index, - c: "+", - remove: [ matchRslt.index, maskset.buffer.length - opts.suffix.length - 1 ], - caret: pos - } : { - pos: matchRslt.index, - c: "+", - remove: matchRslt.index, - caret: pos - } : maskset.buffer[matchRslt.index] === ("-" === chrs ? opts.negationSymbol.front : "+") ? "-" === chrs && "" !== opts.negationSymbol.back ? { - remove: [ matchRslt.index, maskset.buffer.length - opts.suffix.length - 1 ], - caret: pos - 1 - } : { - remove: matchRslt.index, - caret: pos - 1 - } : "-" === chrs ? "" !== opts.negationSymbol.back ? { - pos: matchRslt.index, - c: opts.negationSymbol.front, - caret: pos + 1, - insert: { - pos: maskset.buffer.length - opts.suffix.length, - c: opts.negationSymbol.back - } - } : { - pos: matchRslt.index, - c: opts.negationSymbol.front, - caret: pos + 1 - } : { - pos: matchRslt.index, - c: chrs, - caret: pos + 1 - }; + if (matchRslt && matchRslt[0].length > 0) { + return maskset.buffer[matchRslt.index] === (chrs === "-" ? "+" : opts.negationSymbol.front) ? chrs === "-" ? opts.negationSymbol.back !== "" ? { + pos: matchRslt.index, + c: opts.negationSymbol.front, + remove: matchRslt.index, + caret: pos, + insert: { + pos: maskset.buffer.length - opts.suffix.length - 1, + c: opts.negationSymbol.back, + }, + } : { + pos: matchRslt.index, + c: opts.negationSymbol.front, + remove: matchRslt.index, + caret: pos, + } : opts.negationSymbol.back !== "" ? { + pos: matchRslt.index, + c: "+", + remove: [ matchRslt.index, maskset.buffer.length - opts.suffix.length - 1 ], + caret: pos, + } : { + pos: matchRslt.index, + c: "+", + remove: matchRslt.index, + caret: pos, + } : maskset.buffer[matchRslt.index] === (chrs === "-" ? opts.negationSymbol.front : "+") ? chrs === "-" && opts.negationSymbol.back !== "" ? { + remove: [ matchRslt.index, maskset.buffer.length - opts.suffix.length - 1 ], + caret: pos - 1, + } : { + remove: matchRslt.index, + caret: pos - 1, + } : chrs === "-" ? opts.negationSymbol.back !== "" ? { + pos: matchRslt.index, + c: opts.negationSymbol.front, + caret: pos + 1, + insert: { + pos: maskset.buffer.length - opts.suffix.length, + c: opts.negationSymbol.back, + }, + } : { + pos: matchRslt.index, + c: opts.negationSymbol.front, + caret: pos + 1, + } : { + pos: matchRslt.index, + c: chrs, + caret: pos + 1, + }; + } } return !1; }, - radixHandler: function(chrs, maskset, pos, strict, opts) { - if (!strict && (-1 !== $.inArray(chrs, [ ",", "." ]) && (chrs = opts.radixPoint), + radixHandler: function (chrs, maskset, pos, strict, opts) { + if (!strict && ($.inArray(chrs, [ ",", "." ]) !== -1 && (chrs = opts.radixPoint), chrs === opts.radixPoint && void 0 !== opts.digits && (isNaN(opts.digits) || parseInt(opts.digits) > 0))) { var radixPos = $.inArray(opts.radixPoint, maskset.buffer), integerValue = maskset.buffer.join("").match(opts.regex.integerPart(opts)); - if (-1 !== radixPos && maskset.validPositions[radixPos]) return maskset.validPositions[radixPos - 1] ? { - caret: radixPos + 1 - } : { - pos: integerValue.index, - c: integerValue[0], - caret: radixPos + 1 - }; - if (!integerValue || "0" === integerValue[0] && integerValue.index + 1 !== pos) return maskset.buffer[integerValue ? integerValue.index : pos] = "0", - { - pos: (integerValue ? integerValue.index : pos) + 1, - c: opts.radixPoint - }; + if (radixPos !== -1 && maskset.validPositions[radixPos]) { + return maskset.validPositions[radixPos - 1] ? { + caret: radixPos + 1, + } : { + pos: integerValue.index, + c: integerValue[0], + caret: radixPos + 1, + }; + } + if (!integerValue || integerValue[0] === "0" && integerValue.index + 1 !== pos) { + return maskset.buffer[integerValue ? integerValue.index : pos] = "0", + { + pos: (integerValue ? integerValue.index : pos) + 1, + c: opts.radixPoint, + }; + } } return !1; }, - leadingZeroHandler: function(chrs, maskset, pos, strict, opts) { + leadingZeroHandler: function (chrs, maskset, pos, strict, opts) { if (opts.numericInput === !0) { - if ("0" === maskset.buffer[maskset.buffer.length - opts.prefix.length - 1]) return { - pos: pos, - remove: maskset.buffer.length - opts.prefix.length - 1 - }; - } else { - var matchRslt = maskset.buffer.join("").match(opts.regex.integerNPart(opts)), radixPosition = $.inArray(opts.radixPoint, maskset.buffer); - if (matchRslt && !strict && (-1 === radixPosition || radixPosition >= pos)) if (0 === matchRslt[0].indexOf("0")) { - pos < opts.prefix.length && (pos = matchRslt.index); - var _radixPosition = $.inArray(opts.radixPoint, maskset._buffer), digitsMatch = maskset._buffer && maskset.buffer.slice(radixPosition).join("") === maskset._buffer.slice(_radixPosition).join("") || 0 === parseInt(maskset.buffer.slice(radixPosition + 1).join("")), integerMatch = maskset._buffer && maskset.buffer.slice(matchRslt.index, radixPosition).join("") === maskset._buffer.slice(opts.prefix.length, _radixPosition).join("") || "0" === maskset.buffer.slice(matchRslt.index, radixPosition).join(""); - if (-1 === radixPosition || digitsMatch && integerMatch) return maskset.buffer.splice(matchRslt.index, 1), - pos = pos > matchRslt.index ? pos - 1 : matchRslt.index, { - pos: pos, - remove: matchRslt.index - }; - if (matchRslt.index + 1 === pos || "0" === chrs) return maskset.buffer.splice(matchRslt.index, 1), - pos = matchRslt.index, { + if (maskset.buffer[maskset.buffer.length - opts.prefix.length - 1] === "0") { + return { pos: pos, - remove: matchRslt.index + remove: maskset.buffer.length - opts.prefix.length - 1, }; - } else if ("0" === chrs && pos <= matchRslt.index && matchRslt[0] !== opts.groupSeparator) return !1; + } + } else { + var matchRslt = maskset.buffer.join("").match(opts.regex.integerNPart(opts)), radixPosition = $.inArray(opts.radixPoint, maskset.buffer); + if (matchRslt && !strict && (radixPosition === -1 || radixPosition >= pos)) { + if (matchRslt[0].indexOf("0") === 0) { + pos < opts.prefix.length && (pos = matchRslt.index); + var _radixPosition = $.inArray(opts.radixPoint, maskset._buffer), digitsMatch = maskset._buffer && maskset.buffer.slice(radixPosition).join("") === maskset._buffer.slice(_radixPosition).join("") || parseInt(maskset.buffer.slice(radixPosition + 1).join("")) === 0, integerMatch = maskset._buffer && maskset.buffer.slice(matchRslt.index, radixPosition).join("") === maskset._buffer.slice(opts.prefix.length, _radixPosition).join("") || maskset.buffer.slice(matchRslt.index, radixPosition).join("") === "0"; + if (radixPosition === -1 || digitsMatch && integerMatch) { + return maskset.buffer.splice(matchRslt.index, 1), + pos = pos > matchRslt.index ? pos - 1 : matchRslt.index, { + pos: pos, + remove: matchRslt.index, + }; + } + if (matchRslt.index + 1 === pos || chrs === "0") { + return maskset.buffer.splice(matchRslt.index, 1), + pos = matchRslt.index, { + pos: pos, + remove: matchRslt.index, + }; + } + } else if (chrs === "0" && pos <= matchRslt.index && matchRslt[0] !== opts.groupSeparator) { + return !1; + } + } } return !0; }, - postValidation: function(buffer, currentResult, opts) { + postValidation: function (buffer, currentResult, opts) { var isValid = !0, maskedValue = opts.numericInput ? buffer.slice().reverse().join("") : buffer.join(""), processValue = maskedValue.replace(opts.prefix, ""); - return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - "," === opts.radixPoint && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), - processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-"), - processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), - processValue = processValue === opts.negationSymbol.front ? processValue + "0" : processValue, - isFinite(processValue) && (null !== opts.max && isFinite(opts.max) && (processValue = parseFloat(processValue) > parseFloat(opts.max) ? opts.max : processValue, - isValid = opts.postFormat((opts.prefix + processValue).split(""), 0, !0, opts)), - null !== opts.min && isFinite(opts.min) && (processValue = parseFloat(processValue) < parseFloat(opts.min) ? opts.min : processValue, - isValid = opts.postFormat((opts.prefix + processValue).split(""), 0, !0, opts))), + return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + opts.radixPoint === "," && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), + processValue = processValue.replace(new RegExp("^" + Inputmask.escapeRegex(opts.negationSymbol.front)), "-"), + processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.negationSymbol.back) + "$"), ""), + processValue = processValue === opts.negationSymbol.front ? processValue + "0" : processValue, + isFinite(processValue) && (opts.max !== null && isFinite(opts.max) && (processValue = parseFloat(processValue) > parseFloat(opts.max) ? opts.max : processValue, + isValid = opts.postFormat((opts.prefix + processValue).split(""), 0, !0, opts)), + opts.min !== null && isFinite(opts.min) && (processValue = parseFloat(processValue) < parseFloat(opts.min) ? opts.min : processValue, + isValid = opts.postFormat((opts.prefix + processValue).split(""), 0, !0, opts))), isValid; }, definitions: { "~": { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); - if (!isValid && (isValid = opts.radixHandler(chrs, maskset, pos, strict, opts), - !isValid && (isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs), - isValid === !0 && (isValid = opts.leadingZeroHandler(chrs, maskset, pos, strict, opts), + if (!isValid && (isValid = opts.radixHandler(chrs, maskset, pos, strict, opts), + !isValid && (isValid = strict ? new RegExp("[0-9" + Inputmask.escapeRegex(opts.groupSeparator) + "]").test(chrs) : new RegExp("[0-9]").test(chrs), + isValid === !0 && (isValid = opts.leadingZeroHandler(chrs, maskset, pos, strict, opts), isValid === !0)))) { var radixPosition = $.inArray(opts.radixPoint, maskset.buffer); - isValid = -1 !== radixPosition && opts.digitsOptional === !1 && opts.numericInput !== !0 && pos > radixPosition && !strict ? { + isValid = radixPosition !== -1 && opts.digitsOptional === !1 && opts.numericInput !== !0 && pos > radixPosition && !strict ? { pos: pos, - remove: pos + remove: pos, } : { - pos: pos + pos: pos, }; } return isValid; }, cardinality: 1, - prevalidator: null + prevalidator: null, }, "+": { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); - return !isValid && (strict && opts.allowMinus && chrs === opts.negationSymbol.front || opts.allowMinus && "-" === chrs || opts.allowPlus && "+" === chrs) && (isValid = "-" === chrs ? "" !== opts.negationSymbol.back ? { + return !isValid && (strict && opts.allowMinus && chrs === opts.negationSymbol.front || opts.allowMinus && chrs === "-" || opts.allowPlus && chrs === "+") && (isValid = chrs === "-" ? opts.negationSymbol.back !== "" ? { pos: pos, - c: "-" === chrs ? opts.negationSymbol.front : "+", + c: chrs === "-" ? opts.negationSymbol.front : "+", caret: pos + 1, insert: { pos: maskset.buffer.length, - c: opts.negationSymbol.back - } + c: opts.negationSymbol.back, + }, } : { pos: pos, - c: "-" === chrs ? opts.negationSymbol.front : "+", - caret: pos + 1 + c: chrs === "-" ? opts.negationSymbol.front : "+", + caret: pos + 1, } : !0), isValid; }, cardinality: 1, prevalidator: null, - placeholder: "" + placeholder: "", }, "-": { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); - return !isValid && strict && opts.allowMinus && chrs === opts.negationSymbol.back && (isValid = !0), + return !isValid && strict && opts.allowMinus && chrs === opts.negationSymbol.back && (isValid = !0), isValid; }, cardinality: 1, prevalidator: null, - placeholder: "" + placeholder: "", }, ":": { - validator: function(chrs, maskset, pos, strict, opts) { + validator: function (chrs, maskset, pos, strict, opts) { var isValid = opts.signHandler(chrs, maskset, pos, strict, opts); if (!isValid) { var radix = "[" + Inputmask.escapeRegex(opts.radixPoint) + ",\\.]"; isValid = new RegExp(radix).test(chrs), isValid && maskset.validPositions[pos] && maskset.validPositions[pos].match.placeholder === opts.radixPoint && (isValid = { - caret: pos + 1 + caret: pos + 1, }); } return isValid ? { - c: opts.radixPoint + c: opts.radixPoint, } : isValid; }, cardinality: 1, prevalidator: null, - placeholder: function(opts) { + placeholder: function (opts) { return opts.radixPoint; - } - } + }, + }, }, - onUnMask: function(maskedValue, unmaskedValue, opts) { + onUnMask: function (maskedValue, unmaskedValue, opts) { var processValue = maskedValue.replace(opts.prefix, ""); - return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - opts.unmaskAsNumber ? ("" !== opts.radixPoint && -1 !== processValue.indexOf(opts.radixPoint) && (processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".")), + return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + opts.unmaskAsNumber ? (opts.radixPoint !== "" && processValue.indexOf(opts.radixPoint) !== -1 && (processValue = processValue.replace(Inputmask.escapeRegex.call(this, opts.radixPoint), ".")), Number(processValue)) : processValue; }, - isComplete: function(buffer, opts) { + isComplete: function (buffer, opts) { var maskedValue = buffer.join(""), bufClone = buffer.slice(); - if (opts.postFormat(bufClone, 0, !0, opts), bufClone.join("") !== maskedValue) return !1; + if (opts.postFormat(bufClone, 0, !0, opts), bufClone.join("") !== maskedValue) { + return !1; + } var processValue = maskedValue.replace(opts.prefix, ""); - return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), - "," === opts.radixPoint && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), + return processValue = processValue.replace(opts.suffix, ""), processValue = processValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""), + opts.radixPoint === "," && (processValue = processValue.replace(Inputmask.escapeRegex(opts.radixPoint), ".")), isFinite(processValue); }, - onBeforeMask: function(initialValue, opts) { - if ("" !== opts.radixPoint && isFinite(initialValue)) initialValue = initialValue.toString().replace(".", opts.radixPoint); else { + onBeforeMask: function (initialValue, opts) { + if (opts.radixPoint !== "" && isFinite(initialValue)) { + initialValue = initialValue.toString().replace(".", opts.radixPoint); + } else { var kommaMatches = initialValue.match(/,/g), dotMatches = initialValue.match(/\./g); - dotMatches && kommaMatches ? dotMatches.length > kommaMatches.length ? (initialValue = initialValue.replace(/\./g, ""), - initialValue = initialValue.replace(",", opts.radixPoint)) : kommaMatches.length > dotMatches.length ? (initialValue = initialValue.replace(/,/g, ""), + dotMatches && kommaMatches ? dotMatches.length > kommaMatches.length ? (initialValue = initialValue.replace(/\./g, ""), + initialValue = initialValue.replace(",", opts.radixPoint)) : kommaMatches.length > dotMatches.length ? (initialValue = initialValue.replace(/,/g, ""), initialValue = initialValue.replace(".", opts.radixPoint)) : initialValue = initialValue.indexOf(".") < initialValue.indexOf(",") ? initialValue.replace(/\./g, "") : initialValue = initialValue.replace(/,/g, "") : initialValue = initialValue.replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), ""); } - if (0 === opts.digits && (-1 !== initialValue.indexOf(".") ? initialValue = initialValue.substring(0, initialValue.indexOf(".")) : -1 !== initialValue.indexOf(",") && (initialValue = initialValue.substring(0, initialValue.indexOf(",")))), - "" !== opts.radixPoint && isFinite(opts.digits) && -1 !== initialValue.indexOf(opts.radixPoint)) { + if (opts.digits === 0 && (initialValue.indexOf(".") !== -1 ? initialValue = initialValue.substring(0, initialValue.indexOf(".")) : initialValue.indexOf(",") !== -1 && (initialValue = initialValue.substring(0, initialValue.indexOf(",")))), + opts.radixPoint !== "" && isFinite(opts.digits) && initialValue.indexOf(opts.radixPoint) !== -1) { var valueParts = initialValue.split(opts.radixPoint), decPart = valueParts[1].match(new RegExp("\\d*"))[0]; if (parseInt(opts.digits) < decPart.toString().length) { var digitsFactor = Math.pow(10, parseInt(opts.digits)); - initialValue = initialValue.replace(Inputmask.escapeRegex(opts.radixPoint), "."), - initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor, + initialValue = initialValue.replace(Inputmask.escapeRegex(opts.radixPoint), "."), + initialValue = Math.round(parseFloat(initialValue) * digitsFactor) / digitsFactor, initialValue = initialValue.toString().replace(".", opts.radixPoint); } } return initialValue.toString(); }, - canClearPosition: function(maskset, position, lvp, strict, opts) { - var positionInput = maskset.validPositions[position].input, canClear = positionInput !== opts.radixPoint || null !== maskset.validPositions[position].match.fn && opts.decimalProtect === !1 || isFinite(positionInput) || position === lvp || positionInput === opts.groupSeparator || positionInput === opts.negationSymbol.front || positionInput === opts.negationSymbol.back; + canClearPosition: function (maskset, position, lvp, strict, opts) { + var positionInput = maskset.validPositions[position].input, canClear = positionInput !== opts.radixPoint || maskset.validPositions[position].match.fn !== null && opts.decimalProtect === !1 || isFinite(positionInput) || position === lvp || positionInput === opts.groupSeparator || positionInput === opts.negationSymbol.front || positionInput === opts.negationSymbol.back; if (canClear && isFinite(positionInput)) { var matchRslt, radixPos = $.inArray(opts.radixPoint, maskset.buffer), radixInjection = !1; if (void 0 === maskset.validPositions[radixPos] && (maskset.validPositions[radixPos] = { - input: opts.radixPoint + input: opts.radixPoint, }, radixInjection = !0), !strict && maskset.buffer) { matchRslt = maskset.buffer.join("").substr(0, position).match(opts.regex.integerNPart(opts)); - var pos = position + 1, isNull = null == matchRslt || 0 === parseInt(matchRslt[0].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")); - if (isNull) for (;maskset.validPositions[pos] && (maskset.validPositions[pos].input === opts.groupSeparator || "0" === maskset.validPositions[pos].input); ) delete maskset.validPositions[pos], - pos++; + var pos = position + 1, isNull = matchRslt == null || parseInt(matchRslt[0].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")) === 0; + if (isNull) { + for (;maskset.validPositions[pos] && (maskset.validPositions[pos].input === opts.groupSeparator || maskset.validPositions[pos].input === "0"); ) { + delete maskset.validPositions[pos], + pos++; + } + } } var buffer = []; - for (var vp in maskset.validPositions) void 0 !== maskset.validPositions[vp].input && buffer.push(maskset.validPositions[vp].input); + for (var vp in maskset.validPositions) { + void 0 !== maskset.validPositions[vp].input && buffer.push(maskset.validPositions[vp].input); + } if (radixInjection && delete maskset.validPositions[radixPos], radixPos > 0) { var bufVal = buffer.join(""); - if (matchRslt = bufVal.match(opts.regex.integerNPart(opts))) if (radixPos >= position) if (0 === matchRslt[0].indexOf("0")) canClear = matchRslt.index !== position || "0" === opts.placeholder; else { - var intPart = parseInt(matchRslt[0].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")), radixPart = parseInt(bufVal.split(opts.radixPoint)[1]); - 10 > intPart && maskset.validPositions[position] && ("0" !== opts.placeholder || radixPart > 0) && (maskset.validPositions[position].input = "0", - maskset.p = opts.prefix.length + 1, canClear = !1); - } else 0 === matchRslt[0].indexOf("0") && 3 === bufVal.length && (maskset.validPositions = {}, - canClear = !1); + if (matchRslt = bufVal.match(opts.regex.integerNPart(opts))) { + if (radixPos >= position) { + if (matchRslt[0].indexOf("0") === 0) { + canClear = matchRslt.index !== position || opts.placeholder === "0"; + } else { + var intPart = parseInt(matchRslt[0].replace(new RegExp(Inputmask.escapeRegex(opts.groupSeparator), "g"), "")), radixPart = parseInt(bufVal.split(opts.radixPoint)[1]); + intPart < 10 && maskset.validPositions[position] && (opts.placeholder !== "0" || radixPart > 0) && (maskset.validPositions[position].input = "0", + maskset.p = opts.prefix.length + 1, canClear = !1); + } + } else { + matchRslt[0].indexOf("0") === 0 && bufVal.length === 3 && (maskset.validPositions = {}, + canClear = !1); + } + } } } return canClear; }, - onKeyDown: function(e, buffer, caretPos, opts) { + onKeyDown: function (e, buffer, caretPos, opts) { var $input = $(this); - if (e.ctrlKey) switch (e.keyCode) { - case Inputmask.keyCode.UP: - $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step)), $input.trigger("setvalue"); - break; + if (e.ctrlKey) { + switch (e.keyCode) { + case Inputmask.keyCode.UP: + $input.val(parseFloat(this.inputmask.unmaskedvalue()) + parseInt(opts.step)), $input.trigger("setvalue"); + break; - case Inputmask.keyCode.DOWN: - $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step)), $input.trigger("setvalue"); + case Inputmask.keyCode.DOWN: + $input.val(parseFloat(this.inputmask.unmaskedvalue()) - parseInt(opts.step)), $input.trigger("setvalue"); + } } - } + }, }, currency: { prefix: "$ ", @@ -2480,15 +2812,15 @@ autoGroup: !0, digits: 2, digitsOptional: !1, - clearMaskOnLostFocus: !1 + clearMaskOnLostFocus: !1, }, decimal: { - alias: "numeric" + alias: "numeric", }, integer: { alias: "numeric", digits: 0, - radixPoint: "" + radixPoint: "", }, percentage: { alias: "numeric", @@ -2500,16 +2832,16 @@ max: 100, suffix: " %", allowPlus: !1, - allowMinus: !1 - } + allowMinus: !1, + }, }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { +}(jQuery, Inputmask)), (function ($, Inputmask) { return Inputmask.extendAliases({ phone: { url: "/defiline/static/src/lib/phone-codes/phone-codes.js", countrycode: "", phoneCodeCache: {}, - mask: function(opts) { + mask: function (opts) { if (void 0 === opts.phoneCodeCache[opts.url]) { var maskList = []; opts.definitions["#"] = opts.definitions[9], $.ajax({ @@ -2517,13 +2849,13 @@ async: !1, type: "get", dataType: "json", - success: function(response) { + success: function (response) { maskList = response; }, - error: function(xhr, ajaxOptions, thrownError) { + error: function (xhr, ajaxOptions, thrownError) { alert(thrownError + " - " + opts.url); - } - }), opts.phoneCodeCache[opts.url] = maskList.sort(function(a, b) { + }, + }), opts.phoneCodeCache[opts.url] = maskList.sort(function (a, b) { return (a.mask || a) < (b.mask || b) ? -1 : 1; }); } @@ -2532,20 +2864,20 @@ keepStatic: !1, nojumps: !0, nojumpsThreshold: 1, - onBeforeMask: function(value, opts) { + onBeforeMask: function (value, opts) { var processedValue = value.replace(/^0{1,2}/, "").replace(/[\s]/g, ""); - return (processedValue.indexOf(opts.countrycode) > 1 || -1 === processedValue.indexOf(opts.countrycode)) && (processedValue = "+" + opts.countrycode + processedValue), + return (processedValue.indexOf(opts.countrycode) > 1 || processedValue.indexOf(opts.countrycode) === -1) && (processedValue = "+" + opts.countrycode + processedValue), processedValue; - } + }, }, phonebe: { alias: "phone", url: "/defiline/static/src/lib/phone-codes/phone-be.js", countrycode: "32", - nojumpsThreshold: 4 - } + nojumpsThreshold: 4, + }, }), Inputmask; -}(jQuery, Inputmask), function($, Inputmask) { +}(jQuery, Inputmask)), (function ($, Inputmask) { return Inputmask.extendAliases({ Regex: { mask: "r", @@ -2555,99 +2887,121 @@ regexTokens: null, tokenizer: /\[\^?]?(?:[^\\\]]+|\\[\S\s]?)*]?|\\(?:0(?:[0-3][0-7]{0,2}|[4-7][0-7]?)?|[1-9][0-9]*|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|c[A-Za-z]|[\S\s]?)|\((?:\?[:=!]?)?|(?:[?*+]|\{[0-9]+(?:,[0-9]*)?\})\??|[^.?*+^${[()|\\]+|./g, quantifierFilter: /[0-9]+[^,]/, - isComplete: function(buffer, opts) { + isComplete: function (buffer, opts) { return new RegExp(opts.regex).test(buffer.join("")); }, definitions: { r: { - validator: function(chrs, maskset, pos, strict, opts) { - function RegexToken(isGroup, isQuantifier) { - this.matches = [], this.isGroup = isGroup || !1, this.isQuantifier = isQuantifier || !1, + validator: function (chrs, maskset, pos, strict, opts) { + function RegexToken (isGroup, isQuantifier) { + this.matches = [], this.isGroup = isGroup || !1, this.isQuantifier = isQuantifier || !1, this.quantifier = { min: 1, - max: 1 + max: 1, }, this.repeaterPart = void 0; } - function analyseRegex() { + function analyseRegex () { var match, m, currentToken = new RegexToken(), opengroups = []; - for (opts.regexTokens = []; match = opts.tokenizer.exec(opts.regex); ) switch (m = match[0], - m.charAt(0)) { - case "(": - opengroups.push(new RegexToken(!0)); - break; + for (opts.regexTokens = []; match = opts.tokenizer.exec(opts.regex); ) { + switch (m = match[0], + m.charAt(0)) { + case "(": + opengroups.push(new RegexToken(!0)); + break; - case ")": - groupToken = opengroups.pop(), opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(groupToken) : currentToken.matches.push(groupToken); - break; + case ")": + groupToken = opengroups.pop(), opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(groupToken) : currentToken.matches.push(groupToken); + break; - case "{": - case "+": - case "*": - var quantifierToken = new RegexToken(!1, !0); - m = m.replace(/[{}]/g, ""); - var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = 1 === mq.length ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); - if (quantifierToken.quantifier = { - min: mq0, - max: mq1 - }, opengroups.length > 0) { - var matches = opengroups[opengroups.length - 1].matches; - match = matches.pop(), match.isGroup || (groupToken = new RegexToken(!0), groupToken.matches.push(match), - match = groupToken), matches.push(match), matches.push(quantifierToken); - } else match = currentToken.matches.pop(), match.isGroup || (groupToken = new RegexToken(!0), - groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), - currentToken.matches.push(quantifierToken); - break; + case "{": + case "+": + case "*": + var quantifierToken = new RegexToken(!1, !0); + m = m.replace(/[{}]/g, ""); + var mq = m.split(","), mq0 = isNaN(mq[0]) ? mq[0] : parseInt(mq[0]), mq1 = mq.length === 1 ? mq0 : isNaN(mq[1]) ? mq[1] : parseInt(mq[1]); + if (quantifierToken.quantifier = { + min: mq0, + max: mq1, + }, opengroups.length > 0) { + var matches = opengroups[opengroups.length - 1].matches; + match = matches.pop(), match.isGroup || (groupToken = new RegexToken(!0), groupToken.matches.push(match), + match = groupToken), matches.push(match), matches.push(quantifierToken); + } else { + match = currentToken.matches.pop(), match.isGroup || (groupToken = new RegexToken(!0), + groupToken.matches.push(match), match = groupToken), currentToken.matches.push(match), + currentToken.matches.push(quantifierToken); + } + break; - default: - opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(m) : currentToken.matches.push(m); + default: + opengroups.length > 0 ? opengroups[opengroups.length - 1].matches.push(m) : currentToken.matches.push(m); + } } currentToken.matches.length > 0 && opts.regexTokens.push(currentToken); } - function validateRegexToken(token, fromGroup) { + function validateRegexToken (token, fromGroup) { var isvalid = !1; fromGroup && (regexPart += "(", openGroupCount++); for (var mndx = 0; mndx < token.matches.length; mndx++) { var matchToken = token.matches[mndx]; - if (matchToken.isGroup === !0) isvalid = validateRegexToken(matchToken, !0); else if (matchToken.isQuantifier === !0) { + if (matchToken.isGroup === !0) { + isvalid = validateRegexToken(matchToken, !0); + } else if (matchToken.isQuantifier === !0) { var crrntndx = $.inArray(matchToken, token.matches), matchGroup = token.matches[crrntndx - 1], regexPartBak = regexPart; if (isNaN(matchToken.quantifier.max)) { - for (;matchToken.repeaterPart && matchToken.repeaterPart !== regexPart && matchToken.repeaterPart.length > regexPart.length && !(isvalid = validateRegexToken(matchGroup, !0)); ) ; - isvalid = isvalid || validateRegexToken(matchGroup, !0), isvalid && (matchToken.repeaterPart = regexPart), + for (;matchToken.repeaterPart && matchToken.repeaterPart !== regexPart && matchToken.repeaterPart.length > regexPart.length && !(isvalid = validateRegexToken(matchGroup, !0)); ) {} + isvalid = isvalid || validateRegexToken(matchGroup, !0), isvalid && (matchToken.repeaterPart = regexPart), regexPart = regexPartBak + matchToken.quantifier.max; } else { - for (var i = 0, qm = matchToken.quantifier.max - 1; qm > i && !(isvalid = validateRegexToken(matchGroup, !0)); i++) ; + for (var i = 0, qm = matchToken.quantifier.max - 1; qm > i && !(isvalid = validateRegexToken(matchGroup, !0)); i++) {} regexPart = regexPartBak + "{" + matchToken.quantifier.min + "," + matchToken.quantifier.max + "}"; } - } else if (void 0 !== matchToken.matches) for (var k = 0; k < matchToken.length && !(isvalid = validateRegexToken(matchToken[k], fromGroup)); k++) ; else { + } else if (void 0 !== matchToken.matches) { + for (var k = 0; k < matchToken.length && !(isvalid = validateRegexToken(matchToken[k], fromGroup)); k++) {} + } else { var testExp; - if ("[" == matchToken.charAt(0)) { + if (matchToken.charAt(0) == "[") { testExp = regexPart, testExp += matchToken; - for (var j = 0; openGroupCount > j; j++) testExp += ")"; + for (var j = 0; openGroupCount > j; j++) { + testExp += ")"; + } var exp = new RegExp("^(" + testExp + ")$"); isvalid = exp.test(bufferStr); - } else for (var l = 0, tl = matchToken.length; tl > l; l++) if ("\\" !== matchToken.charAt(l)) { - testExp = regexPart, testExp += matchToken.substr(0, l + 1), testExp = testExp.replace(/\|$/, ""); - for (var j = 0; openGroupCount > j; j++) testExp += ")"; - var exp = new RegExp("^(" + testExp + ")$"); - if (isvalid = exp.test(bufferStr)) break; + } else { + for (var l = 0, tl = matchToken.length; tl > l; l++) { + if (matchToken.charAt(l) !== "\\") { + testExp = regexPart, testExp += matchToken.substr(0, l + 1), testExp = testExp.replace(/\|$/, ""); + for (var j = 0; openGroupCount > j; j++) { + testExp += ")"; + } + var exp = new RegExp("^(" + testExp + ")$"); + if (isvalid = exp.test(bufferStr)) { + break; + } + } + } } regexPart += matchToken; } - if (isvalid) break; + if (isvalid) { + break; + } } return fromGroup && (regexPart += ")", openGroupCount--), isvalid; } var bufferStr, groupToken, cbuffer = maskset.buffer.slice(), regexPart = "", isValid = !1, openGroupCount = 0; - null === opts.regexTokens && analyseRegex(), cbuffer.splice(pos, 0, chrs), bufferStr = cbuffer.join(""); + opts.regexTokens === null && analyseRegex(), cbuffer.splice(pos, 0, chrs), bufferStr = cbuffer.join(""); for (var i = 0; i < opts.regexTokens.length; i++) { var regexToken = opts.regexTokens[i]; - if (isValid = validateRegexToken(regexToken, regexToken.isGroup)) break; + if (isValid = validateRegexToken(regexToken, regexToken.isGroup)) { + break; + } } return isValid; }, - cardinality: 1 - } - } - } + cardinality: 1, + }, + }, + }, }), Inputmask; -}(jQuery, Inputmask); \ No newline at end of file +}(jQuery, Inputmask)); diff --git a/easy_my_coop/views/account_invoice_view.xml b/easy_my_coop/views/account_invoice_view.xml index ec34b8b..8a86df0 100644 --- a/easy_my_coop/views/account_invoice_view.xml +++ b/easy_my_coop/views/account_invoice_view.xml @@ -1,73 +1,73 @@ - - - account.invoice.form - account.invoice - - - - - - - - - - Cooperator Invoices - account.invoice - form - tree,kanban,form,calendar,pivot,graph,activity - - [('type','in',('out_invoice', 'out_refund')),('release_capital_request','=',True)] - {'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale'} - - -

- Create a customer invoice -

- Create invoices, register payments and keep track of the discussions with your customers. -

-
-
- - - - tree - - - - - - - form - - - - - - Customer Invoices - account.invoice - form - tree,kanban,form,calendar,pivot,graph,activity - - [('type','in',('out_invoice', 'out_refund')),('release_capital_request','=',False)] - {'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale'} - - -

- Create a customer invoice -

- Create invoices, register payments and keep track of the discussions with your customers. -

-
-
- - - Invoices - account.invoice - form - tree,form,kanban,calendar,graph,pivot - - [('type','in', ['out_invoice', 'out_refund']), ('state', 'not in', ['draft', 'cancel']),('release_capital_request','=',False)] - {'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale'} - - -
+ + + account.invoice.form + account.invoice + + + + + + + + + + Cooperator Invoices + account.invoice + form + tree,kanban,form,calendar,pivot,graph,activity + + [('type','in',('out_invoice', 'out_refund')),('release_capital_request','=',True)] + {'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale'} + + +

+ Create a customer invoice +

+ Create invoices, register payments and keep track of the discussions with your customers. +

+
+
+ + + + tree + + + + + + + form + + + + + + Customer Invoices + account.invoice + form + tree,kanban,form,calendar,pivot,graph,activity + + [('type','in',('out_invoice', 'out_refund')),('release_capital_request','=',False)] + {'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale'} + + +

+ Create a customer invoice +

+ Create invoices, register payments and keep track of the discussions with your customers. +

+
+
+ + + Invoices + account.invoice + form + tree,form,kanban,calendar,graph,pivot + + [('type','in', ['out_invoice', 'out_refund']), ('state', 'not in', ['draft', 'cancel']),('release_capital_request','=',False)] + {'default_type':'out_invoice', 'type':'out_invoice', 'journal_type': 'sale'} + + +
diff --git a/easy_my_coop/views/account_journal_view.xml b/easy_my_coop/views/account_journal_view.xml index ccaed71..38288e0 100644 --- a/easy_my_coop/views/account_journal_view.xml +++ b/easy_my_coop/views/account_journal_view.xml @@ -1,26 +1,26 @@ - - - - account.journal.form - account.journal - - - - - - - - - - - account.bank.journal.form - account.journal - - - - - - - - - + + + + account.journal.form + account.journal + + + + + + + + + + + account.bank.journal.form + account.journal + + + + + + + + + diff --git a/easy_my_coop/views/cooperator_register_view.xml b/easy_my_coop/views/cooperator_register_view.xml index 47b2fab..ed5f996 100644 --- a/easy_my_coop/views/cooperator_register_view.xml +++ b/easy_my_coop/views/cooperator_register_view.xml @@ -1,77 +1,77 @@ - - - subscription.register.tree - subscription.register - - - - - - - - - - - - - - - - subscription.register.form - subscription.register - -
- - - - - - - - - - - - - - - - - - - -
-
-
- - - Subscription Register Search - subscription.register - - - - - - - - - - - - - - - - - - - - Subscription Register - subscription.register - form - - - - -
+ + + subscription.register.tree + subscription.register + + + + + + + + + + + + + + + + subscription.register.form + subscription.register + +
+ + + + + + + + + + + + + + + + + + + +
+
+
+ + + Subscription Register Search + subscription.register + + + + + + + + + + + + + + + + + + + + Subscription Register + subscription.register + form + + + + +
diff --git a/easy_my_coop/views/email_template_view.xml b/easy_my_coop/views/email_template_view.xml index 6834a80..a249aab 100644 --- a/easy_my_coop/views/email_template_view.xml +++ b/easy_my_coop/views/email_template_view.xml @@ -1,15 +1,15 @@ - - - - - Mail Templates - mail.template - form - form,tree - [('easy_my_coop','=',True)] - - - - - + + + + + Mail Templates + mail.template + form + form,tree + [('easy_my_coop','=',True)] + + + + + diff --git a/easy_my_coop/views/operation_request_view.xml b/easy_my_coop/views/operation_request_view.xml index 66af63a..dbfdfde 100644 --- a/easy_my_coop/views/operation_request_view.xml +++ b/easy_my_coop/views/operation_request_view.xml @@ -1,105 +1,105 @@ - - - - operation.request.tree - operation.request - - - - - - - - - - - - - - operation.request.form - operation.request - -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- - - Operation request - operation.request - form - - - -
+ + + + operation.request.tree + operation.request + + + + + + + + + + + + + + operation.request.form + operation.request + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + Operation request + operation.request + form + + + +
diff --git a/easy_my_coop/views/product_view.xml b/easy_my_coop/views/product_view.xml index 49e16e9..c72631e 100644 --- a/easy_my_coop/views/product_view.xml +++ b/easy_my_coop/views/product_view.xml @@ -1,153 +1,153 @@ - - - - product.template.share.form - product.template - - - -
- -
-
- -
-
- - - - - - - - - - - - - - - - - - -
-
- - - product.template.share.filter - product.template - - - - - - - - - - - - product.template.product.form - product.template - - - - {'required': [('is_share', '=', True)]} - - - - - - Share type - ir.actions.act_window - product.template - form - kanban,tree,form - - - - [('is_share','=',True)] - -

- Click to define a new share product. -

-
-
- - - - - - Product - ir.actions.act_window - product.product - tree,form,kanban - form - - - [('is_share','=',False)] - -

- Click to define a new product. -

- You must define a product for everything you sell, whether it's - a physical product, a consumable or a service you offer to - customers. -

- The product form contains information to simplify the sale - process: price, notes in the quotation, accounting data, - procurement methods, etc. -

-
-
- - - Products - ir.actions.act_window - product.template - tree,form,kanban - form - - {"search_default_filter_to_sell":1} - [('is_share','=',False)] - -

- Click to define a new product. -

- You must define a product for everything you sell, whether it's a physical product, a consumable or a service you offer to customers. -

- The product form contains information to simplify the sale process: price, notes in the quotation, accounting data, procurement methods, etc. -

-
-
- - -
+ + + + product.template.share.form + product.template + + + +
+ +
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
+
+ + + product.template.share.filter + product.template + + + + + + + + + + + + product.template.product.form + product.template + + + + {'required': [('is_share', '=', True)]} + + + + + + Share type + ir.actions.act_window + product.template + form + kanban,tree,form + + + + [('is_share','=',True)] + +

+ Click to define a new share product. +

+
+
+ + + + + + Product + ir.actions.act_window + product.product + tree,form,kanban + form + + + [('is_share','=',False)] + +

+ Click to define a new product. +

+ You must define a product for everything you sell, whether it's + a physical product, a consumable or a service you offer to + customers. +

+ The product form contains information to simplify the sale + process: price, notes in the quotation, accounting data, + procurement methods, etc. +

+
+
+ + + Products + ir.actions.act_window + product.template + tree,form,kanban + form + + {"search_default_filter_to_sell":1} + [('is_share','=',False)] + +

+ Click to define a new product. +

+ You must define a product for everything you sell, whether it's a physical product, a consumable or a service you offer to customers. +

+ The product form contains information to simplify the sale process: price, notes in the quotation, accounting data, procurement methods, etc. +

+
+
+ + +
diff --git a/easy_my_coop/views/res_company_view.xml b/easy_my_coop/views/res_company_view.xml index 8655cec..a1b13b2 100644 --- a/easy_my_coop/views/res_company_view.xml +++ b/easy_my_coop/views/res_company_view.xml @@ -1,34 +1,34 @@ - - - - res.company.form.easymy.coop - - res.company - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + res.company.form.easymy.coop + + res.company + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/easy_my_coop/views/res_partner_view.xml b/easy_my_coop/views/res_partner_view.xml index 9ae1bbd..85f5638 100644 --- a/easy_my_coop/views/res_partner_view.xml +++ b/easy_my_coop/views/res_partner_view.xml @@ -18,7 +18,7 @@ type="action" context="{'default_active_id': active_id}" groups="easy_my_coop.group_easy_my_coop_user"/> - + @@ -40,7 +40,7 @@ - + @@ -72,7 +72,7 @@
- + res.partner.tree.easy_my_coop res.partner @@ -85,7 +85,7 @@ - + res.partner.select res.partner @@ -101,7 +101,7 @@ - + Cooperators res.partner @@ -158,7 +158,7 @@

- + res.partner.remove.follower.inherit res.partner diff --git a/easy_my_coop/views/subscription_request_view.xml b/easy_my_coop/views/subscription_request_view.xml index e01f24a..7870ba1 100644 --- a/easy_my_coop/views/subscription_request_view.xml +++ b/easy_my_coop/views/subscription_request_view.xml @@ -1,201 +1,201 @@ - - - - - subscription.request.tree - subscription.request - - - - - - - - - - - - - - - - -