diff --git a/.copier-answers.yml b/.copier-answers.yml new file mode 100644 index 0000000..f43feba --- /dev/null +++ b/.copier-answers.yml @@ -0,0 +1,19 @@ +# Do NOT update manually; changes here will be overwritten by Copier +_commit: v1.7.0 +_src_path: git+https://github.com/oca/oca-addons-repo-template +ci: GitHub +dependency_installation_mode: PIP +generate_requirements_txt: true +include_wkhtmltopdf: false +odoo_version: 12.0 +org_name: Odoo Community Association (OCA) +org_slug: OCA +rebel_module_groups: [] +repo_description: This repository hosts additionnal parsers and import features for + bank statements. +repo_name: OCA bank statement import modules for Odoo +repo_slug: bank-statement-import +repo_website: https://github.com/OCA/bank-statement-import +travis_apt_packages: [] +travis_apt_sources: [] + diff --git a/.editorconfig b/.editorconfig index 62276b0..bfd7ac5 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,11 +7,11 @@ indent_style = space insert_final_newline = true trim_trailing_whitespace = true -[.eslintrc,*.{json,yml,yaml,rst,md}] +[*.{json,yml,yaml,rst,md}] indent_size = 2 # Do not configure editor for libs and autogenerated content -[*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst] +[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}] charset = unset end_of_line = unset indent_size = unset diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..6363964 --- /dev/null +++ b/.flake8 @@ -0,0 +1,11 @@ +[flake8] +# E123,E133,E226,E241,E242 are ignored by default by pep8 and flake8 +# F811 is legal in odoo 8 when we implement 2 interfaces for a method +# F601 pylint support this case with expected tests +# W503 changed by W504 and OCA prefers allow both +# E203: whitespace before ':' (black behaviour and not pep8 compliant) +ignore = E123,E133,E226,E241,E242,F811,F601,W503,W504,E203 +max-line-length = 88 +per-file-ignores= + __init__.py:F401 + diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000..5bc28e0 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,37 @@ +name: pre-commit + +on: + pull_request: + branches: + - "12.0*" + push: + branches: + - "12.0" + - "12.0-ocabot-*" + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: "3.6" + - name: Get python version + run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV + - uses: actions/cache@v1 + with: + path: ~/.cache/pre-commit + key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} + - name: Install pre-commit + run: pip install pre-commit + - name: Run pre-commit + run: pre-commit run --all-files --show-diff-on-failure --color=always + - name: Check that all files generated by pre-commit are in git + run: | + newfiles="$(git ls-files --others --exclude-from=.gitignore)" + if [ "$newfiles" != "" ] ; then + echo "Please check-in the following files:" + echo "$newfiles" + exit 1 + fi diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000..1693a12 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,69 @@ +name: Mark stale issues and pull requests + +on: + schedule: + - cron: "0 12 * * 0" + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - name: Stale PRs and issues policy + uses: actions/stale@v4 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + # General settings. + ascending: true + remove-stale-when-updated: true + # Pull Requests settings. + # 120+30 day stale policy for PRs + # * Except PRs marked as "no stale" + days-before-pr-stale: 120 + days-before-pr-close: 30 + exempt-pr-labels: "no stale" + stale-pr-label: "stale" + stale-pr-message: > + There hasn't been any activity on this pull request in the past 4 months, so + it has been marked as stale and it will be closed automatically if no + further activity occurs in the next 30 days. + + If you want this PR to never become stale, please ask a PSC member to apply + the "no stale" label. + # Issues settings. + # 180+30 day stale policy for open issues + # * Except Issues marked as "no stale" + days-before-issue-stale: 180 + days-before-issue-close: 30 + exempt-issue-labels: "no stale,needs more information" + stale-issue-label: "stale" + stale-issue-message: > + There hasn't been any activity on this issue in the past 6 months, so it has + been marked as stale and it will be closed automatically if no further + activity occurs in the next 30 days. + + If you want this issue to never become stale, please ask a PSC member to + apply the "no stale" label. + + # 15+30 day stale policy for issues pending more information + # * Issues that are pending more information + # * Except Issues marked as "no stale" + - name: Needs more information stale issues policy + uses: actions/stale@v4 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + ascending: true + only-labels: "needs more information" + exempt-issue-labels: "no stale" + days-before-stale: 15 + days-before-close: 30 + days-before-pr-stale: -1 + days-before-pr-close: -1 + remove-stale-when-updated: true + stale-issue-label: "stale" + stale-issue-message: > + This issue needs more information and there hasn't been any activity + recently, so it has been marked as stale and it will be closed automatically + if no further activity occurs in the next 30 days. + + If you think this is a mistake, please ask a PSC member to remove the "needs + more information" label. diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..737f0be --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,69 @@ +name: tests + +on: + pull_request: + branches: + - "12.0*" + push: + branches: + - "12.0" + - "12.0-ocabot-*" + +jobs: + unreleased-deps: + runs-on: ubuntu-latest + name: Detect unreleased dependencies + steps: + - uses: actions/checkout@v2 + - run: | + for reqfile in requirements.txt test-requirements.txt ; do + if [ -f ${reqfile} ] ; then + result=0 + # reject non-comment lines that contain a / (i.e. URLs, relative paths) + grep "^[^#].*/" ${reqfile} || result=$? + if [ $result -eq 0 ] ; then + echo "Unreleased dependencies found in ${reqfile}." + exit 1 + fi + fi + done + test: + runs-on: ubuntu-latest + container: ${{ matrix.container }} + name: ${{ matrix.name }} + strategy: + fail-fast: false + matrix: + include: + - container: ghcr.io/oca/oca-ci/py3.6-odoo12.0:latest + makepot: "true" + name: test with Odoo + - container: ghcr.io/oca/oca-ci/py3.6-ocb12.0:latest + name: test with OCB + services: + postgres: + image: postgres:9.6 + env: + POSTGRES_USER: odoo + POSTGRES_PASSWORD: odoo + POSTGRES_DB: odoo + ports: + - 5432:5432 + steps: + - uses: actions/checkout@v2 + with: + persist-credentials: false + - name: Install addons and dependencies + run: oca_install_addons + - name: Check licenses + run: manifestoo -d . check-licenses + - name: Check development status + run: manifestoo -d . check-dev-status --default-dev-status=Beta + - name: Initialize test db + run: oca_init_test_database + - name: Run tests + run: oca_run_tests + - uses: codecov/codecov-action@v1 + - name: Update .pot files + run: oca_export_and_push_pot https://x-access-token:${{ secrets.GIT_PUSH_TOKEN }}@github.com/${{ github.repository }} + if: ${{ matrix.makepot == 'true' && github.event_name == 'push' && github.repository_owner == 'OCA' }} diff --git a/.gitignore b/.gitignore index 7f2d438..818770f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] +/.venv +/.pytest_cache # C extensions *.so @@ -41,6 +43,19 @@ coverage.xml # Pycharm .idea +# Eclipse +.settings + +# Visual Studio cache/options directory +.vs/ +.vscode + +# OSX Files +.DS_Store + +# Django stuff: +*.log + # Mr Developer .mr.developer.cfg .project @@ -55,3 +70,6 @@ docs/_build/ # Backup files *~ *.swp + +# OCA rules +!static/lib/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ccc8891 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,60 @@ +exclude: | + (?x) + # NOT INSTALLABLE ADDONS + # END NOT INSTALLABLE ADDONS + # Files and folders generated by bots, to avoid loops + ^setup/|/static/description/index\.html$| + # We don't want to mess with tool-generated files + .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/| + # Maybe reactivate this when all README files include prettier ignore tags? + ^README\.md$| + # Library files can have extraneous formatting (even minimized) + /static/(src/)?lib/| + # Repos using Sphinx to generate docs don't need prettying + ^docs/_templates/.*\.html$| + # You don't usually want a bot to modify your legal texts + (LICENSE.*|COPYING.*) +default_language_version: + python: python3 +repos: + - repo: https://github.com/oca/maintainer-tools + rev: ab1d7f6 + hooks: + # update the NOT INSTALLABLE ADDONS section above + - id: oca-update-pre-commit-excluded-addons + - id: oca-fix-manifest-website + args: ["https://github.com/OCA/bank-statement-import"] + - repo: https://github.com/acsone/setuptools-odoo + rev: 3.0.6 + hooks: + - id: setuptools-odoo-make-default + - id: setuptools-odoo-get-requirements + args: + - --output + - requirements.txt + - --header + - "# generated from manifests external_dependencies" + - repo: https://github.com/OCA/mirrors-flake8 + rev: v3.4.1 + hooks: + - id: flake8 + language_version: python3.6 + name: flake8 excluding __init__.py + exclude: __init__\.py + - repo: https://github.com/pre-commit/mirrors-pylint + rev: v2.5.3 + hooks: + - id: pylint + name: pylint with optional checks + args: + - --rcfile=.pylintrc + - --exit-zero + verbose: true + additional_dependencies: &pylint_deps + - pylint-odoo==3.5.0 + - id: pylint + name: pylint with mandatory checks + args: + - --rcfile=.pylintrc-mandatory + additional_dependencies: *pylint_deps + diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 0000000..d8abd71 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,156 @@ +[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=Odoo Community Association (OCA) +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 message and code: +# anomalous-backslash-in-string - W1401 +# assignment-from-none - W1111 +# dangerous-default-value - W0102 +# duplicate-key - W0109 +# missing-import-error - W7935 +# missing-manifest-dependency - W7936 +# pointless-statement - W0104 +# pointless-string-statement - W0105 +# print-statement - E1601 +# redundant-keyword-arg - E1124 +# reimported - W0404 +# relative-import - W0403 +# return-in-init - E0101 +# rst-syntax-error - E7901 +# too-few-format-args - E1306 +# unreachable - W0101 + + +# 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. + +# Beta message and code: +# api-one-deprecated - W8104 +# api-one-multi-together - W8101 +# attribute-deprecated - W8105 +# class-camelcase - C8104 +# create-user-wo-reset-password - W7905 +# consider-merging-classes-inherited - R7980 +# copy-wo-api-one - W8102 +# dangerous-filter-wo-user - W7901 +# dangerous-view-replace-wo-priority - W7940 +# deprecated-module - W0402 +# duplicate-id-csv - W7906 +# duplicate-xml-fields - W7907 +# duplicate-xml-record-id - W7902 +# file-not-used - W7930 +# incoherent-interpreter-exec-perm - W8201 +# invalid-commit - E8102 +# javascript-lint - W7903 +# manifest-deprecated-key - C8103 +# method-compute - C8108 +# method-inverse - C8110 +# method-required-super - W8106 +# method-search - C8109 +# missing-newline-extrafiles - W7908 +# missing-readme - C7902 +# no-utf8-coding-comment - C8201 +# unnecessary-utf8-coding-comment - C8202 +# odoo-addons-relative-import - W7950 +# old-api7-method-defined - R8110 +# openerp-exception-warning - R8101 +# redundant-modulename-xml - W7909 +# sql-injection - E8103 +# too-complex - C0901 +# translation-field - W8103 +# translation-required - C8107 +# use-vim-comment - W8202 +# wrong-tabs-instead-of-spaces - W7910 +# xml-syntax-error - E7902 + + +enable=anomalous-backslash-in-string, + assignment-from-none, + dangerous-default-value, + development-status-allowed, + duplicate-key, + duplicate-po-message-definition, + missing-import-error, + missing-manifest-dependency, + po-msgstr-variables, + po-syntax-error, + pointless-statement, + pointless-string-statement, + print-used, + redundant-keyword-arg, + reimported, + relative-import, + return-in-init, + rst-syntax-error, + too-few-format-args, + unreachable, + eval-used, + eval-referenced, + license-allowed, + manifest-author-string, + manifest-required-author, + manifest-required-key, + manifest-version-format, + api-one-deprecated, + api-one-multi-together, + attribute-deprecated, + class-camelcase, + create-user-wo-reset-password, + consider-merging-classes-inherited, + copy-wo-api-one, + dangerous-filter-wo-user, + dangerous-view-replace-wo-priority, + deprecated-module, + duplicate-id-csv, + duplicate-po-message-definition, + duplicate-xml-fields, + duplicate-xml-record-id, + file-not-used, + incoherent-interpreter-exec-perm, + invalid-commit, + javascript-lint, + manifest-deprecated-key, + method-compute, + method-inverse, + method-required-super, + method-search, + missing-newline-extrafiles, + missing-readme, + po-msgstr-variables, + po-syntax-error, + no-utf8-coding-comment, + unnecessary-utf8-coding-comment, + odoo-addons-relative-import, + old-api7-method-defined, + openerp-exception-warning, + redefined-builtin, + redundant-modulename-xml, + sql-injection, + too-complex, + translation-field, + translation-required, + 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/.pylintrc-mandatory b/.pylintrc-mandatory new file mode 100644 index 0000000..9b44956 --- /dev/null +++ b/.pylintrc-mandatory @@ -0,0 +1,68 @@ +[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=Odoo Community Association (OCA) +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 message and code: +# anomalous-backslash-in-string - W1401 +# assignment-from-none - W1111 +# dangerous-default-value - W0102 +# duplicate-key - W0109 +# missing-import-error - W7935 +# missing-manifest-dependency - W7936 +# pointless-statement - W0104 +# pointless-string-statement - W0105 +# print-statement - E1601 +# redundant-keyword-arg - E1124 +# reimported - W0404 +# relative-import - W0403 +# return-in-init - E0101 +# rst-syntax-error - E7901 +# too-few-format-args - E1306 +# unreachable - W0101 + + + +enable=anomalous-backslash-in-string, + assignment-from-none, + dangerous-default-value, + development-status-allowed, + duplicate-key, + duplicate-po-message-definition, + missing-import-error, + missing-manifest-dependency, + po-msgstr-variables, + po-syntax-error, + pointless-statement, + pointless-string-statement, + print-used, + redundant-keyword-arg, + reimported, + relative-import, + return-in-init, + rst-syntax-error, + too-few-format-args, + unreachable, + eval-used, + eval-referenced, + license-allowed, + manifest-author-string, + manifest-required-author, + manifest-required-key, + manifest-version-format + +[REPORTS] +msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} +output-format=colorized +reports=no + diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8b6543d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,41 +0,0 @@ -language: python - -python: - - "3.5" - -sudo: false -cache: pip - -addons: - postgresql: "9.6" - apt: - packages: - - expect-dev # provides unbuffer utility - - python-lxml # because pip installation is slow - -env: - global: - - VERSION="12.0" TESTS="0" LINT_CHECK="0" TRANSIFEX="0" - - TRANSIFEX_USER='transbot@odoo-community.org' - - secure: "G39Lpe4r3QDkivRJrcIX+JDsji/zc+wXrcQ0i2X4L66wrOEcG+SU8Lzp57Odyq+Li7lRa0XQ6rxq7+40Lm4EIoumsYbddp2VjgiR0Bkv8xHOQ2hdrODWbl0ZKhWWpzwGkPs90i39fnFKbPd86XjcvYbPmdapQ/vpUO7ht8WxCRM=" - - matrix: - - LINT_CHECK="1" - - TRANSIFEX="1" - - TESTS="1" ODOO_REPO="OCA/OCB" - - TESTS="1" ODOO_REPO="odoo/odoo" - - -install: - - git clone https://github.com/OCA/maintainer-quality-tools.git ${HOME}/maintainer-quality-tools - - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH} - - pip install git+https://github.com/jseutter/ofxparse.git - - travis_install_nightly -# example: dependency -# - git clone https://github.com/OCA/webkit-tools -b ${VERSION} $HOME/webkit-tools - -script: - - travis_run_tests - -after_success: - - travis_after_tests_success diff --git a/LICENSE b/LICENSE index 3ffc567..be3f7b2 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ -GNU AFFERO GENERAL PUBLIC LICENSE + GNU AFFERO GENERAL PUBLIC LICENSE Version 3, 19 November 2007 - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -633,8 +633,8 @@ the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 + 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, @@ -643,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found. 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 . + along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. @@ -658,4 +658,4 @@ specific requirements. You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see -. \ No newline at end of file +. diff --git a/README.md b/README.md index da79ce4..833d5b3 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,55 @@ -[![Build Status](https://travis-ci.org/OCA/bank-statement-import.svg?branch=12.0)](https://travis-ci.org/OCA/bank-statement-import) -[![Coverage Status](https://coveralls.io/repos/OCA/bank-statement-import/badge.svg?branch=12.0)](https://coveralls.io/r/OCA/bank-statement-import?branch=12.0) -OCA bank statement import modules for Odoo -========================================== +[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/bank-statement-import&target_branch=12.0) +[![Pre-commit Status](https://github.com/OCA/bank-statement-import/actions/workflows/pre-commit.yml/badge.svg?branch=12.0)](https://github.com/OCA/bank-statement-import/actions/workflows/pre-commit.yml?query=branch%3A12.0) +[![Build Status](https://github.com/OCA/bank-statement-import/actions/workflows/test.yml/badge.svg?branch=12.0)](https://github.com/OCA/bank-statement-import/actions/workflows/test.yml?query=branch%3A12.0) +[![codecov](https://codecov.io/gh/OCA/bank-statement-import/branch/12.0/graph/badge.svg)](https://codecov.io/gh/OCA/bank-statement-import) +[![Translation Status](https://translation.odoo-community.org/widgets/bank-statement-import-12-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/bank-statement-import-12-0/?utm_source=widget) -This repository hosts additionnal parsers and import features inspired by v7.0 branch from https://github.com/OCA/bank-payment and https://github.com/OCA/bank-statement-reconcile + -Contributing ------------- -Do you want to contribute? Please read our [contributing guidelines](https://github.com/OCA/maintainer-tools/blob/master/CONTRIBUTING.md). +# OCA bank statement import modules for Odoo -Translation Status ------------------- -[![Transifex Status](https://www.transifex.com/projects/p/OCA-bank-statement-import-12-0/chart/image_png)](https://www.transifex.com/projects/p/OCA-bank-statement-import-12-0) +This repository hosts additionnal parsers and import features for bank statements. ----- + + + + +[//]: # (addons) + +Available addons +---------------- +addon | version | maintainers | summary +--- | --- | --- | --- +[account_bank_statement_clear_partner](account_bank_statement_clear_partner/) | 12.0.1.0.0 | | Clear all partners in bank statement lines +[account_bank_statement_import_bypass_check](account_bank_statement_import_bypass_check/) | 12.0.1.0.0 | | Allow possibility to bypass check in Bank statement import +[account_bank_statement_import_camt_oca](account_bank_statement_import_camt_oca/) | 12.0.1.0.1 | | CAMT Format Bank Statements Import +[account_bank_statement_import_move_line](account_bank_statement_import_move_line/) | 12.0.1.0.0 | [![pedrobaeza](https://github.com/pedrobaeza.png?size=30px)](https://github.com/pedrobaeza) | Import journal items into bank statement +[account_bank_statement_import_ofx](account_bank_statement_import_ofx/) | 12.0.1.1.0 | | Import OFX Bank Statement +[account_bank_statement_import_online](account_bank_statement_import_online/) | 12.0.1.5.2 | [![alexey-pelykh](https://github.com/alexey-pelykh.png?size=30px)](https://github.com/alexey-pelykh) | Online bank statements update +[account_bank_statement_import_online_paypal](account_bank_statement_import_online_paypal/) | 12.0.1.1.0 | [![alexey-pelykh](https://github.com/alexey-pelykh.png?size=30px)](https://github.com/alexey-pelykh) | Online bank statements for PayPal.com +[account_bank_statement_import_online_ponto](account_bank_statement_import_online_ponto/) | 12.0.1.1.1 | | Online Bank Statements: MyPonto.com +[account_bank_statement_import_online_qonto](account_bank_statement_import_online_qonto/) | 12.0.1.0.0 | | Online Bank Statements: Qonto.eu +[account_bank_statement_import_online_transferwise](account_bank_statement_import_online_transferwise/) | 12.0.1.1.0 | [![alexey-pelykh](https://github.com/alexey-pelykh.png?size=30px)](https://github.com/alexey-pelykh) | Online bank statements for Wise.com (TransferWise.com) +[account_bank_statement_import_paypal](account_bank_statement_import_paypal/) | 12.0.2.2.4 | | Import PayPal CSV files as Bank Statements in Odoo +[account_bank_statement_import_save_file](account_bank_statement_import_save_file/) | 12.0.1.0.0 | | Keep imported bank statements as raw data +[account_bank_statement_import_split](account_bank_statement_import_split/) | 12.0.1.0.1 | [![alexey-pelykh](https://github.com/alexey-pelykh.png?size=30px)](https://github.com/alexey-pelykh) | Split statements by date during import +[account_bank_statement_import_transfer_move](account_bank_statement_import_transfer_move/) | 12.0.1.0.0 | | Bank Account Transfer Line +[account_bank_statement_import_txt_xlsx](account_bank_statement_import_txt_xlsx/) | 12.0.2.0.5 | [![alexey-pelykh](https://github.com/alexey-pelykh.png?size=30px)](https://github.com/alexey-pelykh) | Import TXT/CSV or XLSX files as Bank Statements in Odoo + +[//]: # (end addons) -OCA, or the Odoo Community Association, is a nonprofit organization whose -mission is to support the collaborative development of Odoo features and -promote its widespread use. + -http://odoo-community.org/ +## Licenses + +This repository is licensed under [AGPL-3.0](LICENSE). + +However, each module can have a totally different license, as long as they adhere to Odoo Community Association (OCA) +policy. Consult each module's `__manifest__.py` file, which contains a `license` key +that explains its license. + +---- +OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit +organization whose mission is to support the collaborative development of Odoo features +and promote its widespread use. diff --git a/account_bank_statement_import_ofx/__manifest__.py b/account_bank_statement_import_ofx/__manifest__.py index d1fc2ae..cb1f82b 100644 --- a/account_bank_statement_import_ofx/__manifest__.py +++ b/account_bank_statement_import_ofx/__manifest__.py @@ -10,7 +10,7 @@ 'Nicolas JEUDY,' 'Le Filament,' 'Odoo Community Association (OCA)', - 'website': 'https://odoo-community.org/', + 'website': 'https://github.com/OCA/bank-statement-import', 'depends': [ 'account_bank_statement_import', ], diff --git a/account_bank_statement_import_online/__manifest__.py b/account_bank_statement_import_online/__manifest__.py index 2adfd10..85bb660 100644 --- a/account_bank_statement_import_online/__manifest__.py +++ b/account_bank_statement_import_online/__manifest__.py @@ -9,7 +9,7 @@ 'CorporateHub, ' 'Odoo Community Association (OCA)', 'maintainers': ['alexey-pelykh'], - 'website': 'https://github.com/OCA/bank-statement-import/', + 'website': 'https://github.com/OCA/bank-statement-import', 'license': 'AGPL-3', 'category': 'Accounting', 'summary': 'Online bank statements update', diff --git a/account_bank_statement_import_online_paypal/__manifest__.py b/account_bank_statement_import_online_paypal/__manifest__.py index 7cbda54..a932686 100644 --- a/account_bank_statement_import_online_paypal/__manifest__.py +++ b/account_bank_statement_import_online_paypal/__manifest__.py @@ -9,7 +9,7 @@ 'CorporateHub, ' 'Odoo Community Association (OCA)', 'maintainers': ['alexey-pelykh'], - 'website': 'https://github.com/OCA/bank-statement-import/', + 'website': 'https://github.com/OCA/bank-statement-import', 'license': 'AGPL-3', 'category': 'Accounting', 'summary': 'Online bank statements for PayPal.com', diff --git a/account_bank_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py b/account_bank_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py index 93c8e1c..66b50fa 100644 --- a/account_bank_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py +++ b/account_bank_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py @@ -1,4 +1,5 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2022 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from datetime import datetime @@ -53,6 +54,13 @@ class TestAccountBankAccountStatementImportOnlinePayPal( super().setUp() self.now = fields.Datetime.now() + self.now_isoformat = self.now.isoformat() + '+0000' + self.today = datetime(self.now.year, self.now.month, self.now.day) + self.today_isoformat = self.today.isoformat() + '+0000' + self.today_timestamp = str(int(self.today.timestamp())) + self.yesterday = self.today - relativedelta(days=1) + self.yesterday_isoformat = self.yesterday.isoformat() + '+0000' + self.yesterday_timestamp = str(int(self.yesterday.timestamp())) self.currency_eur = self.env.ref('base.EUR') self.currency_usd = self.env.ref('base.USD') self.AccountJournal = self.env['account.journal'] @@ -220,9 +228,10 @@ class TestAccountBankAccountStatementImportOnlinePayPal( } ], "account_id": "1234567890", - "as_of_time": "2019-08-01T00:00:00+0000", - "last_refresh_time": "2019-08-01T00:00:00+0000" -}""") + "as_of_time": "%s", + "last_refresh_time": "%s" +}""" % (self.now_isoformat, self.now_isoformat,) + ) with mock.patch( _provider_class + '._paypal_urlopen', side_effect=[mocked_response_1, mocked_response_2], @@ -297,14 +306,17 @@ class TestAccountBankAccountStatementImportOnlinePayPal( mocked_response_1 = json.loads("""{ "transaction_details": [], "account_number": "1234567890", - "start_date": "2019-08-01T00:00:00+0000", - "end_date": "2019-08-01T00:00:00+0000", - "last_refreshed_datetime": "2019-09-01T00:00:00+0000", + "start_date": "%s", + "end_date": "%s", + "last_refreshed_datetime": "%s", "page": 1, "total_items": 0, "total_pages": 0 -}""", parse_float=Decimal) - mocked_response_2 = json.loads("""{ +}""" % (self.now_isoformat, self.now_isoformat, self.now_isoformat,), + parse_float=Decimal, + ) + mocked_response_2 = json.loads( + """{ "balances": [ { "currency": "EUR", @@ -324,9 +336,12 @@ class TestAccountBankAccountStatementImportOnlinePayPal( } ], "account_id": "1234567890", - "as_of_time": "2019-08-01T00:00:00+0000", - "last_refresh_time": "2019-08-01T00:00:00+0000" -}""", parse_float=Decimal) + "as_of_time": "%s", + "last_refresh_time": "%s" +}""" + % (self.now_isoformat, self.now_isoformat,), + parse_float=Decimal, + ) with mock.patch( _provider_class + '._paypal_retrieve', side_effect=[mocked_response_1, mocked_response_2], @@ -355,13 +370,15 @@ class TestAccountBankAccountStatementImportOnlinePayPal( mocked_response = json.loads("""{ "transaction_details": [], "account_number": "1234567890", - "start_date": "2019-08-01T00:00:00+0000", - "end_date": "2019-08-01T00:00:00+0000", - "last_refreshed_datetime": "2019-09-01T00:00:00+0000", + "start_date": "%s", + "end_date": "%s", + "last_refreshed_datetime": "%s", "page": 1, "total_items": 0, "total_pages": 0 -}""", parse_float=Decimal) +}""" % (self.now_isoformat, self.now_isoformat, self.now_isoformat,), + parse_float=Decimal, + ) with mock.patch( _provider_class + '._paypal_retrieve', return_value=mocked_response, @@ -389,8 +406,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "paypal_account_id": "1234567890", "transaction_id": "1234567890", "transaction_event_code": "T1234", - "transaction_initiation_date": "2019-08-01T00:00:00+0000", - "transaction_updated_date": "2019-08-01T00:00:00+0000", + "transaction_initiation_date": "%s", + "transaction_updated_date": "%s", "transaction_amount": { "currency_code": "USD", "value": "1000.00" @@ -431,8 +448,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "paypal_account_id": "1234567890", "transaction_id": "1234567891", "transaction_event_code": "T1234", - "transaction_initiation_date": "2019-08-02T00:00:00+0000", - "transaction_updated_date": "2019-08-02T00:00:00+0000", + "transaction_initiation_date": "%s", + "transaction_updated_date": "%s", "transaction_amount": { "currency_code": "USD", "value": "1000.00" @@ -470,43 +487,53 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "incentive_info": {} }], "account_number": "1234567890", - "start_date": "2019-08-01T00:00:00+0000", - "end_date": "2019-08-02T00:00:00+0000", - "last_refreshed_datetime": "2019-09-01T00:00:00+0000", + "start_date": "%s", + "end_date": "%s", + "last_refreshed_datetime": "%s", "page": 1, "total_items": 1, "total_pages": 1 -}""", parse_float=Decimal) +}""" % ( + self.yesterday_isoformat, + self.yesterday_isoformat, + self.today_isoformat, + self.today_isoformat, + self.yesterday_isoformat, + self.today_isoformat, + self.now_isoformat, + ), + parse_float=Decimal, + ) with mock.patch( _provider_class + '._paypal_retrieve', return_value=mocked_response, ), self.mock_token(): - data = provider._obtain_statement_data( - datetime(2019, 8, 1), - datetime(2019, 8, 2), - ) + data = provider._obtain_statement_data(self.yesterday, self.today,) self.assertEqual(len(data[0]), 2) - self.assertEqual(data[0][0], { - 'date': datetime(2019, 8, 1), - 'amount': '1000.00', - 'name': 'Invoice 1', - 'note': '1234567890: Payment for Invoice(s) 1', - 'partner_name': 'Acme, Inc.', - 'unique_import_id': '1234567890-1564617600', - }) - self.assertEqual(data[0][1], { - 'date': datetime(2019, 8, 1), - 'amount': '-100.00', - 'name': 'Fee for Invoice 1', - 'note': 'Transaction fee for 1234567890: Payment for Invoice(s) 1', - 'partner_name': 'PayPal', - 'unique_import_id': '1234567890-1564617600-FEE', - }) - self.assertEqual(data[1], { - 'balance_start': 0.0, - 'balance_end_real': 900.0, - }) + self.assertEqual( + data[0][0], + { + "date": self.yesterday, + "amount": "1000.00", + "name": "Invoice 1", + "note": "1234567890: Payment for Invoice(s) 1", + "partner_name": "Acme, Inc.", + "unique_import_id": "1234567890-%s" % (self.yesterday_timestamp,), + }, + ) + self.assertEqual( + data[0][1], + { + "date": self.yesterday, + "amount": "-100.00", + "name": "Fee for Invoice 1", + "note": "Transaction fee for 1234567890: Payment for Invoice(s) 1", + "partner_name": "PayPal", + "unique_import_id": "1234567890-%s-FEE" % (self.yesterday_timestamp,), + }, + ) + self.assertEqual(data[1], {"balance_start": 0.0, "balance_end_real": 900.0}) def test_transaction_parse_1(self): lines = self.paypal_parse_transaction("""{ @@ -514,8 +541,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "paypal_account_id": "1234567890", "transaction_id": "1234567890", "transaction_event_code": "T1234", - "transaction_initiation_date": "2019-08-01T00:00:00+0000", - "transaction_updated_date": "2019-08-01T00:00:00+0000", + "transaction_initiation_date": "%s", + "transaction_updated_date": "%s", "transaction_amount": { "currency_code": "USD", "value": "1000.00" @@ -551,16 +578,20 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "store_info": {}, "auction_info": {}, "incentive_info": {} -}""") +}""" % (self.today_isoformat, self.today_isoformat,) + ) self.assertEqual(len(lines), 1) - self.assertEqual(lines[0], { - 'date': datetime(2019, 8, 1), - 'amount': '1000.00', - 'name': 'Invoice 1', - 'note': '1234567890: Payment for Invoice(s) 1', - 'partner_name': 'Acme, Inc.', - 'unique_import_id': '1234567890-1564617600', - }) + self.assertEqual( + lines[0], + { + "date": self.today, + "amount": "1000.00", + "name": "Invoice 1", + "note": "1234567890: Payment for Invoice(s) 1", + "partner_name": "Acme, Inc.", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), + }, + ) def test_transaction_parse_2(self): lines = self.paypal_parse_transaction("""{ @@ -568,8 +599,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "paypal_account_id": "1234567890", "transaction_id": "1234567890", "transaction_event_code": "T1234", - "transaction_initiation_date": "2019-08-01T00:00:00+0000", - "transaction_updated_date": "2019-08-01T00:00:00+0000", + "transaction_initiation_date": "%s", + "transaction_updated_date": "%s", "transaction_amount": { "currency_code": "USD", "value": "1000.00" @@ -605,16 +636,20 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "store_info": {}, "auction_info": {}, "incentive_info": {} -}""") +}""" % (self.today_isoformat, self.today_isoformat,) + ) self.assertEqual(len(lines), 1) - self.assertEqual(lines[0], { - 'date': datetime(2019, 8, 1), - 'amount': '1000.00', - 'name': 'Invoice 1', - 'note': '1234567890: Payment for Invoice(s) 1', - 'partner_name': 'Acme, Inc.', - 'unique_import_id': '1234567890-1564617600', - }) + self.assertEqual( + lines[0], + { + "date": self.today, + "amount": "1000.00", + "name": "Invoice 1", + "note": "1234567890: Payment for Invoice(s) 1", + "partner_name": "Acme, Inc.", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), + }, + ) def test_transaction_parse_3(self): lines = self.paypal_parse_transaction("""{ @@ -622,8 +657,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "paypal_account_id": "1234567890", "transaction_id": "1234567890", "transaction_event_code": "T1234", - "transaction_initiation_date": "2019-08-01T00:00:00+0000", - "transaction_updated_date": "2019-08-01T00:00:00+0000", + "transaction_initiation_date": "%s", + "transaction_updated_date": "%s", "transaction_amount": { "currency_code": "USD", "value": "1000.00" @@ -659,24 +694,31 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "store_info": {}, "auction_info": {}, "incentive_info": {} -}""") +}""" % (self.today_isoformat, self.today_isoformat,) + ) self.assertEqual(len(lines), 2) - self.assertEqual(lines[0], { - 'date': datetime(2019, 8, 1), - 'amount': '1000.00', - 'name': 'Invoice 1', - 'note': '1234567890: Payment for Invoice(s) 1', - 'partner_name': 'Acme, Inc.', - 'unique_import_id': '1234567890-1564617600', - }) - self.assertEqual(lines[1], { - 'date': datetime(2019, 8, 1), - 'amount': '-100.00', - 'name': 'Fee for Invoice 1', - 'note': 'Transaction fee for 1234567890: Payment for Invoice(s) 1', - 'partner_name': 'PayPal', - 'unique_import_id': '1234567890-1564617600-FEE', - }) + self.assertEqual( + lines[0], + { + "date": self.today, + "amount": "1000.00", + "name": "Invoice 1", + "note": "1234567890: Payment for Invoice(s) 1", + "partner_name": "Acme, Inc.", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), + }, + ) + self.assertEqual( + lines[1], + { + "date": self.today, + "amount": "-100.00", + "name": "Fee for Invoice 1", + "note": "Transaction fee for 1234567890: Payment for Invoice(s) 1", + "partner_name": "PayPal", + "unique_import_id": "1234567890-%s-FEE" % (self.today_timestamp,), + }, + ) def test_transaction_parse_4(self): lines = self.paypal_parse_transaction("""{ @@ -684,8 +726,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "paypal_account_id": "1234567890", "transaction_id": "1234567890", "transaction_event_code": "T1234", - "transaction_initiation_date": "2019-08-01T00:00:00+0000", - "transaction_updated_date": "2019-08-01T00:00:00+0000", + "transaction_initiation_date": "%s", + "transaction_updated_date": "%s", "transaction_amount": { "currency_code": "USD", "value": "1000.00" @@ -717,13 +759,17 @@ class TestAccountBankAccountStatementImportOnlinePayPal( "store_info": {}, "auction_info": {}, "incentive_info": {} -}""") +}""" % (self.today_isoformat, self.today_isoformat,) + ) self.assertEqual(len(lines), 1) - self.assertEqual(lines[0], { - 'date': datetime(2019, 8, 1), - 'amount': '1000.00', - 'name': 'Invoice 1', - 'note': '1234567890: Payment for Invoice(s) 1', - 'partner_name': 'Acme, Inc.', - 'unique_import_id': '1234567890-1564617600', - }) + self.assertEqual( + lines[0], + { + "date": self.today, + "amount": "1000.00", + "name": "Invoice 1", + "note": "1234567890: Payment for Invoice(s) 1", + "partner_name": "Acme, Inc.", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), + }, + ) diff --git a/account_bank_statement_import_online_transferwise/__manifest__.py b/account_bank_statement_import_online_transferwise/__manifest__.py index 06f9fd8..25f1466 100644 --- a/account_bank_statement_import_online_transferwise/__manifest__.py +++ b/account_bank_statement_import_online_transferwise/__manifest__.py @@ -9,7 +9,7 @@ 'CorporateHub, ' 'Odoo Community Association (OCA)', 'maintainers': ['alexey-pelykh'], - 'website': 'https://github.com/OCA/bank-statement-import/', + 'website': 'https://github.com/OCA/bank-statement-import', 'license': 'AGPL-3', 'category': 'Accounting', 'summary': 'Online bank statements for Wise.com (TransferWise.com)', diff --git a/account_bank_statement_import_save_file/__manifest__.py b/account_bank_statement_import_save_file/__manifest__.py index 58b38d1..76aa1aa 100644 --- a/account_bank_statement_import_save_file/__manifest__.py +++ b/account_bank_statement_import_save_file/__manifest__.py @@ -8,6 +8,7 @@ 'license': 'AGPL-3', 'category': 'Banking addons', 'summary': 'Keep imported bank statements as raw data', + 'website': 'https://github.com/OCA/bank-statement-import', 'depends': [ 'account_bank_statement_import', ], diff --git a/account_bank_statement_import_split/__manifest__.py b/account_bank_statement_import_split/__manifest__.py index 4d4162c..a6810e4 100644 --- a/account_bank_statement_import_split/__manifest__.py +++ b/account_bank_statement_import_split/__manifest__.py @@ -9,7 +9,7 @@ 'CorporateHub, ' 'Odoo Community Association (OCA)', 'maintainers': ['alexey-pelykh'], - 'website': 'https://github.com/OCA/bank-statement-import/', + 'website': 'https://github.com/OCA/bank-statement-import', 'license': 'AGPL-3', 'category': 'Accounting', 'summary': 'Split statements by date during import', diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..d925fe0 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +# generated from manifests external_dependencies +cryptography +ofxparse +xlrd