From 8174adda5bbb10365840d3d58d518e28817ecfeb Mon Sep 17 00:00:00 2001 From: "Omar (Comunitea)" Date: Fri, 25 Feb 2022 11:57:28 +0100 Subject: [PATCH 1/9] [REN] account_bank_statement_import_online_paypal: Renamed to account_statement_import_online_paypal --- .../README.rst | 142 +++ .../__init__.py | 3 + .../__manifest__.py | 17 + ...nt_bank_statement_import_online_paypal.pot | 937 ++++++++++++++++++ .../models/__init__.py | 3 + .../online_bank_statement_provider_paypal.py | 519 ++++++++++ .../readme/CONFIGURE.rst | 29 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 2 + .../readme/ROADMAP.rst | 11 + .../readme/USAGE.rst | 6 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 487 +++++++++ .../tests/__init__.py | 3 + ...unt_bank_statement_import_online_paypal.py | 803 +++++++++++++++ .../views/online_bank_statement_provider.xml | 40 + 16 files changed, 3005 insertions(+) create mode 100644 account_statement_import_online_paypal/README.rst create mode 100644 account_statement_import_online_paypal/__init__.py create mode 100644 account_statement_import_online_paypal/__manifest__.py create mode 100644 account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot create mode 100644 account_statement_import_online_paypal/models/__init__.py create mode 100644 account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py create mode 100644 account_statement_import_online_paypal/readme/CONFIGURE.rst create mode 100644 account_statement_import_online_paypal/readme/CONTRIBUTORS.rst create mode 100644 account_statement_import_online_paypal/readme/DESCRIPTION.rst create mode 100644 account_statement_import_online_paypal/readme/ROADMAP.rst create mode 100644 account_statement_import_online_paypal/readme/USAGE.rst create mode 100644 account_statement_import_online_paypal/static/description/icon.png create mode 100644 account_statement_import_online_paypal/static/description/index.html create mode 100644 account_statement_import_online_paypal/tests/__init__.py create mode 100644 account_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py create mode 100644 account_statement_import_online_paypal/views/online_bank_statement_provider.xml diff --git a/account_statement_import_online_paypal/README.rst b/account_statement_import_online_paypal/README.rst new file mode 100644 index 00000000..669ed545 --- /dev/null +++ b/account_statement_import_online_paypal/README.rst @@ -0,0 +1,142 @@ +================================== +Online Bank Statements: PayPal.com +================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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-OCA%2Fbank--statement--import-lightgray.png?logo=github + :target: https://github.com/OCA/bank-statement-import/tree/13.0/account_bank_statement_import_online_paypal + :alt: OCA/bank-statement-import +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/bank-statement-import-13-0/bank-statement-import-13-0-account_bank_statement_import_online_paypal + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/174/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module provides online bank statements from +`PayPal.com `__. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure online bank statements provider: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Open bank account to configure and edit it +#. Set *Bank Feeds* to *Online* +#. Select *PayPal.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +or, alternatively: + +#. Go to *Invoicing > Overview* +#. Open settings of the corresponding journal account +#. Switch to *Bank Account* tab +#. Set *Bank Feeds* to *Online* +#. Select *PayPal.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +To obtain *Client ID* and *Secret*: + +#. Open `PayPal Developer `_ +#. Go to *My Apps & Credentials* and switch to *Live* +#. Under *REST API apps*, click *Create App* to create new application (e.g. *Odoo*) +#. Copy *Client ID* and *Secret* to use during provider configuration +#. Under *Live App Settings*, uncheck all features except *Transaction Search* +#. Click Save + +Usage +===== + +To pull historical bank statements: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Select specific bank accounts +#. Launch *Actions > Online Bank Statements Pull Wizard* +#. Configure date interval and click *Pull* + +Known issues / Roadmap +====================== + +* Only transactions for the previous three years are retrieved, historical data + can be imported manually, see ``account_bank_statement_import_paypal``. See + `PayPal Help Center article `_ + for details. +* `PayPal Transaction Info `_ + defines extra fields like ``tip_amount``, ``shipping_amount``, etc. that + could be useful to be decomposed from a single transaction. +* There's a known issue with PayPal API that on every Monday for couple of + hours after UTC midnight it returns ``INVALID_REQUEST`` incorrectly: their + servers have not inflated the data yet. PayPal tech support confirmed this + behaviour in case #06650320 (private). + +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 +~~~~~~~ + +* CorporateHub + +Contributors +~~~~~~~~~~~~ + +* `CorporateHub `__ + + * Alexey Pelykh + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +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. + +.. |maintainer-alexey-pelykh| image:: https://github.com/alexey-pelykh.png?size=40px + :target: https://github.com/alexey-pelykh + :alt: alexey-pelykh + +Current `maintainer `__: + +|maintainer-alexey-pelykh| + +This module is part of the `OCA/bank-statement-import `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_statement_import_online_paypal/__init__.py b/account_statement_import_online_paypal/__init__.py new file mode 100644 index 00000000..31660d6a --- /dev/null +++ b/account_statement_import_online_paypal/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/account_statement_import_online_paypal/__manifest__.py b/account_statement_import_online_paypal/__manifest__.py new file mode 100644 index 00000000..82bab800 --- /dev/null +++ b/account_statement_import_online_paypal/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2020-2021 CorporateHub (https://corporatehub.eu) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Online Bank Statements: PayPal.com", + "version": "13.0.1.0.0", + "author": "CorporateHub, Odoo Community Association (OCA)", + "maintainers": ["alexey-pelykh"], + "website": "https://github.com/OCA/bank-statement-import", + "license": "AGPL-3", + "category": "Accounting", + "summary": "Online bank statements for PayPal.com", + "depends": ["account_bank_statement_import_online"], + "data": ["views/online_bank_statement_provider.xml"], + "installable": True, +} diff --git a/account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot b/account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot new file mode 100644 index 00000000..1cb15a7b --- /dev/null +++ b/account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot @@ -0,0 +1,937 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_bank_statement_import_online_paypal +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "ACH funding for funds recovery from account balance" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_online_paypal.online_bank_statement_provider_form +msgid "API base" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "ATM withdrawal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Account hold for ACH deposit" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Account hold for open authorization" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Account receivable for shipping" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Auto-sweep from account" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "AutoSweep" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "BML credit, transfer from BML" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "BML withdrawal, transfer to BML" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Balance manager account bonus" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Bill pay transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Blocked payments" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Bonus for first ACH use" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Buyer credit payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Buyer credit payment withdrawal, transfer to BML" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Cancellation of hold for dispute resolution" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Charge-off adjustment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback cancellation" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback processing fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback re-presentment rejection" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback reversal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Check withdrawal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_online_paypal.online_bank_statement_provider_form +msgid "Client ID" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Coupon redemption" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Credit card cash back bonus" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Credit card deposit for negative PayPal account balance" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Credit card security charge refund" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Currency conversion required to cover negative balance" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Debit card cash back bonus" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Deferred disbursement, funds collected for disbursement" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Delayed disbursement, funds disbursed" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Direct payment API" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Display only transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Donation payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Electronic funds transfer (EFT)" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Failed to acquire token using Client ID and Secret!" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Failed to resolve transaction %s (%s)" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Fee for %s" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Fee refund" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Fee reversal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Foreign bank withdrawal fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds available" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds not yet available" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds payable: PayPal-provided funds that must be paid back" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds receivable: PayPal-provided funds that are being paid back" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General PayPal debit card transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General PayPal-to-PayPal payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General account adjustment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General adjustment without business-related event" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General authorization" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General bonus" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General buyer credit payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General credit card deposit" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General credit card withdrawal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General currency conversion" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General dividend" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General funding of PayPal account" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General hold" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General hold release" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General incentive or certificate redemption" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General intra-account transfer" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General non-payment fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General reversal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General temporary hold" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General withdrawal from PayPal account" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General withdrawal to non-bank institution" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument-funded payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument/Open Wallet reversals (buyer side)" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument/Open Wallet reversals (seller side)" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument/Open Wallet transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate expiration fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate payment, purchase of gift certificate" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate purchase" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate redemption" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Hidden virtual PayPal debit card transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Hold for dispute investigation" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Incentive adjustment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Instant payment review (IPR) reversal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "International credit card withdrawal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Invalid token type!" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Invoice %s" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MAM reversal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Mass payment batch fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MassPay payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MassPay refund transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MassPay reversal transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Merchant referral account bonus" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Mobile payment, made through a mobile phone" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "No authentication specified!" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Non-reference credit payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Offers used as funding source" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: model:ir.model,name:account_bank_statement_import_online_paypal.model_online_bank_statement_provider +msgid "Online Bank Statement Provider" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Other" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Partner fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal App features are configured incorrectly!" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal Checkout APIs" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal Here payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "" +"PayPal allows retrieving transactions only up to 3 years in the past. Please" +" import older transactions manually. See " +"https://www.paypal.com/us/smarthelp/article/why-can't-i-access-transaction-" +"history-greater-than-3-years-ts2241" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal balance manager funding of PayPal account" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal buyer credit payment funding" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal buyer warranty bonus" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal debit authorization" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal debit card cash advance" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal debit card withdrawal to ATM" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "" +"PayPal protection bonus, payout for PayPal buyer protection, payout for full" +" protection with PayPal buyer credit." +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment hold" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment hold release" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment refund, initiated by merchant" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment reversal, initiated by PayPal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment review hold" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment review release" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Points incentive redemption" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Postage payment to carrier" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Pre-approved payment (BillUser API)" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reauthorization" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Rebate or cash back reversal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Rebate payments" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reimbursement of chargeback" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reserve hold" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reserve release" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of ACH deposit" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of ACH withdrawal transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of debit card transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of general account hold" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of points usage" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_online_paypal.online_bank_statement_provider_form +msgid "Secret" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Settlement consolidation" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Store-to-store transfers" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Subscription payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Temporary hold on available balance" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Third-party auction payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Third-party payout" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Third-party recoupment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transaction fee for %s" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transfer of funds from payable" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transfer to and from a credit-card-funded restricted balance" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transfer to external GL entity" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Unknown authentication specified!" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Unknown error" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "User-initiated currency conversion" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Virtual PayPal debit card transaction" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Virtual terminal payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Void of authorization" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Warranty fee for warranty purchase" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Website payments standard payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Website payments. Pro account monthly fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "WorldLink check withdrawal fee" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "WorldLink withdrawal" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "eBay auction payment" +msgstr "" + +#. module: account_bank_statement_import_online_paypal +#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "eBay loyalty incentive" +msgstr "" diff --git a/account_statement_import_online_paypal/models/__init__.py b/account_statement_import_online_paypal/models/__init__.py new file mode 100644 index 00000000..10e8660a --- /dev/null +++ b/account_statement_import_online_paypal/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import online_bank_statement_provider_paypal diff --git a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py new file mode 100644 index 00000000..0d6d9816 --- /dev/null +++ b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py @@ -0,0 +1,519 @@ +# Copyright 2019-2020 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2021 CorporateHub (https://corporatehub.eu) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +import itertools +import json +import urllib.request +from base64 import b64encode +from datetime import datetime +from decimal import Decimal +from urllib.error import HTTPError +from urllib.parse import urlencode + +import dateutil.parser +import pytz +from dateutil.relativedelta import relativedelta + +from odoo import _, api, models +from odoo.exceptions import UserError + +PAYPAL_API_BASE = "https://api.paypal.com" +TRANSACTIONS_SCOPE = "https://uri.paypal.com/services/reporting/search/read" +EVENT_DESCRIPTIONS = { + "T0000": _("General PayPal-to-PayPal payment"), + "T0001": _("MassPay payment"), + "T0002": _("Subscription payment"), + "T0003": _("Pre-approved payment (BillUser API)"), + "T0004": _("eBay auction payment"), + "T0005": _("Direct payment API"), + "T0006": _("PayPal Checkout APIs"), + "T0007": _("Website payments standard payment"), + "T0008": _("Postage payment to carrier"), + "T0009": _("Gift certificate payment, purchase of gift certificate"), + "T0010": _("Third-party auction payment"), + "T0011": _("Mobile payment, made through a mobile phone"), + "T0012": _("Virtual terminal payment"), + "T0013": _("Donation payment"), + "T0014": _("Rebate payments"), + "T0015": _("Third-party payout"), + "T0016": _("Third-party recoupment"), + "T0017": _("Store-to-store transfers"), + "T0018": _("PayPal Here payment"), + "T0019": _("Generic instrument-funded payment"), + "T0100": _("General non-payment fee"), + "T0101": _("Website payments. Pro account monthly fee"), + "T0102": _("Foreign bank withdrawal fee"), + "T0103": _("WorldLink check withdrawal fee"), + "T0104": _("Mass payment batch fee"), + "T0105": _("Check withdrawal"), + "T0106": _("Chargeback processing fee"), + "T0107": _("Payment fee"), + "T0108": _("ATM withdrawal"), + "T0109": _("Auto-sweep from account"), + "T0110": _("International credit card withdrawal"), + "T0111": _("Warranty fee for warranty purchase"), + "T0112": _("Gift certificate expiration fee"), + "T0113": _("Partner fee"), + "T0200": _("General currency conversion"), + "T0201": _("User-initiated currency conversion"), + "T0202": _("Currency conversion required to cover negative balance"), + "T0300": _("General funding of PayPal account"), + "T0301": _("PayPal balance manager funding of PayPal account"), + "T0302": _("ACH funding for funds recovery from account balance"), + "T0303": _("Electronic funds transfer (EFT)"), + "T0400": _("General withdrawal from PayPal account"), + "T0401": _("AutoSweep"), + "T0500": _("General PayPal debit card transaction"), + "T0501": _("Virtual PayPal debit card transaction"), + "T0502": _("PayPal debit card withdrawal to ATM"), + "T0503": _("Hidden virtual PayPal debit card transaction"), + "T0504": _("PayPal debit card cash advance"), + "T0505": _("PayPal debit authorization"), + "T0600": _("General credit card withdrawal"), + "T0700": _("General credit card deposit"), + "T0701": _("Credit card deposit for negative PayPal account balance"), + "T0800": _("General bonus"), + "T0801": _("Debit card cash back bonus"), + "T0802": _("Merchant referral account bonus"), + "T0803": _("Balance manager account bonus"), + "T0804": _("PayPal buyer warranty bonus"), + "T0805": _( + "PayPal protection bonus, payout for PayPal buyer protection, payout " + "for full protection with PayPal buyer credit." + ), + "T0806": _("Bonus for first ACH use"), + "T0807": _("Credit card security charge refund"), + "T0808": _("Credit card cash back bonus"), + "T0900": _("General incentive or certificate redemption"), + "T0901": _("Gift certificate redemption"), + "T0902": _("Points incentive redemption"), + "T0903": _("Coupon redemption"), + "T0904": _("eBay loyalty incentive"), + "T0905": _("Offers used as funding source"), + "T1000": _("Bill pay transaction"), + "T1100": _("General reversal"), + "T1101": _("Reversal of ACH withdrawal transaction"), + "T1102": _("Reversal of debit card transaction"), + "T1103": _("Reversal of points usage"), + "T1104": _("Reversal of ACH deposit"), + "T1105": _("Reversal of general account hold"), + "T1106": _("Payment reversal, initiated by PayPal"), + "T1107": _("Payment refund, initiated by merchant"), + "T1108": _("Fee reversal"), + "T1109": _("Fee refund"), + "T1110": _("Hold for dispute investigation"), + "T1111": _("Cancellation of hold for dispute resolution"), + "T1112": _("MAM reversal"), + "T1113": _("Non-reference credit payment"), + "T1114": _("MassPay reversal transaction"), + "T1115": _("MassPay refund transaction"), + "T1116": _("Instant payment review (IPR) reversal"), + "T1117": _("Rebate or cash back reversal"), + "T1118": _("Generic instrument/Open Wallet reversals (seller side)"), + "T1119": _("Generic instrument/Open Wallet reversals (buyer side)"), + "T1200": _("General account adjustment"), + "T1201": _("Chargeback"), + "T1202": _("Chargeback reversal"), + "T1203": _("Charge-off adjustment"), + "T1204": _("Incentive adjustment"), + "T1205": _("Reimbursement of chargeback"), + "T1207": _("Chargeback re-presentment rejection"), + "T1208": _("Chargeback cancellation"), + "T1300": _("General authorization"), + "T1301": _("Reauthorization"), + "T1302": _("Void of authorization"), + "T1400": _("General dividend"), + "T1500": _("General temporary hold"), + "T1501": _("Account hold for open authorization"), + "T1502": _("Account hold for ACH deposit"), + "T1503": _("Temporary hold on available balance"), + "T1600": _("PayPal buyer credit payment funding"), + "T1601": _("BML credit, transfer from BML"), + "T1602": _("Buyer credit payment"), + "T1603": _("Buyer credit payment withdrawal, transfer to BML"), + "T1700": _("General withdrawal to non-bank institution"), + "T1701": _("WorldLink withdrawal"), + "T1800": _("General buyer credit payment"), + "T1801": _("BML withdrawal, transfer to BML"), + "T1900": _("General adjustment without business-related event"), + "T2000": _("General intra-account transfer"), + "T2001": _("Settlement consolidation"), + "T2002": _("Transfer of funds from payable"), + "T2003": _("Transfer to external GL entity"), + "T2101": _("General hold"), + "T2102": _("General hold release"), + "T2103": _("Reserve hold"), + "T2104": _("Reserve release"), + "T2105": _("Payment review hold"), + "T2106": _("Payment review release"), + "T2107": _("Payment hold"), + "T2108": _("Payment hold release"), + "T2109": _("Gift certificate purchase"), + "T2110": _("Gift certificate redemption"), + "T2111": _("Funds not yet available"), + "T2112": _("Funds available"), + "T2113": _("Blocked payments"), + "T2201": _("Transfer to and from a credit-card-funded restricted balance"), + "T3000": _("Generic instrument/Open Wallet transaction"), + "T5000": _("Deferred disbursement, funds collected for disbursement"), + "T5001": _("Delayed disbursement, funds disbursed"), + "T9700": _("Account receivable for shipping"), + "T9701": _("Funds payable: PayPal-provided funds that must be paid back"), + "T9702": _("Funds receivable: PayPal-provided funds that are being paid back"), + "T9800": _("Display only transaction"), + "T9900": _("Other"), +} +NO_DATA_FOR_DATE_AVAIL_MSG = "Data for the given start date is not available." + + +class OnlineBankStatementProviderPayPal(models.Model): + _inherit = "online.bank.statement.provider" + + @api.model + def _get_available_services(self): + return super()._get_available_services() + [ + ("paypal", "PayPal.com"), + ] + + def _obtain_statement_data(self, date_since, date_until): + self.ensure_one() + if self.service != "paypal": + return super()._obtain_statement_data( + date_since, + date_until, + ) # pragma: no cover + + currency = (self.currency_id or self.company_id.currency_id).name + + if date_since.tzinfo: + date_since = date_since.astimezone(pytz.utc).replace(tzinfo=None) + if date_until.tzinfo: + date_until = date_until.astimezone(pytz.utc).replace(tzinfo=None) + + if date_since < datetime.utcnow() - relativedelta(years=3): + raise UserError( + _( + "PayPal allows retrieving transactions only up to 3 years in " + "the past. Please import older transactions manually. See " + "https://www.paypal.com/us/smarthelp/article/why-can't-i" + "-access-transaction-history-greater-than-3-years-ts2241" + ) + ) + + token = self._paypal_get_token() + transactions = self._paypal_get_transactions( + token, currency, date_since, date_until + ) + if not transactions: + balance = self._paypal_get_balance(token, currency, date_since) + return [], {"balance_start": balance, "balance_end_real": balance} + + # Normalize transactions, sort by date, and get lines + transactions = list( + sorted( + transactions, + key=lambda transaction: self._paypal_get_transaction_date(transaction), + ) + ) + lines = list( + itertools.chain.from_iterable( + map(lambda x: self._paypal_transaction_to_lines(x), transactions) + ) + ) + + first_transaction = transactions[0] + first_transaction_id = first_transaction["transaction_info"]["transaction_id"] + first_transaction_date = self._paypal_get_transaction_date(first_transaction) + first_transaction = self._paypal_get_transaction( + token, first_transaction_id, first_transaction_date + ) + if not first_transaction: + raise UserError( + _("Failed to resolve transaction %s (%s)") + % (first_transaction_id, first_transaction_date) + ) + balance_start = self._paypal_get_transaction_ending_balance(first_transaction) + balance_start -= self._paypal_get_transaction_total_amount(first_transaction) + balance_start -= self._paypal_get_transaction_fee_amount(first_transaction) + + last_transaction = transactions[-1] + last_transaction_id = last_transaction["transaction_info"]["transaction_id"] + last_transaction_date = self._paypal_get_transaction_date(last_transaction) + last_transaction = self._paypal_get_transaction( + token, last_transaction_id, last_transaction_date + ) + if not last_transaction: + raise UserError( + _("Failed to resolve transaction %s (%s)") + % (last_transaction_id, last_transaction_date) + ) + balance_end = self._paypal_get_transaction_ending_balance(last_transaction) + + return lines, {"balance_start": balance_start, "balance_end_real": balance_end} + + @api.model + def _paypal_preparse_transaction(self, transaction): + date = ( + dateutil.parser.parse(self._paypal_get_transaction_date(transaction)) + .astimezone(pytz.utc) + .replace(tzinfo=None) + ) + transaction["transaction_info"]["transaction_updated_date"] = date + return transaction + + @api.model + def _paypal_transaction_to_lines(self, data): + transaction = data["transaction_info"] + payer = data["payer_info"] + transaction_id = transaction["transaction_id"] + event_code = transaction["transaction_event_code"] + date = self._paypal_get_transaction_date(data) + total_amount = self._paypal_get_transaction_total_amount(data) + fee_amount = self._paypal_get_transaction_fee_amount(data) + transaction_subject = transaction.get("transaction_subject") + transaction_note = transaction.get("transaction_note") + invoice = transaction.get("invoice_id") + payer_name = payer.get("payer_name", {}) + payer_email = payer_name.get("email_address") + if invoice: + invoice = _("Invoice %s") % invoice + note = transaction_id + if transaction_subject or transaction_note: + note = "{}: {}".format(note, transaction_subject or transaction_note) + if payer_email: + note += " (%s)" % payer_email + unique_import_id = "{}-{}".format(transaction_id, int(date.timestamp())) + name = ( + invoice + or transaction_subject + or transaction_note + or EVENT_DESCRIPTIONS.get(event_code) + or "" + ) + line = { + "name": name, + "amount": str(total_amount), + "date": date, + "note": note, + "unique_import_id": unique_import_id, + } + payer_full_name = payer_name.get("full_name") or payer_name.get( + "alternate_full_name" + ) + if payer_full_name: + line.update({"partner_name": payer_full_name}) + lines = [line] + if fee_amount: + lines += [ + { + "name": _("Fee for %s") % (name or transaction_id), + "amount": str(fee_amount), + "date": date, + "partner_name": "PayPal", + "unique_import_id": "%s-FEE" % unique_import_id, + "note": _("Transaction fee for %s") % note, + } + ] + return lines + + def _paypal_get_token(self): + self.ensure_one() + data = self._paypal_retrieve( + (self.api_base or PAYPAL_API_BASE) + "/v1/oauth2/token", + (self.username, self.password), + data=urlencode({"grant_type": "client_credentials"}).encode("utf-8"), + ) + if "scope" not in data or TRANSACTIONS_SCOPE not in data["scope"]: + raise UserError(_("PayPal App features are configured incorrectly!")) + if "token_type" not in data or data["token_type"] != "Bearer": + raise UserError(_("Invalid token type!")) + if "access_token" not in data: + raise UserError(_("Failed to acquire token using Client ID and Secret!")) + return data["access_token"] + + def _paypal_get_balance(self, token, currency, as_of_timestamp): + self.ensure_one() + url = ( + self.api_base or PAYPAL_API_BASE + ) + "/v1/reporting/balances?currency_code={}&as_of_time={}".format( + currency, + as_of_timestamp.isoformat() + "Z", + ) + data = self._paypal_retrieve(url, token) + available_balance = data["balances"][0].get("available_balance") + if not available_balance: + return Decimal() + return Decimal(available_balance["value"]) + + def _paypal_get_transaction(self, token, transaction_id, timestamp): + self.ensure_one() + transaction_date = timestamp.isoformat() + "Z" + url = ( + (self.api_base or PAYPAL_API_BASE) + + "/v1/reporting/transactions" + + ("?start_date=%s" "&end_date=%s" "&fields=all") + % ( + transaction_date, + transaction_date, + ) + ) + data = self._paypal_retrieve(url, token) + transactions = data["transaction_details"] + for transaction in transactions: + if transaction["transaction_info"]["transaction_id"] != transaction_id: + continue + return transaction + return None + + def _paypal_get_transactions(self, token, currency, since, until): + self.ensure_one() + # NOTE: Not more than 31 days in a row + # NOTE: start_date <= date <= end_date, thus check every transaction + interval_step = relativedelta(days=31) + interval_start = since + transactions = [] + while interval_start < until: + interval_end = min(interval_start + interval_step, until) + page = 1 + total_pages = None + while total_pages is None or page <= total_pages: + url = ( + (self.api_base or PAYPAL_API_BASE) + + "/v1/reporting/transactions" + + ( + "?transaction_currency=%s" + "&start_date=%s" + "&end_date=%s" + "&fields=all" + "&balance_affecting_records_only=Y" + "&page_size=500" + "&page=%d" + % ( + currency, + interval_start.isoformat() + "Z", + interval_end.isoformat() + "Z", + page, + ) + ) + ) + + # NOTE: Workaround for INVALID_REQUEST (see ROADMAP.rst) + invalid_data_workaround = self.env.context.get( + "test_account_bank_statement_import_online_paypal_monday", + interval_start.weekday() == 0 + and (datetime.utcnow() - interval_start).total_seconds() < 28800, + ) + + data = self.with_context( + invalid_data_workaround=invalid_data_workaround, + )._paypal_retrieve(url, token) + interval_transactions = map( + lambda transaction: self._paypal_preparse_transaction(transaction), + data["transaction_details"], + ) + transactions += list( + filter( + lambda transaction: interval_start + <= self._paypal_get_transaction_date(transaction) + < interval_end, + interval_transactions, + ) + ) + total_pages = data["total_pages"] + page += 1 + interval_start += interval_step + return transactions + + @api.model + def _paypal_get_transaction_date(self, transaction): + # NOTE: CSV reports from PayPal use this date, search as well + return transaction["transaction_info"]["transaction_updated_date"] + + @api.model + def _paypal_get_transaction_total_amount(self, transaction): + transaction_amount = transaction["transaction_info"].get("transaction_amount") + if not transaction_amount: + return Decimal() + return Decimal(transaction_amount["value"]) + + @api.model + def _paypal_get_transaction_fee_amount(self, transaction): + fee_amount = transaction["transaction_info"].get("fee_amount") + if not fee_amount: + return Decimal() + return Decimal(fee_amount["value"]) + + @api.model + def _paypal_get_transaction_ending_balance(self, transaction): + # NOTE: 'available_balance' instead of 'ending_balance' as per CSV file + transaction_amount = transaction["transaction_info"].get("available_balance") + if not transaction_amount: + return Decimal() + return Decimal(transaction_amount["value"]) + + @api.model + def _paypal_decode_error(self, content): + if "name" in content: + return UserError( + "%s: %s" + % ( + content["name"], + content.get("message", _("Unknown error")), + ) + ) + + if "error" in content: + return UserError( + "%s: %s" + % ( + content["error"], + content.get("error_description", _("Unknown error")), + ) + ) + + return None + + @api.model + def _paypal_retrieve(self, url, auth, data=None): + try: + with self._paypal_urlopen(url, auth, data) as response: + content = response.read().decode("utf-8") + except HTTPError as e: + content = json.loads(e.read().decode("utf-8")) + + # NOTE: Workaround for INVALID_REQUEST (see ROADMAP.rst) + if ( + self.env.context.get("invalid_data_workaround") + and content.get("name") == "INVALID_REQUEST" + and content.get("message") == NO_DATA_FOR_DATE_AVAIL_MSG + ): + return { + "transaction_details": [], + "page": 1, + "total_items": 0, + "total_pages": 0, + } + + raise self._paypal_decode_error(content) or e + return json.loads(content) + + @api.model + def _paypal_urlopen(self, url, auth, data=None): + if not auth: + raise UserError(_("No authentication specified!")) + request = urllib.request.Request(url, data=data) + if isinstance(auth, tuple): + request.add_header( + "Authorization", + "Basic %s" + % str( + b64encode(("{}:{}".format(auth[0], auth[1])).encode("utf-8")), + "utf-8", + ), + ) + elif isinstance(auth, str): + request.add_header("Authorization", "Bearer %s" % auth) + else: + raise UserError(_("Unknown authentication specified!")) + return urllib.request.urlopen(request) diff --git a/account_statement_import_online_paypal/readme/CONFIGURE.rst b/account_statement_import_online_paypal/readme/CONFIGURE.rst new file mode 100644 index 00000000..67b44183 --- /dev/null +++ b/account_statement_import_online_paypal/readme/CONFIGURE.rst @@ -0,0 +1,29 @@ +To configure online bank statements provider: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Open bank account to configure and edit it +#. Set *Bank Feeds* to *Online* +#. Select *PayPal.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +or, alternatively: + +#. Go to *Invoicing > Overview* +#. Open settings of the corresponding journal account +#. Switch to *Bank Account* tab +#. Set *Bank Feeds* to *Online* +#. Select *PayPal.com* as online bank statements provider in + *Online Bank Statements (OCA)* section +#. Save the bank account +#. Click on provider and configure provider-specific settings. + +To obtain *Client ID* and *Secret*: + +#. Open `PayPal Developer `_ +#. Go to *My Apps & Credentials* and switch to *Live* +#. Under *REST API apps*, click *Create App* to create new application (e.g. *Odoo*) +#. Copy *Client ID* and *Secret* to use during provider configuration +#. Under *Live App Settings*, uncheck all features except *Transaction Search* +#. Click Save diff --git a/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst b/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..724bc1d0 --- /dev/null +++ b/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `CorporateHub `__ + + * Alexey Pelykh diff --git a/account_statement_import_online_paypal/readme/DESCRIPTION.rst b/account_statement_import_online_paypal/readme/DESCRIPTION.rst new file mode 100644 index 00000000..be38c967 --- /dev/null +++ b/account_statement_import_online_paypal/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +This module provides online bank statements from +`PayPal.com `__. diff --git a/account_statement_import_online_paypal/readme/ROADMAP.rst b/account_statement_import_online_paypal/readme/ROADMAP.rst new file mode 100644 index 00000000..f6968426 --- /dev/null +++ b/account_statement_import_online_paypal/readme/ROADMAP.rst @@ -0,0 +1,11 @@ +* Only transactions for the previous three years are retrieved, historical data + can be imported manually, see ``account_bank_statement_import_paypal``. See + `PayPal Help Center article `_ + for details. +* `PayPal Transaction Info `_ + defines extra fields like ``tip_amount``, ``shipping_amount``, etc. that + could be useful to be decomposed from a single transaction. +* There's a known issue with PayPal API that on every Monday for couple of + hours after UTC midnight it returns ``INVALID_REQUEST`` incorrectly: their + servers have not inflated the data yet. PayPal tech support confirmed this + behaviour in case #06650320 (private). diff --git a/account_statement_import_online_paypal/readme/USAGE.rst b/account_statement_import_online_paypal/readme/USAGE.rst new file mode 100644 index 00000000..03845f13 --- /dev/null +++ b/account_statement_import_online_paypal/readme/USAGE.rst @@ -0,0 +1,6 @@ +To pull historical bank statements: + +#. Go to *Invoicing > Configuration > Bank Accounts* +#. Select specific bank accounts +#. Launch *Actions > Online Bank Statements Pull Wizard* +#. Configure date interval and click *Pull* diff --git a/account_statement_import_online_paypal/static/description/icon.png b/account_statement_import_online_paypal/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/account_statement_import_online_paypal/static/description/index.html b/account_statement_import_online_paypal/static/description/index.html new file mode 100644 index 00000000..5a152d47 --- /dev/null +++ b/account_statement_import_online_paypal/static/description/index.html @@ -0,0 +1,487 @@ + + + + + + +Online Bank Statements: PayPal.com + + + +
+

Online Bank Statements: PayPal.com

+ + +

Beta License: AGPL-3 OCA/bank-statement-import Translate me on Weblate Try me on Runbot

+

This module provides online bank statements from +PayPal.com.

+

Table of contents

+ +
+

Configuration

+

To configure online bank statements provider:

+
    +
  1. Go to Invoicing > Configuration > Bank Accounts
  2. +
  3. Open bank account to configure and edit it
  4. +
  5. Set Bank Feeds to Online
  6. +
  7. Select PayPal.com as online bank statements provider in +Online Bank Statements (OCA) section
  8. +
  9. Save the bank account
  10. +
  11. Click on provider and configure provider-specific settings.
  12. +
+

or, alternatively:

+
    +
  1. Go to Invoicing > Overview
  2. +
  3. Open settings of the corresponding journal account
  4. +
  5. Switch to Bank Account tab
  6. +
  7. Set Bank Feeds to Online
  8. +
  9. Select PayPal.com as online bank statements provider in +Online Bank Statements (OCA) section
  10. +
  11. Save the bank account
  12. +
  13. Click on provider and configure provider-specific settings.
  14. +
+

To obtain Client ID and Secret:

+
    +
  1. Open PayPal Developer
  2. +
  3. Go to My Apps & Credentials and switch to Live
  4. +
  5. Under REST API apps, click Create App to create new application (e.g. Odoo)
  6. +
  7. Copy Client ID and Secret to use during provider configuration
  8. +
  9. Under Live App Settings, uncheck all features except Transaction Search
  10. +
  11. Click Save
  12. +
+
+
+

Usage

+

To pull historical bank statements:

+
    +
  1. Go to Invoicing > Configuration > Bank Accounts
  2. +
  3. Select specific bank accounts
  4. +
  5. Launch Actions > Online Bank Statements Pull Wizard
  6. +
  7. Configure date interval and click Pull
  8. +
+
+
+

Known issues / Roadmap

+
    +
  • Only transactions for the previous three years are retrieved, historical data +can be imported manually, see account_bank_statement_import_paypal. See +PayPal Help Center article +for details.
  • +
  • PayPal Transaction Info +defines extra fields like tip_amount, shipping_amount, etc. that +could be useful to be decomposed from a single transaction.
  • +
  • There’s a known issue with PayPal API that on every Monday for couple of +hours after UTC midnight it returns INVALID_REQUEST incorrectly: their +servers have not inflated the data yet. PayPal tech support confirmed this +behaviour in case #06650320 (private).
  • +
+
+
+

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

+
    +
  • CorporateHub
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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.

+

Current maintainer:

+

alexey-pelykh

+

This module is part of the OCA/bank-statement-import project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/account_statement_import_online_paypal/tests/__init__.py b/account_statement_import_online_paypal/tests/__init__.py new file mode 100644 index 00000000..ca7b0d9c --- /dev/null +++ b/account_statement_import_online_paypal/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_account_bank_statement_import_online_paypal diff --git a/account_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py b/account_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py new file mode 100644 index 00000000..b2842d06 --- /dev/null +++ b/account_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py @@ -0,0 +1,803 @@ +# Copyright 2019 Brainbean Apps (https://brainbeanapps.com) +# Copyright 2021 CorporateHub (https://corporatehub.eu) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import json +from datetime import datetime +from decimal import Decimal +from unittest import mock +from urllib.error import HTTPError + +from dateutil.relativedelta import relativedelta + +from odoo import fields +from odoo.exceptions import UserError +from odoo.tests import common + +_module_ns = "odoo.addons.account_bank_statement_import_online_paypal" +_provider_class = ( + _module_ns + + ".models.online_bank_statement_provider_paypal" + + ".OnlineBankStatementProviderPayPal" +) + + +class FakeHTTPError(HTTPError): + def __init__(self, content): + self.content = content + + # pylint: disable=method-required-super + def read(self): + return self.content.encode("utf-8") + + +class UrlopenRetValMock: + def __init__(self, content, throw=False): + self.content = content + self.throw = throw + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + # pylint: disable=method-required-super + def read(self): + if self.throw: + raise FakeHTTPError(self.content) + return self.content.encode("utf-8") + + +class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): + def setUp(self): + super().setUp() + + self.now = fields.Datetime.now() + self.currency_eur = self.env.ref("base.EUR") + self.currency_usd = self.env.ref("base.USD") + self.AccountJournal = self.env["account.journal"] + self.OnlineBankStatementProvider = self.env["online.bank.statement.provider"] + self.AccountBankStatement = self.env["account.bank.statement"] + self.AccountBankStatementLine = self.env["account.bank.statement.line"] + + Provider = self.OnlineBankStatementProvider + self.paypal_parse_transaction = lambda payload: ( + Provider._paypal_transaction_to_lines( + Provider._paypal_preparse_transaction( + json.loads( + payload, + parse_float=Decimal, + ) + ) + ) + ) + self.mock_token = lambda: mock.patch( + _provider_class + "._paypal_get_token", + return_value="--TOKEN--", + ) + + def test_good_token(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response = json.loads( + """{ + "scope": "https://uri.paypal.com/services/reporting/search/read", + "access_token": "---TOKEN---", + "token_type": "Bearer", + "app_id": "APP-1234567890", + "expires_in": 32400, + "nonce": "---NONCE---" +}""", + parse_float=Decimal, + ) + token = None + with mock.patch( + _provider_class + "._paypal_retrieve", + return_value=mocked_response, + ): + token = provider._paypal_get_token() + self.assertEqual(token, "---TOKEN---") + + def test_bad_token_scope(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response = json.loads( + """{ + "scope": "openid https://uri.paypal.com/services/applications/webhooks", + "access_token": "---TOKEN---", + "token_type": "Bearer", + "app_id": "APP-1234567890", + "expires_in": 32400, + "nonce": "---NONCE---" +}""", + parse_float=Decimal, + ) + with mock.patch( + _provider_class + "._paypal_retrieve", + return_value=mocked_response, + ): + with self.assertRaises(Exception): + provider._paypal_get_token() + + def test_bad_token_type(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response = json.loads( + """{ + "scope": "https://uri.paypal.com/services/reporting/search/read", + "access_token": "---TOKEN---", + "token_type": "NotBearer", + "app_id": "APP-1234567890", + "expires_in": 32400, + "nonce": "---NONCE---" +}""", + parse_float=Decimal, + ) + with mock.patch( + _provider_class + "._paypal_retrieve", + return_value=mocked_response, + ): + with self.assertRaises(Exception): + provider._paypal_get_token() + + def test_no_token(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response = json.loads( + """{ + "scope": "https://uri.paypal.com/services/reporting/search/read", + "token_type": "Bearer", + "app_id": "APP-1234567890", + "expires_in": 32400, + "nonce": "---NONCE---" + }""", + parse_float=Decimal, + ) + with mock.patch( + _provider_class + "._paypal_retrieve", + return_value=mocked_response, + ): + with self.assertRaises(Exception): + provider._paypal_get_token() + + def test_no_data_on_monday(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response_1 = UrlopenRetValMock( + """{ + "debug_id": "eec890ebd5798", + "details": "xxxxxx", + "links": "xxxxxx", + "message": "Data for the given start date is not available.", + "name": "INVALID_REQUEST" +}""", + throw=True, + ) + mocked_response_2 = UrlopenRetValMock( + """{ + "balances": [ + { + "currency": "EUR", + "primary": true, + "total_balance": { + "currency_code": "EUR", + "value": "0.75" + }, + "available_balance": { + "currency_code": "EUR", + "value": "0.75" + }, + "withheld_balance": { + "currency_code": "EUR", + "value": "0.00" + } + } + ], + "account_id": "1234567890", + "as_of_time": "2019-08-01T00:00:00+0000", + "last_refresh_time": "2019-08-01T00:00:00+0000" +}""" + ) + with mock.patch( + _provider_class + "._paypal_urlopen", + side_effect=[mocked_response_1, mocked_response_2], + ), self.mock_token(): + data = provider.with_context( + test_account_bank_statement_import_online_paypal_monday=True, + )._obtain_statement_data( + self.now - relativedelta(hours=1), + self.now, + ) + + self.assertEqual(data, ([], {"balance_start": 0.75, "balance_end_real": 0.75})) + + def test_error_handling_1(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response = UrlopenRetValMock( + """{ + "message": "MESSAGE", + "name": "ERROR" +}""", + throw=True, + ) + with mock.patch( + _provider_class + "._paypal_urlopen", + return_value=mocked_response, + ): + with self.assertRaises(UserError): + provider._paypal_retrieve("https://url", "") + + def test_error_handling_2(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response = UrlopenRetValMock( + """{ + "error_description": "ERROR DESCRIPTION", + "error": "ERROR" +}""", + throw=True, + ) + with mock.patch( + _provider_class + "._paypal_urlopen", + return_value=mocked_response, + ): + with self.assertRaises(UserError): + provider._paypal_retrieve("https://url", "") + + def test_empty_pull(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + 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", + "page": 1, + "total_items": 0, + "total_pages": 0 +}""", + parse_float=Decimal, + ) + mocked_response_2 = json.loads( + """{ + "balances": [ + { + "currency": "EUR", + "primary": true, + "total_balance": { + "currency_code": "EUR", + "value": "0.75" + }, + "available_balance": { + "currency_code": "EUR", + "value": "0.75" + }, + "withheld_balance": { + "currency_code": "EUR", + "value": "0.00" + } + } + ], + "account_id": "1234567890", + "as_of_time": "2019-08-01T00:00:00+0000", + "last_refresh_time": "2019-08-01T00:00:00+0000" +}""", + parse_float=Decimal, + ) + with mock.patch( + _provider_class + "._paypal_retrieve", + side_effect=[mocked_response_1, mocked_response_2], + ), self.mock_token(): + data = provider._obtain_statement_data( + self.now - relativedelta(hours=1), + self.now, + ) + + self.assertEqual(data, ([], {"balance_start": 0.75, "balance_end_real": 0.75})) + + def test_ancient_pull(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + 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", + "page": 1, + "total_items": 0, + "total_pages": 0 +}""", + parse_float=Decimal, + ) + with mock.patch( + _provider_class + "._paypal_retrieve", + return_value=mocked_response, + ), self.mock_token(): + with self.assertRaises(Exception): + provider._obtain_statement_data( + self.now - relativedelta(years=5), + self.now, + ) + + def test_pull(self): + journal = self.AccountJournal.create( + { + "name": "Bank", + "type": "bank", + "code": "BANK", + "currency_id": self.currency_eur.id, + "bank_statements_source": "online", + "online_bank_statement_provider": "paypal", + } + ) + + provider = journal.online_bank_statement_provider_id + mocked_response = json.loads( + """{ + "transaction_details": [{ + "transaction_info": { + "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_amount": { + "currency_code": "USD", + "value": "1000.00" + }, + "fee_amount": { + "currency_code": "USD", + "value": "-100.00" + }, + "transaction_status": "S", + "transaction_subject": "Payment for Invoice(s) 1", + "ending_balance": { + "currency_code": "USD", + "value": "900.00" + }, + "available_balance": { + "currency_code": "USD", + "value": "900.00" + }, + "invoice_id": "1" + }, + "payer_info": { + "account_id": "1234567890", + "email_address": "partner@example.com", + "address_status": "Y", + "payer_status": "N", + "payer_name": { + "alternate_full_name": "Acme, Inc." + }, + "country_code": "US" + }, + "shipping_info": {}, + "cart_info": {}, + "store_info": {}, + "auction_info": {}, + "incentive_info": {} + }, { + "transaction_info": { + "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_amount": { + "currency_code": "USD", + "value": "1000.00" + }, + "fee_amount": { + "currency_code": "USD", + "value": "-100.00" + }, + "transaction_status": "S", + "transaction_subject": "Payment for Invoice(s) 1", + "ending_balance": { + "currency_code": "USD", + "value": "900.00" + }, + "available_balance": { + "currency_code": "USD", + "value": "900.00" + }, + "invoice_id": "1" + }, + "payer_info": { + "account_id": "1234567890", + "email_address": "partner@example.com", + "address_status": "Y", + "payer_status": "N", + "payer_name": { + "alternate_full_name": "Acme, Inc." + }, + "country_code": "US" + }, + "shipping_info": {}, + "cart_info": {}, + "store_info": {}, + "auction_info": {}, + "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", + "page": 1, + "total_items": 1, + "total_pages": 1 +}""", + 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), + ) + + 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}) + + def test_transaction_parse_1(self): + lines = self.paypal_parse_transaction( + """{ + "transaction_info": { + "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_amount": { + "currency_code": "USD", + "value": "1000.00" + }, + "fee_amount": { + "currency_code": "USD", + "value": "0.00" + }, + "transaction_status": "S", + "transaction_subject": "Payment for Invoice(s) 1", + "ending_balance": { + "currency_code": "USD", + "value": "1000.00" + }, + "available_balance": { + "currency_code": "USD", + "value": "1000.00" + }, + "invoice_id": "1" + }, + "payer_info": { + "account_id": "1234567890", + "email_address": "partner@example.com", + "address_status": "Y", + "payer_status": "N", + "payer_name": { + "alternate_full_name": "Acme, Inc." + }, + "country_code": "US" + }, + "shipping_info": {}, + "cart_info": {}, + "store_info": {}, + "auction_info": {}, + "incentive_info": {} +}""" + ) + 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", + }, + ) + + def test_transaction_parse_2(self): + lines = self.paypal_parse_transaction( + """{ + "transaction_info": { + "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_amount": { + "currency_code": "USD", + "value": "1000.00" + }, + "fee_amount": { + "currency_code": "USD", + "value": "0.00" + }, + "transaction_status": "S", + "transaction_subject": "Payment for Invoice(s) 1", + "ending_balance": { + "currency_code": "USD", + "value": "1000.00" + }, + "available_balance": { + "currency_code": "USD", + "value": "1000.00" + }, + "invoice_id": "1" + }, + "payer_info": { + "account_id": "1234567890", + "email_address": "partner@example.com", + "address_status": "Y", + "payer_status": "N", + "payer_name": { + "alternate_full_name": "Acme, Inc." + }, + "country_code": "US" + }, + "shipping_info": {}, + "cart_info": {}, + "store_info": {}, + "auction_info": {}, + "incentive_info": {} +}""" + ) + 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", + }, + ) + + def test_transaction_parse_3(self): + lines = self.paypal_parse_transaction( + """{ + "transaction_info": { + "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_amount": { + "currency_code": "USD", + "value": "1000.00" + }, + "fee_amount": { + "currency_code": "USD", + "value": "-100.00" + }, + "transaction_status": "S", + "transaction_subject": "Payment for Invoice(s) 1", + "ending_balance": { + "currency_code": "USD", + "value": "900.00" + }, + "available_balance": { + "currency_code": "USD", + "value": "900.00" + }, + "invoice_id": "1" + }, + "payer_info": { + "account_id": "1234567890", + "email_address": "partner@example.com", + "address_status": "Y", + "payer_status": "N", + "payer_name": { + "alternate_full_name": "Acme, Inc." + }, + "country_code": "US" + }, + "shipping_info": {}, + "cart_info": {}, + "store_info": {}, + "auction_info": {}, + "incentive_info": {} +}""" + ) + 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", + }, + ) + + def test_transaction_parse_4(self): + lines = self.paypal_parse_transaction( + """{ + "transaction_info": { + "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_amount": { + "currency_code": "USD", + "value": "1000.00" + }, + "transaction_status": "S", + "transaction_subject": "Payment for Invoice(s) 1", + "ending_balance": { + "currency_code": "USD", + "value": "1000.00" + }, + "available_balance": { + "currency_code": "USD", + "value": "1000.00" + }, + "invoice_id": "1" + }, + "payer_info": { + "account_id": "1234567890", + "email_address": "partner@example.com", + "address_status": "Y", + "payer_status": "N", + "payer_name": { + "alternate_full_name": "Acme, Inc." + }, + "country_code": "US" + }, + "shipping_info": {}, + "cart_info": {}, + "store_info": {}, + "auction_info": {}, + "incentive_info": {} +}""" + ) + 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", + }, + ) diff --git a/account_statement_import_online_paypal/views/online_bank_statement_provider.xml b/account_statement_import_online_paypal/views/online_bank_statement_provider.xml new file mode 100644 index 00000000..7d416cc0 --- /dev/null +++ b/account_statement_import_online_paypal/views/online_bank_statement_provider.xml @@ -0,0 +1,40 @@ + + + + + online.bank.statement.provider.form + online.bank.statement.provider + + + + + + + + + + + + + + From 636ea5dbeedd3080b1ef69d848061163fa9e0e82 Mon Sep 17 00:00:00 2001 From: "Omar (Comunitea)" Date: Fri, 25 Feb 2022 14:44:54 +0100 Subject: [PATCH 2/9] [MIG] account_statement_import_online_paypal: Migrated to 14.0 --- .../README.rst | 11 +- .../__manifest__.py | 4 +- ...nt_bank_statement_import_online_paypal.pot | 937 ----------------- ...account_statement_import_online_paypal.pot | 952 ++++++++++++++++++ .../online_bank_statement_provider_paypal.py | 11 +- .../readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 7 +- .../tests/__init__.py | 2 +- ...account_statement_import_online_paypal.py} | 37 +- .../views/online_bank_statement_provider.xml | 9 +- 10 files changed, 999 insertions(+), 972 deletions(-) delete mode 100644 account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot create mode 100644 account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot rename account_statement_import_online_paypal/tests/{test_account_bank_statement_import_online_paypal.py => test_account_statement_import_online_paypal.py} (95%) diff --git a/account_statement_import_online_paypal/README.rst b/account_statement_import_online_paypal/README.rst index 669ed545..396ba34c 100644 --- a/account_statement_import_online_paypal/README.rst +++ b/account_statement_import_online_paypal/README.rst @@ -14,13 +14,13 @@ Online Bank Statements: PayPal.com :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fbank--statement--import-lightgray.png?logo=github - :target: https://github.com/OCA/bank-statement-import/tree/13.0/account_bank_statement_import_online_paypal + :target: https://github.com/OCA/bank-statement-import/tree/14.0/account_statement_import_online_paypal :alt: OCA/bank-statement-import .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/bank-statement-import-13-0/bank-statement-import-13-0-account_bank_statement_import_online_paypal + :target: https://translation.odoo-community.org/projects/bank-statement-import-14-0/bank-statement-import-14-0-account_statement_import_online_paypal :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/174/13.0 + :target: https://runbot.odoo-community.org/runbot/174/14.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -97,7 +97,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -115,6 +115,7 @@ Contributors * `CorporateHub `__ * Alexey Pelykh +* Omar Castiñeira Maintainers ~~~~~~~~~~~ @@ -137,6 +138,6 @@ Current `maintainer `__: |maintainer-alexey-pelykh| -This module is part of the `OCA/bank-statement-import `_ project on GitHub. +This module is part of the `OCA/bank-statement-import `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_statement_import_online_paypal/__manifest__.py b/account_statement_import_online_paypal/__manifest__.py index 82bab800..49547705 100644 --- a/account_statement_import_online_paypal/__manifest__.py +++ b/account_statement_import_online_paypal/__manifest__.py @@ -4,14 +4,14 @@ { "name": "Online Bank Statements: PayPal.com", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "author": "CorporateHub, Odoo Community Association (OCA)", "maintainers": ["alexey-pelykh"], "website": "https://github.com/OCA/bank-statement-import", "license": "AGPL-3", "category": "Accounting", "summary": "Online bank statements for PayPal.com", - "depends": ["account_bank_statement_import_online"], + "depends": ["account_statement_import_online"], "data": ["views/online_bank_statement_provider.xml"], "installable": True, } diff --git a/account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot b/account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot deleted file mode 100644 index 1cb15a7b..00000000 --- a/account_statement_import_online_paypal/i18n/account_bank_statement_import_online_paypal.pot +++ /dev/null @@ -1,937 +0,0 @@ -# Translation of Odoo Server. -# This file contains the translation of the following modules: -# * account_bank_statement_import_online_paypal -# -msgid "" -msgstr "" -"Project-Id-Version: Odoo Server 13.0\n" -"Report-Msgid-Bugs-To: \n" -"Last-Translator: \n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "ACH funding for funds recovery from account balance" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_online_paypal.online_bank_statement_provider_form -msgid "API base" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "ATM withdrawal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Account hold for ACH deposit" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Account hold for open authorization" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Account receivable for shipping" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Auto-sweep from account" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "AutoSweep" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "BML credit, transfer from BML" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "BML withdrawal, transfer to BML" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Balance manager account bonus" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Bill pay transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Blocked payments" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Bonus for first ACH use" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Buyer credit payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Buyer credit payment withdrawal, transfer to BML" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Cancellation of hold for dispute resolution" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Charge-off adjustment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Chargeback" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Chargeback cancellation" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Chargeback processing fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Chargeback re-presentment rejection" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Chargeback reversal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Check withdrawal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_online_paypal.online_bank_statement_provider_form -msgid "Client ID" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Coupon redemption" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Credit card cash back bonus" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Credit card deposit for negative PayPal account balance" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Credit card security charge refund" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Currency conversion required to cover negative balance" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Debit card cash back bonus" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Deferred disbursement, funds collected for disbursement" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Delayed disbursement, funds disbursed" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Direct payment API" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Display only transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Donation payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Electronic funds transfer (EFT)" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Failed to acquire token using Client ID and Secret!" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Failed to resolve transaction %s (%s)" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Fee for %s" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Fee refund" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Fee reversal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Foreign bank withdrawal fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Funds available" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Funds not yet available" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Funds payable: PayPal-provided funds that must be paid back" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Funds receivable: PayPal-provided funds that are being paid back" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General PayPal debit card transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General PayPal-to-PayPal payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General account adjustment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General adjustment without business-related event" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General authorization" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General bonus" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General buyer credit payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General credit card deposit" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General credit card withdrawal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General currency conversion" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General dividend" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General funding of PayPal account" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General hold" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General hold release" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General incentive or certificate redemption" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General intra-account transfer" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General non-payment fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General reversal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General temporary hold" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General withdrawal from PayPal account" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "General withdrawal to non-bank institution" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Generic instrument-funded payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Generic instrument/Open Wallet reversals (buyer side)" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Generic instrument/Open Wallet reversals (seller side)" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Generic instrument/Open Wallet transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Gift certificate expiration fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Gift certificate payment, purchase of gift certificate" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Gift certificate purchase" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Gift certificate redemption" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Hidden virtual PayPal debit card transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Hold for dispute investigation" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Incentive adjustment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Instant payment review (IPR) reversal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "International credit card withdrawal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Invalid token type!" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Invoice %s" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "MAM reversal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Mass payment batch fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "MassPay payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "MassPay refund transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "MassPay reversal transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Merchant referral account bonus" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Mobile payment, made through a mobile phone" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "No authentication specified!" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Non-reference credit payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Offers used as funding source" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: model:ir.model,name:account_bank_statement_import_online_paypal.model_online_bank_statement_provider -msgid "Online Bank Statement Provider" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Other" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Partner fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal App features are configured incorrectly!" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal Checkout APIs" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal Here payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "" -"PayPal allows retrieving transactions only up to 3 years in the past. Please" -" import older transactions manually. See " -"https://www.paypal.com/us/smarthelp/article/why-can't-i-access-transaction-" -"history-greater-than-3-years-ts2241" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal balance manager funding of PayPal account" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal buyer credit payment funding" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal buyer warranty bonus" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal debit authorization" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal debit card cash advance" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "PayPal debit card withdrawal to ATM" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "" -"PayPal protection bonus, payout for PayPal buyer protection, payout for full" -" protection with PayPal buyer credit." -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Payment fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Payment hold" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Payment hold release" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Payment refund, initiated by merchant" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Payment reversal, initiated by PayPal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Payment review hold" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Payment review release" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Points incentive redemption" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Postage payment to carrier" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Pre-approved payment (BillUser API)" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reauthorization" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Rebate or cash back reversal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Rebate payments" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reimbursement of chargeback" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reserve hold" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reserve release" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reversal of ACH deposit" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reversal of ACH withdrawal transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reversal of debit card transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reversal of general account hold" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Reversal of points usage" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: model_terms:ir.ui.view,arch_db:account_bank_statement_import_online_paypal.online_bank_statement_provider_form -msgid "Secret" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Settlement consolidation" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Store-to-store transfers" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Subscription payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Temporary hold on available balance" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Third-party auction payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Third-party payout" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Third-party recoupment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Transaction fee for %s" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Transfer of funds from payable" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Transfer to and from a credit-card-funded restricted balance" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Transfer to external GL entity" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Unknown authentication specified!" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Unknown error" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "User-initiated currency conversion" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Virtual PayPal debit card transaction" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Virtual terminal payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Void of authorization" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Warranty fee for warranty purchase" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Website payments standard payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "Website payments. Pro account monthly fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "WorldLink check withdrawal fee" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "WorldLink withdrawal" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "eBay auction payment" -msgstr "" - -#. module: account_bank_statement_import_online_paypal -#: code:addons/account_bank_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 -#, python-format -msgid "eBay loyalty incentive" -msgstr "" diff --git a/account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot b/account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot new file mode 100644 index 00000000..c70d6430 --- /dev/null +++ b/account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot @@ -0,0 +1,952 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * account_statement_import_online_paypal +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "ACH funding for funds recovery from account balance" +msgstr "" + +#. module: account_statement_import_online_paypal +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_paypal.online_bank_statement_provider_form +msgid "API base" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "ATM withdrawal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Account hold for ACH deposit" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Account hold for open authorization" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Account receivable for shipping" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Auto-sweep from account" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "AutoSweep" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "BML credit, transfer from BML" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "BML withdrawal, transfer to BML" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Balance manager account bonus" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Bill pay transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Blocked payments" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Bonus for first ACH use" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Buyer credit payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Buyer credit payment withdrawal, transfer to BML" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Cancellation of hold for dispute resolution" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Charge-off adjustment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback cancellation" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback processing fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback re-presentment rejection" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Chargeback reversal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Check withdrawal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_paypal.online_bank_statement_provider_form +msgid "Client ID" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Coupon redemption" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Credit card cash back bonus" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Credit card deposit for negative PayPal account balance" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Credit card security charge refund" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Currency conversion required to cover negative balance" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Debit card cash back bonus" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Deferred disbursement, funds collected for disbursement" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Delayed disbursement, funds disbursed" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Direct payment API" +msgstr "" + +#. module: account_statement_import_online_paypal +#: model:ir.model.fields,field_description:account_statement_import_online_paypal.field_online_bank_statement_provider__display_name +msgid "Display Name" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Display only transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Donation payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Electronic funds transfer (EFT)" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Failed to acquire token using Client ID and Secret!" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Failed to resolve transaction %s (%s)" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Fee for %s" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Fee refund" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Fee reversal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Foreign bank withdrawal fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds available" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds not yet available" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds payable: PayPal-provided funds that must be paid back" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Funds receivable: PayPal-provided funds that are being paid back" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General PayPal debit card transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General PayPal-to-PayPal payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General account adjustment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General adjustment without business-related event" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General authorization" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General bonus" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General buyer credit payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General credit card deposit" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General credit card withdrawal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General currency conversion" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General dividend" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General funding of PayPal account" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General hold" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General hold release" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General incentive or certificate redemption" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General intra-account transfer" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General non-payment fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General reversal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General temporary hold" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General withdrawal from PayPal account" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "General withdrawal to non-bank institution" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument-funded payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument/Open Wallet reversals (buyer side)" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument/Open Wallet reversals (seller side)" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Generic instrument/Open Wallet transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate expiration fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate payment, purchase of gift certificate" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate purchase" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Gift certificate redemption" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Hidden virtual PayPal debit card transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Hold for dispute investigation" +msgstr "" + +#. module: account_statement_import_online_paypal +#: model:ir.model.fields,field_description:account_statement_import_online_paypal.field_online_bank_statement_provider__id +msgid "ID" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Incentive adjustment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Instant payment review (IPR) reversal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "International credit card withdrawal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Invalid token type!" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Invoice %s" +msgstr "" + +#. module: account_statement_import_online_paypal +#: model:ir.model.fields,field_description:account_statement_import_online_paypal.field_online_bank_statement_provider____last_update +msgid "Last Modified on" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MAM reversal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Mass payment batch fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MassPay payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MassPay refund transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "MassPay reversal transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Merchant referral account bonus" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Mobile payment, made through a mobile phone" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "No authentication specified!" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Non-reference credit payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Offers used as funding source" +msgstr "" + +#. module: account_statement_import_online_paypal +#: model:ir.model,name:account_statement_import_online_paypal.model_online_bank_statement_provider +msgid "Online Bank Statement Provider" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Other" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Partner fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal App features are configured incorrectly!" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal Checkout APIs" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal Here payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "" +"PayPal allows retrieving transactions only up to 3 years in the past. Please" +" import older transactions manually. See " +"https://www.paypal.com/us/smarthelp/article/why-can't-i-access-transaction-" +"history-greater-than-3-years-ts2241" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal balance manager funding of PayPal account" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal buyer credit payment funding" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal buyer warranty bonus" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal debit authorization" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal debit card cash advance" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "PayPal debit card withdrawal to ATM" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "" +"PayPal protection bonus, payout for PayPal buyer protection, payout for full" +" protection with PayPal buyer credit." +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment hold" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment hold release" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment refund, initiated by merchant" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment reversal, initiated by PayPal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment review hold" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Payment review release" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Points incentive redemption" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Postage payment to carrier" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Pre-approved payment (BillUser API)" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reauthorization" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Rebate or cash back reversal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Rebate payments" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reimbursement of chargeback" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reserve hold" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reserve release" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of ACH deposit" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of ACH withdrawal transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of debit card transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of general account hold" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Reversal of points usage" +msgstr "" + +#. module: account_statement_import_online_paypal +#: model_terms:ir.ui.view,arch_db:account_statement_import_online_paypal.online_bank_statement_provider_form +msgid "Secret" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Settlement consolidation" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Store-to-store transfers" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Subscription payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Temporary hold on available balance" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Third-party auction payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Third-party payout" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Third-party recoupment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transaction fee for %s" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transfer of funds from payable" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transfer to and from a credit-card-funded restricted balance" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Transfer to external GL entity" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Unknown authentication specified!" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Unknown error" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "User-initiated currency conversion" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Virtual PayPal debit card transaction" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Virtual terminal payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Void of authorization" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Warranty fee for warranty purchase" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Website payments standard payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "Website payments. Pro account monthly fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "WorldLink check withdrawal fee" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "WorldLink withdrawal" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "eBay auction payment" +msgstr "" + +#. module: account_statement_import_online_paypal +#: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "eBay loyalty incentive" +msgstr "" diff --git a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py index 0d6d9816..b4e00c67 100644 --- a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py +++ b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py @@ -292,11 +292,12 @@ class OnlineBankStatementProviderPayPal(models.Model): or "" ) line = { - "name": name, + "ref": name, "amount": str(total_amount), "date": date, - "note": note, + "payment_ref": note, "unique_import_id": unique_import_id, + "online_raw_data": transaction, } payer_full_name = payer_name.get("full_name") or payer_name.get( "alternate_full_name" @@ -307,12 +308,12 @@ class OnlineBankStatementProviderPayPal(models.Model): if fee_amount: lines += [ { - "name": _("Fee for %s") % (name or transaction_id), + "ref": _("Fee for %s") % (name or transaction_id), "amount": str(fee_amount), "date": date, "partner_name": "PayPal", "unique_import_id": "%s-FEE" % unique_import_id, - "note": _("Transaction fee for %s") % note, + "payment_ref": _("Transaction fee for %s") % note, } ] return lines @@ -400,7 +401,7 @@ class OnlineBankStatementProviderPayPal(models.Model): # NOTE: Workaround for INVALID_REQUEST (see ROADMAP.rst) invalid_data_workaround = self.env.context.get( - "test_account_bank_statement_import_online_paypal_monday", + "test_account_statement_import_online_paypal_monday", interval_start.weekday() == 0 and (datetime.utcnow() - interval_start).total_seconds() < 28800, ) diff --git a/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst b/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst index 724bc1d0..bbb62dfd 100644 --- a/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst +++ b/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst @@ -1,3 +1,4 @@ * `CorporateHub `__ * Alexey Pelykh +* Omar Castiñeira diff --git a/account_statement_import_online_paypal/static/description/index.html b/account_statement_import_online_paypal/static/description/index.html index 5a152d47..00a1f769 100644 --- a/account_statement_import_online_paypal/static/description/index.html +++ b/account_statement_import_online_paypal/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/bank-statement-import Translate me on Weblate Try me on Runbot

+

Beta License: AGPL-3 OCA/bank-statement-import Translate me on Weblate Try me on Runbot

This module provides online bank statements from PayPal.com.

Table of contents

@@ -449,7 +449,7 @@ behaviour in case #06650320 (private).

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.

+feedback.

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

@@ -467,6 +467,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
  • Alexey Pelykh <alexey.pelykh@corphub.eu>
  • +
  • Omar Castiñeira <omar@comunitea.com>
  • @@ -478,7 +479,7 @@ mission is to support the collaborative development of Odoo features and promote its widespread use.

    Current maintainer:

    alexey-pelykh

    -

    This module is part of the OCA/bank-statement-import project on GitHub.

    +

    This module is part of the OCA/bank-statement-import project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/account_statement_import_online_paypal/tests/__init__.py b/account_statement_import_online_paypal/tests/__init__.py index ca7b0d9c..89a0922e 100644 --- a/account_statement_import_online_paypal/tests/__init__.py +++ b/account_statement_import_online_paypal/tests/__init__.py @@ -1,3 +1,3 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from . import test_account_bank_statement_import_online_paypal +from . import test_account_statement_import_online_paypal diff --git a/account_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py similarity index 95% rename from account_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py rename to account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py index b2842d06..cc9ce800 100644 --- a/account_statement_import_online_paypal/tests/test_account_bank_statement_import_online_paypal.py +++ b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py @@ -14,7 +14,7 @@ from odoo import fields from odoo.exceptions import UserError from odoo.tests import common -_module_ns = "odoo.addons.account_bank_statement_import_online_paypal" +_module_ns = "odoo.addons.account_statement_import_online_paypal" _provider_class = ( _module_ns + ".models.online_bank_statement_provider_paypal" @@ -254,7 +254,7 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): side_effect=[mocked_response_1, mocked_response_2], ), self.mock_token(): data = provider.with_context( - test_account_bank_statement_import_online_paypal_monday=True, + test_account_statement_import_online_paypal_monday=True, )._obtain_statement_data( self.now - relativedelta(hours=1), self.now, @@ -535,13 +535,14 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): ) self.assertEqual(len(data[0]), 2) + del data[0][0]["online_raw_data"] self.assertEqual( data[0][0], { "date": datetime(2019, 8, 1), "amount": "1000.00", - "name": "Invoice 1", - "note": "1234567890: Payment for Invoice(s) 1", + "ref": "Invoice 1", + "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", "unique_import_id": "1234567890-1564617600", }, @@ -551,8 +552,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): { "date": datetime(2019, 8, 1), "amount": "-100.00", - "name": "Fee for Invoice 1", - "note": "Transaction fee for 1234567890: Payment for Invoice(s) 1", + "ref": "Fee for Invoice 1", + "payment_ref": "Transaction fee for 1234567890: Payment for Invoice(s) 1", "partner_name": "PayPal", "unique_import_id": "1234567890-1564617600-FEE", }, @@ -606,13 +607,14 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): }""" ) self.assertEqual(len(lines), 1) + del lines[0]["online_raw_data"] self.assertEqual( lines[0], { "date": datetime(2019, 8, 1), "amount": "1000.00", - "name": "Invoice 1", - "note": "1234567890: Payment for Invoice(s) 1", + "ref": "Invoice 1", + "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", "unique_import_id": "1234567890-1564617600", }, @@ -665,13 +667,14 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): }""" ) self.assertEqual(len(lines), 1) + del lines[0]["online_raw_data"] self.assertEqual( lines[0], { "date": datetime(2019, 8, 1), "amount": "1000.00", - "name": "Invoice 1", - "note": "1234567890: Payment for Invoice(s) 1", + "ref": "Invoice 1", + "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", "unique_import_id": "1234567890-1564617600", }, @@ -724,13 +727,14 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): }""" ) self.assertEqual(len(lines), 2) + del lines[0]["online_raw_data"] self.assertEqual( lines[0], { "date": datetime(2019, 8, 1), "amount": "1000.00", - "name": "Invoice 1", - "note": "1234567890: Payment for Invoice(s) 1", + "ref": "Invoice 1", + "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", "unique_import_id": "1234567890-1564617600", }, @@ -740,8 +744,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): { "date": datetime(2019, 8, 1), "amount": "-100.00", - "name": "Fee for Invoice 1", - "note": "Transaction fee for 1234567890: Payment for Invoice(s) 1", + "ref": "Fee for Invoice 1", + "payment_ref": "Transaction fee for 1234567890: Payment for Invoice(s) 1", "partner_name": "PayPal", "unique_import_id": "1234567890-1564617600-FEE", }, @@ -790,13 +794,14 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): }""" ) self.assertEqual(len(lines), 1) + del lines[0]["online_raw_data"] self.assertEqual( lines[0], { "date": datetime(2019, 8, 1), "amount": "1000.00", - "name": "Invoice 1", - "note": "1234567890: Payment for Invoice(s) 1", + "ref": "Invoice 1", + "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", "unique_import_id": "1234567890-1564617600", }, diff --git a/account_statement_import_online_paypal/views/online_bank_statement_provider.xml b/account_statement_import_online_paypal/views/online_bank_statement_provider.xml index 7d416cc0..fe5fe43d 100644 --- a/account_statement_import_online_paypal/views/online_bank_statement_provider.xml +++ b/account_statement_import_online_paypal/views/online_bank_statement_provider.xml @@ -9,11 +9,14 @@ online.bank.statement.provider - - + + Date: Mon, 8 Aug 2022 08:02:17 +0200 Subject: [PATCH 3/9] [FIX] account_statement_import_online_paypal: tests --- ..._account_statement_import_online_paypal.py | 142 ++++++++++++------ 1 file changed, 96 insertions(+), 46 deletions(-) diff --git a/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py index cc9ce800..c12b9890 100644 --- a/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py +++ b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py @@ -1,5 +1,5 @@ # Copyright 2019 Brainbean Apps (https://brainbeanapps.com) -# Copyright 2021 CorporateHub (https://corporatehub.eu) +# Copyright 2021-2022 CorporateHub (https://corporatehub.eu) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). import json @@ -54,6 +54,13 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): 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"] @@ -245,9 +252,13 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): } ], "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", @@ -333,13 +344,18 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): """{ "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 -}""", +}""" + % ( + self.now_isoformat, + self.now_isoformat, + self.now_isoformat, + ), parse_float=Decimal, ) mocked_response_2 = json.loads( @@ -363,9 +379,13 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): } ], "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, + ), parse_float=Decimal, ) with mock.patch( @@ -396,13 +416,18 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): """{ "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 -}""", +}""" + % ( + self.now_isoformat, + self.now_isoformat, + self.now_isoformat, + ), parse_float=Decimal, ) with mock.patch( @@ -435,8 +460,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "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" @@ -477,8 +502,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "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" @@ -516,13 +541,22 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "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 -}""", +}""" + % ( + 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( @@ -530,8 +564,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): return_value=mocked_response, ), self.mock_token(): data = provider._obtain_statement_data( - datetime(2019, 8, 1), - datetime(2019, 8, 2), + self.yesterday, + self.today, ) self.assertEqual(len(data[0]), 2) @@ -539,23 +573,23 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): self.assertEqual( data[0][0], { - "date": datetime(2019, 8, 1), + "date": self.yesterday, "amount": "1000.00", "ref": "Invoice 1", "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", - "unique_import_id": "1234567890-1564617600", + "unique_import_id": "1234567890-%s" % (self.yesterday_timestamp,), }, ) self.assertEqual( data[0][1], { - "date": datetime(2019, 8, 1), + "date": self.yesterday, "amount": "-100.00", "ref": "Fee for Invoice 1", "payment_ref": "Transaction fee for 1234567890: Payment for Invoice(s) 1", "partner_name": "PayPal", - "unique_import_id": "1234567890-1564617600-FEE", + "unique_import_id": "1234567890-%s-FEE" % (self.yesterday_timestamp,), }, ) self.assertEqual(data[1], {"balance_start": 0.0, "balance_end_real": 900.0}) @@ -567,8 +601,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "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,18 +639,22 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "auction_info": {}, "incentive_info": {} }""" + % ( + self.today_isoformat, + self.today_isoformat, + ) ) self.assertEqual(len(lines), 1) del lines[0]["online_raw_data"] self.assertEqual( lines[0], { - "date": datetime(2019, 8, 1), + "date": self.today, "amount": "1000.00", "ref": "Invoice 1", "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", - "unique_import_id": "1234567890-1564617600", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), }, ) @@ -627,8 +665,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "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" @@ -665,18 +703,22 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "auction_info": {}, "incentive_info": {} }""" + % ( + self.today_isoformat, + self.today_isoformat, + ) ) self.assertEqual(len(lines), 1) del lines[0]["online_raw_data"] self.assertEqual( lines[0], { - "date": datetime(2019, 8, 1), + "date": self.today, "amount": "1000.00", "ref": "Invoice 1", "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", - "unique_import_id": "1234567890-1564617600", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), }, ) @@ -687,8 +729,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "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" @@ -725,29 +767,33 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "auction_info": {}, "incentive_info": {} }""" + % ( + self.today_isoformat, + self.today_isoformat, + ) ) self.assertEqual(len(lines), 2) del lines[0]["online_raw_data"] self.assertEqual( lines[0], { - "date": datetime(2019, 8, 1), + "date": self.today, "amount": "1000.00", "ref": "Invoice 1", "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", - "unique_import_id": "1234567890-1564617600", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), }, ) self.assertEqual( lines[1], { - "date": datetime(2019, 8, 1), + "date": self.today, "amount": "-100.00", "ref": "Fee for Invoice 1", "payment_ref": "Transaction fee for 1234567890: Payment for Invoice(s) 1", "partner_name": "PayPal", - "unique_import_id": "1234567890-1564617600-FEE", + "unique_import_id": "1234567890-%s-FEE" % (self.today_timestamp,), }, ) @@ -758,8 +804,8 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "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" @@ -792,17 +838,21 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): "auction_info": {}, "incentive_info": {} }""" + % ( + self.today_isoformat, + self.today_isoformat, + ) ) self.assertEqual(len(lines), 1) del lines[0]["online_raw_data"] self.assertEqual( lines[0], { - "date": datetime(2019, 8, 1), + "date": self.today, "amount": "1000.00", "ref": "Invoice 1", "payment_ref": "1234567890: Payment for Invoice(s) 1", "partner_name": "Acme, Inc.", - "unique_import_id": "1234567890-1564617600", + "unique_import_id": "1234567890-%s" % (self.today_timestamp,), }, ) From 815fb99f20e456196e1f03a5ade2bc95d2f30212 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Mon, 8 Aug 2022 00:05:18 +0200 Subject: [PATCH 4/9] Add module account_statement_import_base The 2 modules account_statement_import_online and account_statement_import depend on account_statement_import_base (and not on each other) and share common code, in particular a hook to update the statement line. So we can now have reconciliation modules that use this hook and therefore work both on file import and online import. More details on https://github.com/OCA/bank-statement-import/issues/481. Improve bank statement line form view and journal form view. --- .../models/online_bank_statement_provider_paypal.py | 2 +- .../test_account_statement_import_online_paypal.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py index b4e00c67..388a167f 100644 --- a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py +++ b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py @@ -297,7 +297,7 @@ class OnlineBankStatementProviderPayPal(models.Model): "date": date, "payment_ref": note, "unique_import_id": unique_import_id, - "online_raw_data": transaction, + "raw_data": transaction, } payer_full_name = payer_name.get("full_name") or payer_name.get( "alternate_full_name" diff --git a/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py index c12b9890..8515cf9e 100644 --- a/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py +++ b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py @@ -569,7 +569,7 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): ) self.assertEqual(len(data[0]), 2) - del data[0][0]["online_raw_data"] + del data[0][0]["raw_data"] self.assertEqual( data[0][0], { @@ -645,7 +645,7 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): ) ) self.assertEqual(len(lines), 1) - del lines[0]["online_raw_data"] + del lines[0]["raw_data"] self.assertEqual( lines[0], { @@ -709,7 +709,7 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): ) ) self.assertEqual(len(lines), 1) - del lines[0]["online_raw_data"] + del lines[0]["raw_data"] self.assertEqual( lines[0], { @@ -773,7 +773,7 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): ) ) self.assertEqual(len(lines), 2) - del lines[0]["online_raw_data"] + del lines[0]["raw_data"] self.assertEqual( lines[0], { @@ -844,7 +844,7 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): ) ) self.assertEqual(len(lines), 1) - del lines[0]["online_raw_data"] + del lines[0]["raw_data"] self.assertEqual( lines[0], { From f4e1a399feac023a777371263be888da9c09e1c2 Mon Sep 17 00:00:00 2001 From: ikapasi Date: Wed, 25 May 2022 09:54:00 +0530 Subject: [PATCH 5/9] [MIG] account_bank_statement_import_online_paypal: Migration to 15.0 --- .../README.rst | 11 ++++---- .../__manifest__.py | 2 +- ...account_statement_import_online_paypal.pot | 28 ++++++++----------- .../online_bank_statement_provider_paypal.py | 18 ++++++++---- .../readme/CONTRIBUTORS.rst | 1 + .../static/description/index.html | 7 +++-- ..._account_statement_import_online_paypal.py | 16 ++++++++--- 7 files changed, 48 insertions(+), 35 deletions(-) diff --git a/account_statement_import_online_paypal/README.rst b/account_statement_import_online_paypal/README.rst index 396ba34c..2a01db0c 100644 --- a/account_statement_import_online_paypal/README.rst +++ b/account_statement_import_online_paypal/README.rst @@ -14,13 +14,13 @@ Online Bank Statements: PayPal.com :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fbank--statement--import-lightgray.png?logo=github - :target: https://github.com/OCA/bank-statement-import/tree/14.0/account_statement_import_online_paypal + :target: https://github.com/OCA/bank-statement-import/tree/15.0/account_statement_import_online_paypal :alt: OCA/bank-statement-import .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/bank-statement-import-14-0/bank-statement-import-14-0-account_statement_import_online_paypal + :target: https://translation.odoo-community.org/projects/bank-statement-import-15-0/bank-statement-import-15-0-account_statement_import_online_paypal :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/174/14.0 + :target: https://runbot.odoo-community.org/runbot/174/15.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -97,7 +97,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -116,6 +116,7 @@ Contributors * Alexey Pelykh * Omar Castiñeira +* isufi kapasi Maintainers ~~~~~~~~~~~ @@ -138,6 +139,6 @@ Current `maintainer `__: |maintainer-alexey-pelykh| -This module is part of the `OCA/bank-statement-import `_ project on GitHub. +This module is part of the `OCA/bank-statement-import `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/account_statement_import_online_paypal/__manifest__.py b/account_statement_import_online_paypal/__manifest__.py index 49547705..df2e9a19 100644 --- a/account_statement_import_online_paypal/__manifest__.py +++ b/account_statement_import_online_paypal/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Online Bank Statements: PayPal.com", - "version": "14.0.1.0.0", + "version": "15.0.1.0.0", "author": "CorporateHub, Odoo Community Association (OCA)", "maintainers": ["alexey-pelykh"], "website": "https://github.com/OCA/bank-statement-import", diff --git a/account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot b/account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot index c70d6430..2b3f6867 100644 --- a/account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot +++ b/account_statement_import_online_paypal/i18n/account_statement_import_online_paypal.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 15.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -215,11 +215,6 @@ msgstr "" msgid "Direct payment API" msgstr "" -#. module: account_statement_import_online_paypal -#: model:ir.model.fields,field_description:account_statement_import_online_paypal.field_online_bank_statement_provider__display_name -msgid "Display Name" -msgstr "" - #. module: account_statement_import_online_paypal #: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 #, python-format @@ -246,9 +241,18 @@ msgstr "" #. module: account_statement_import_online_paypal #: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 +#, python-format +msgid "" +"Failed to resolve transaction %(first_transaction_id)s " +"(%(first_transaction_date)s)" +msgstr "" + +#. module: account_statement_import_online_paypal #: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 #, python-format -msgid "Failed to resolve transaction %s (%s)" +msgid "" +"Failed to resolve transaction %(last_transaction_id)s " +"(%(last_transaction_date)s)" msgstr "" #. module: account_statement_import_online_paypal @@ -486,11 +490,6 @@ msgstr "" msgid "Hold for dispute investigation" msgstr "" -#. module: account_statement_import_online_paypal -#: model:ir.model.fields,field_description:account_statement_import_online_paypal.field_online_bank_statement_provider__id -msgid "ID" -msgstr "" - #. module: account_statement_import_online_paypal #: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 #, python-format @@ -521,11 +520,6 @@ msgstr "" msgid "Invoice %s" msgstr "" -#. module: account_statement_import_online_paypal -#: model:ir.model.fields,field_description:account_statement_import_online_paypal.field_online_bank_statement_provider____last_update -msgid "Last Modified on" -msgstr "" - #. module: account_statement_import_online_paypal #: code:addons/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py:0 #, python-format diff --git a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py index 388a167f..8665ac5c 100644 --- a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py +++ b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py @@ -230,8 +230,12 @@ class OnlineBankStatementProviderPayPal(models.Model): ) if not first_transaction: raise UserError( - _("Failed to resolve transaction %s (%s)") - % (first_transaction_id, first_transaction_date) + _( + "Failed to resolve transaction %(first_transaction_id)s " + "(%(first_transaction_date)s)", + first_transaction_id=first_transaction_id, + first_transaction_date=first_transaction_date, + ) ) balance_start = self._paypal_get_transaction_ending_balance(first_transaction) balance_start -= self._paypal_get_transaction_total_amount(first_transaction) @@ -245,8 +249,12 @@ class OnlineBankStatementProviderPayPal(models.Model): ) if not last_transaction: raise UserError( - _("Failed to resolve transaction %s (%s)") - % (last_transaction_id, last_transaction_date) + _( + "Failed to resolve transaction %(last_transaction_id)s " + "(%(last_transaction_date)s)", + last_transaction_id=last_transaction_id, + last_transaction_date=last_transaction_date, + ) ) balance_end = self._paypal_get_transaction_ending_balance(last_transaction) @@ -496,7 +504,7 @@ class OnlineBankStatementProviderPayPal(models.Model): "total_pages": 0, } - raise self._paypal_decode_error(content) or e + raise self._paypal_decode_error(content) or e from None return json.loads(content) @api.model diff --git a/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst b/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst index bbb62dfd..084cff53 100644 --- a/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst +++ b/account_statement_import_online_paypal/readme/CONTRIBUTORS.rst @@ -2,3 +2,4 @@ * Alexey Pelykh * Omar Castiñeira +* isufi kapasi diff --git a/account_statement_import_online_paypal/static/description/index.html b/account_statement_import_online_paypal/static/description/index.html index 00a1f769..7f215bbe 100644 --- a/account_statement_import_online_paypal/static/description/index.html +++ b/account_statement_import_online_paypal/static/description/index.html @@ -367,7 +367,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

    Beta License: AGPL-3 OCA/bank-statement-import Translate me on Weblate Try me on Runbot

    +

    Beta License: AGPL-3 OCA/bank-statement-import Translate me on Weblate Try me on Runbot

    This module provides online bank statements from PayPal.com.

    Table of contents

    @@ -449,7 +449,7 @@ behaviour in case #06650320 (private).

    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.

    +feedback.

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

    @@ -468,6 +468,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
  • Omar Castiñeira <omar@comunitea.com>
  • +
  • isufi kapasi <isufi.kapasi@initos.com>
  • @@ -479,7 +480,7 @@ mission is to support the collaborative development of Odoo features and promote its widespread use.

    Current maintainer:

    alexey-pelykh

    -

    This module is part of the OCA/bank-statement-import project on GitHub.

    +

    This module is part of the OCA/bank-statement-import project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py index 8515cf9e..ac082705 100644 --- a/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py +++ b/account_statement_import_online_paypal/tests/test_account_statement_import_online_paypal.py @@ -144,7 +144,9 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): _provider_class + "._paypal_retrieve", return_value=mocked_response, ): - with self.assertRaises(Exception): + with self.assertRaisesRegex( + UserError, "PayPal App features are configured incorrectly!" + ): provider._paypal_get_token() def test_bad_token_type(self): @@ -175,7 +177,7 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): _provider_class + "._paypal_retrieve", return_value=mocked_response, ): - with self.assertRaises(Exception): + with self.assertRaisesRegex(UserError, "Invalid token type!"): provider._paypal_get_token() def test_no_token(self): @@ -205,7 +207,9 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): _provider_class + "._paypal_retrieve", return_value=mocked_response, ): - with self.assertRaises(Exception): + with self.assertRaisesRegex( + UserError, "Failed to acquire token using Client ID and Secret!" + ): provider._paypal_get_token() def test_no_data_on_monday(self): @@ -434,7 +438,11 @@ class TestAccountBankAccountStatementImportOnlinePayPal(common.TransactionCase): _provider_class + "._paypal_retrieve", return_value=mocked_response, ), self.mock_token(): - with self.assertRaises(Exception): + with self.assertRaisesRegex( + UserError, + "PayPal allows retrieving transactions only up to 3 years in " + "the past. Please import older transactions manually.", + ): provider._obtain_statement_data( self.now - relativedelta(years=5), self.now, From 48a03bdd7176ee528915f089ab33848944cfc13e Mon Sep 17 00:00:00 2001 From: Ken Woychesko Date: Sun, 30 Apr 2023 10:34:46 -0400 Subject: [PATCH 6/9] [FIX] account_statement_import_online_paypal: Update CONFIGURE, USAGE, and ROADMAP to current Odoo & PayPal menus/procedures/links. (1) Odoo's menu has changed over the recent versions, and these changes help new users to better understand how to create a PayPal-related Bank Account/Journal and configuration for syncing with PayPal's servers. (2) The order of CONFIGURE was changed to the logical flow of obtaining PayPal credentials first and then configuring Odoo to match. (3) PayPal's URL for transaction definitions has changed and was updated in ROADMAP. --- .../README.rst | 69 ++++++++++-------- .../__manifest__.py | 2 +- .../readme/CONFIGURE.rst | 59 +++++++++------- .../readme/ROADMAP.rst | 2 +- .../readme/USAGE.rst | 8 +-- .../static/description/index.html | 70 +++++++++++-------- 6 files changed, 118 insertions(+), 92 deletions(-) diff --git a/account_statement_import_online_paypal/README.rst b/account_statement_import_online_paypal/README.rst index 2a01db0c..2ab7b118 100644 --- a/account_statement_import_online_paypal/README.rst +++ b/account_statement_import_online_paypal/README.rst @@ -36,45 +36,54 @@ This module provides online bank statements from Configuration ============= -To configure online bank statements provider: +You will need a *Client ID* and *Secret* from PayPal to communicate with the PayPal API. To obtain your PayPal API +*Client ID* and *Secret*: -#. Go to *Invoicing > Configuration > Bank Accounts* -#. Open bank account to configure and edit it -#. Set *Bank Feeds* to *Online* -#. Select *PayPal.com* as online bank statements provider in - *Online Bank Statements (OCA)* section -#. Save the bank account -#. Click on provider and configure provider-specific settings. +#. Open `PayPal Developer `_. +#. Login with your *PayPal for Business* account (upgrade your personal account to + a Business Account, if required). +#. Go to *Apps & Credentials* and switch to *Live*. +#. Under *REST API apps*, click *Create App* to begin creating a new application. +#. Enter a descriptive name for your app (e.g. *Odoo-Statements*) and click *Create App*. +#. Copy the *Client ID* and *Secret* to use during provider configuration (instructions below). +#. Under *Features*, uncheck all optional features except *Transaction Search*. +#. Click *Save Changes*. -or, alternatively: +To configure PayPal as an online bank statement provider, you will need to create a Bank Account & Journal that +corresponds to your *PayPal for Business* account, and then configure the *PayPal.com* provider with the *Client ID* +and *Secret* obtained above: -#. Go to *Invoicing > Overview* -#. Open settings of the corresponding journal account -#. Switch to *Bank Account* tab -#. Set *Bank Feeds* to *Online* -#. Select *PayPal.com* as online bank statements provider in - *Online Bank Statements (OCA)* section -#. Save the bank account -#. Click on provider and configure provider-specific settings. +#. Go to *Invoicing > Configuration > Banks > Add a Bank Account*. +#. In the *Account Number* field, enter some descriptive text for the account, such as the email address or *PayPal + Merchant ID* of your *PayPal for Business* account. NOTE: This *Account Number* is not used in the authentication + with PayPal's API, and is only used to distinguish this PayPal Bank Account/Journal from others you may have + configured. +#. Fill in the other fields for the Bank Account if desired, and then click *Create*. +#. Go to *Invoicing > Configuration > Accounting > Journals*. +#. Open and *Edit* the Journal corresponding to the PayPal bank account (this Journal was created automatically + when you created the Bank Account above. +#. Set *Bank Feeds* to *Online (OCA)*. +#. Select *PayPal.com* as the provider in the *Online Bank Statements (OCA)* section. +#. *Save* the Journal. +#. To configure provider-specific settings, click on the provider to open it and click *Edit*. +#. Fill in your desired *Configuration* and *Scheduled Pull* settings. +#. Leave the *API base* field empty, and fill in the *Client ID* and *Secret* from your PayPal + Developer account. +#. Click *Save*. -To obtain *Client ID* and *Secret*: - -#. Open `PayPal Developer `_ -#. Go to *My Apps & Credentials* and switch to *Live* -#. Under *REST API apps*, click *Create App* to create new application (e.g. *Odoo*) -#. Copy *Client ID* and *Secret* to use during provider configuration -#. Under *Live App Settings*, uncheck all features except *Transaction Search* -#. Click Save +NOTE: For development and testing purposes, you can create Sandbox credentials associated with your *PayPal +for Business* account. When configuring the provider-specific settings, enter the following in the *API base* field: +https://api.sandbox.paypal.com Usage ===== To pull historical bank statements: -#. Go to *Invoicing > Configuration > Bank Accounts* -#. Select specific bank accounts -#. Launch *Actions > Online Bank Statements Pull Wizard* -#. Configure date interval and click *Pull* +#. Go to *Invoicing > Configuration > Accounting > Journals*. +#. Open the Journal corresponding to the PayPal bank account. +#. Click the *Pull Online Bank Statement* button. +#. Configure a date interval and click *Pull*. Known issues / Roadmap ====================== @@ -83,7 +92,7 @@ Known issues / Roadmap can be imported manually, see ``account_bank_statement_import_paypal``. See `PayPal Help Center article `_ for details. -* `PayPal Transaction Info `_ +* `PayPal Transaction Info `_ defines extra fields like ``tip_amount``, ``shipping_amount``, etc. that could be useful to be decomposed from a single transaction. * There's a known issue with PayPal API that on every Monday for couple of diff --git a/account_statement_import_online_paypal/__manifest__.py b/account_statement_import_online_paypal/__manifest__.py index df2e9a19..af7870d3 100644 --- a/account_statement_import_online_paypal/__manifest__.py +++ b/account_statement_import_online_paypal/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Online Bank Statements: PayPal.com", - "version": "15.0.1.0.0", + "version": "15.0.1.1.0", "author": "CorporateHub, Odoo Community Association (OCA)", "maintainers": ["alexey-pelykh"], "website": "https://github.com/OCA/bank-statement-import", diff --git a/account_statement_import_online_paypal/readme/CONFIGURE.rst b/account_statement_import_online_paypal/readme/CONFIGURE.rst index 67b44183..0eb6ef95 100644 --- a/account_statement_import_online_paypal/readme/CONFIGURE.rst +++ b/account_statement_import_online_paypal/readme/CONFIGURE.rst @@ -1,29 +1,38 @@ -To configure online bank statements provider: +You will need a *Client ID* and *Secret* from PayPal to communicate with the PayPal API. To obtain your PayPal API +*Client ID* and *Secret*: -#. Go to *Invoicing > Configuration > Bank Accounts* -#. Open bank account to configure and edit it -#. Set *Bank Feeds* to *Online* -#. Select *PayPal.com* as online bank statements provider in - *Online Bank Statements (OCA)* section -#. Save the bank account -#. Click on provider and configure provider-specific settings. +#. Open `PayPal Developer `_. +#. Login with your *PayPal for Business* account (upgrade your personal account to + a Business Account, if required). +#. Go to *Apps & Credentials* and switch to *Live*. +#. Under *REST API apps*, click *Create App* to begin creating a new application. +#. Enter a descriptive name for your app (e.g. *Odoo-Statements*) and click *Create App*. +#. Copy the *Client ID* and *Secret* to use during provider configuration (instructions below). +#. Under *Features*, uncheck all optional features except *Transaction Search*. +#. Click *Save Changes*. -or, alternatively: +To configure PayPal as an online bank statement provider, you will need to create a Bank Account & Journal that +corresponds to your *PayPal for Business* account, and then configure the *PayPal.com* provider with the *Client ID* +and *Secret* obtained above: -#. Go to *Invoicing > Overview* -#. Open settings of the corresponding journal account -#. Switch to *Bank Account* tab -#. Set *Bank Feeds* to *Online* -#. Select *PayPal.com* as online bank statements provider in - *Online Bank Statements (OCA)* section -#. Save the bank account -#. Click on provider and configure provider-specific settings. +#. Go to *Invoicing > Configuration > Banks > Add a Bank Account*. +#. In the *Account Number* field, enter some descriptive text for the account, such as the email address or *PayPal + Merchant ID* of your *PayPal for Business* account. NOTE: This *Account Number* is not used in the authentication + with PayPal's API, and is only used to distinguish this PayPal Bank Account/Journal from others you may have + configured. +#. Fill in the other fields for the Bank Account if desired, and then click *Create*. +#. Go to *Invoicing > Configuration > Accounting > Journals*. +#. Open and *Edit* the Journal corresponding to the PayPal bank account (this Journal was created automatically + when you created the Bank Account above. +#. Set *Bank Feeds* to *Online (OCA)*. +#. Select *PayPal.com* as the provider in the *Online Bank Statements (OCA)* section. +#. *Save* the Journal. +#. To configure provider-specific settings, click on the provider to open it and click *Edit*. +#. Fill in your desired *Configuration* and *Scheduled Pull* settings. +#. Leave the *API base* field empty, and fill in the *Client ID* and *Secret* from your PayPal + Developer account. +#. Click *Save*. -To obtain *Client ID* and *Secret*: - -#. Open `PayPal Developer `_ -#. Go to *My Apps & Credentials* and switch to *Live* -#. Under *REST API apps*, click *Create App* to create new application (e.g. *Odoo*) -#. Copy *Client ID* and *Secret* to use during provider configuration -#. Under *Live App Settings*, uncheck all features except *Transaction Search* -#. Click Save +NOTE: For development and testing purposes, you can create Sandbox credentials associated with your *PayPal +for Business* account. When configuring the provider-specific settings, enter the following in the *API base* field: +https://api.sandbox.paypal.com diff --git a/account_statement_import_online_paypal/readme/ROADMAP.rst b/account_statement_import_online_paypal/readme/ROADMAP.rst index f6968426..1ae1c3f0 100644 --- a/account_statement_import_online_paypal/readme/ROADMAP.rst +++ b/account_statement_import_online_paypal/readme/ROADMAP.rst @@ -2,7 +2,7 @@ can be imported manually, see ``account_bank_statement_import_paypal``. See `PayPal Help Center article `_ for details. -* `PayPal Transaction Info `_ +* `PayPal Transaction Info `_ defines extra fields like ``tip_amount``, ``shipping_amount``, etc. that could be useful to be decomposed from a single transaction. * There's a known issue with PayPal API that on every Monday for couple of diff --git a/account_statement_import_online_paypal/readme/USAGE.rst b/account_statement_import_online_paypal/readme/USAGE.rst index 03845f13..d88d0b05 100644 --- a/account_statement_import_online_paypal/readme/USAGE.rst +++ b/account_statement_import_online_paypal/readme/USAGE.rst @@ -1,6 +1,6 @@ To pull historical bank statements: -#. Go to *Invoicing > Configuration > Bank Accounts* -#. Select specific bank accounts -#. Launch *Actions > Online Bank Statements Pull Wizard* -#. Configure date interval and click *Pull* +#. Go to *Invoicing > Configuration > Accounting > Journals*. +#. Open the Journal corresponding to the PayPal bank account. +#. Click the *Pull Online Bank Statement* button. +#. Configure a date interval and click *Pull*. diff --git a/account_statement_import_online_paypal/static/description/index.html b/account_statement_import_online_paypal/static/description/index.html index 7f215bbe..af8636c0 100644 --- a/account_statement_import_online_paypal/static/description/index.html +++ b/account_statement_import_online_paypal/static/description/index.html @@ -387,45 +387,53 @@ ul.auto-toc {

    Configuration

    -

    To configure online bank statements provider:

    +

    You will need a Client ID and Secret from PayPal to communicate with the PayPal API. To obtain your PayPal API +Client ID and Secret:

      -
    1. Go to Invoicing > Configuration > Bank Accounts
    2. -
    3. Open bank account to configure and edit it
    4. -
    5. Set Bank Feeds to Online
    6. -
    7. Select PayPal.com as online bank statements provider in -Online Bank Statements (OCA) section
    8. -
    9. Save the bank account
    10. -
    11. Click on provider and configure provider-specific settings.
    12. +
    13. Open PayPal Developer.
    14. +
    15. Login with your PayPal for Business account (upgrade your personal account to +a Business Account, if required).
    16. +
    17. Go to Apps & Credentials and switch to Live.
    18. +
    19. Under REST API apps, click Create App to begin creating a new application.
    20. +
    21. Enter a descriptive name for your app (e.g. Odoo-Statements) and click Create App.
    22. +
    23. Copy the Client ID and Secret to use during provider configuration (instructions below).
    24. +
    25. Under Features, uncheck all optional features except Transaction Search.
    26. +
    27. Click Save Changes.
    -

    or, alternatively:

    +

    To configure PayPal as an online bank statement provider, you will need to create a Bank Account & Journal that +corresponds to your PayPal for Business account, and then configure the PayPal.com provider with the Client ID +and Secret obtained above:

      -
    1. Go to Invoicing > Overview
    2. -
    3. Open settings of the corresponding journal account
    4. -
    5. Switch to Bank Account tab
    6. -
    7. Set Bank Feeds to Online
    8. -
    9. Select PayPal.com as online bank statements provider in -Online Bank Statements (OCA) section
    10. -
    11. Save the bank account
    12. -
    13. Click on provider and configure provider-specific settings.
    14. -
    -

    To obtain Client ID and Secret:

    -
      -
    1. Open PayPal Developer
    2. -
    3. Go to My Apps & Credentials and switch to Live
    4. -
    5. Under REST API apps, click Create App to create new application (e.g. Odoo)
    6. -
    7. Copy Client ID and Secret to use during provider configuration
    8. -
    9. Under Live App Settings, uncheck all features except Transaction Search
    10. -
    11. Click Save
    12. +
    13. Go to Invoicing > Configuration > Banks > Add a Bank Account.
    14. +
    15. In the Account Number field, enter some descriptive text for the account, such as the email address or PayPal +Merchant ID of your PayPal for Business account. NOTE: This Account Number is not used in the authentication +with PayPal’s API, and is only used to distinguish this PayPal Bank Account/Journal from others you may have +configured.
    16. +
    17. Fill in the other fields for the Bank Account if desired, and then click Create.
    18. +
    19. Go to Invoicing > Configuration > Accounting > Journals.
    20. +
    21. Open and Edit the Journal corresponding to the PayPal bank account (this Journal was created automatically +when you created the Bank Account above.
    22. +
    23. Set Bank Feeds to Online (OCA).
    24. +
    25. Select PayPal.com as the provider in the Online Bank Statements (OCA) section.
    26. +
    27. Save the Journal.
    28. +
    29. To configure provider-specific settings, click on the provider to open it and click Edit.
    30. +
    31. Fill in your desired Configuration and Scheduled Pull settings.
    32. +
    33. Leave the API base field empty, and fill in the Client ID and Secret from your PayPal +Developer account.
    34. +
    35. Click Save.
    +

    NOTE: For development and testing purposes, you can create Sandbox credentials associated with your PayPal +for Business account. When configuring the provider-specific settings, enter the following in the API base field: +https://api.sandbox.paypal.com

    Usage

    To pull historical bank statements:

      -
    1. Go to Invoicing > Configuration > Bank Accounts
    2. -
    3. Select specific bank accounts
    4. -
    5. Launch Actions > Online Bank Statements Pull Wizard
    6. -
    7. Configure date interval and click Pull
    8. +
    9. Go to Invoicing > Configuration > Accounting > Journals.
    10. +
    11. Open the Journal corresponding to the PayPal bank account.
    12. +
    13. Click the Pull Online Bank Statement button.
    14. +
    15. Configure a date interval and click Pull.
    @@ -435,7 +443,7 @@ ul.auto-toc { can be imported manually, see account_bank_statement_import_paypal. See PayPal Help Center article for details. -
  • PayPal Transaction Info +
  • PayPal Transaction Info defines extra fields like tip_amount, shipping_amount, etc. that could be useful to be decomposed from a single transaction.
  • There’s a known issue with PayPal API that on every Monday for couple of From 6cce830d7e36943c3e0eccb812900e19b9b690ab Mon Sep 17 00:00:00 2001 From: Ken Woychesko Date: Wed, 3 May 2023 17:06:06 -0400 Subject: [PATCH 7/9] [FIX] account_statement_import_online_paypal: force observance of "Allow Empty Statements" provider setting Empty statements should only be created if "Allow Empty Statements" is checked. This commit adds a check for the state of the allow_empty_statements field. --- .../README.rst | 15 ++-- .../__manifest__.py | 2 +- .../online_bank_statement_provider_paypal.py | 7 +- .../static/description/index.html | 48 ++++++----- ..._account_statement_import_online_paypal.py | 83 ++++++++++++++++++- 5 files changed, 121 insertions(+), 34 deletions(-) diff --git a/account_statement_import_online_paypal/README.rst b/account_statement_import_online_paypal/README.rst index 2ab7b118..3b3112be 100644 --- a/account_statement_import_online_paypal/README.rst +++ b/account_statement_import_online_paypal/README.rst @@ -2,10 +2,13 @@ Online Bank Statements: PayPal.com ================================== -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:26af4e5288afb6f7af8bd84132925bd6dea1bf3bbb77c739000c747423e4dc9e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status @@ -19,11 +22,11 @@ Online Bank Statements: PayPal.com .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png :target: https://translation.odoo-community.org/projects/bank-statement-import-15-0/bank-statement-import-15-0-account_statement_import_online_paypal :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/174/15.0 - :alt: Try me on Runbot +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/bank-statement-import&target_branch=15.0 + :alt: Try me on Runboat -|badge1| |badge2| |badge3| |badge4| |badge5| +|badge1| |badge2| |badge3| |badge4| |badge5| This module provides online bank statements from `PayPal.com `__. @@ -105,7 +108,7 @@ 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 +If you spotted it first, help us to smash it by providing a detailed and welcomed `feedback `_. Do not contact contributors directly about support or help with technical issues. diff --git a/account_statement_import_online_paypal/__manifest__.py b/account_statement_import_online_paypal/__manifest__.py index af7870d3..d4b785bd 100644 --- a/account_statement_import_online_paypal/__manifest__.py +++ b/account_statement_import_online_paypal/__manifest__.py @@ -4,7 +4,7 @@ { "name": "Online Bank Statements: PayPal.com", - "version": "15.0.1.1.0", + "version": "15.0.1.1.1", "author": "CorporateHub, Odoo Community Association (OCA)", "maintainers": ["alexey-pelykh"], "website": "https://github.com/OCA/bank-statement-import", diff --git a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py index 8665ac5c..b48b3991 100644 --- a/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py +++ b/account_statement_import_online_paypal/models/online_bank_statement_provider_paypal.py @@ -206,8 +206,11 @@ class OnlineBankStatementProviderPayPal(models.Model): token, currency, date_since, date_until ) if not transactions: - balance = self._paypal_get_balance(token, currency, date_since) - return [], {"balance_start": balance, "balance_end_real": balance} + if self.allow_empty_statements: + balance = self._paypal_get_balance(token, currency, date_since) + return [], {"balance_start": balance, "balance_end_real": balance} + else: + return None # Normalize transactions, sort by date, and get lines transactions = list( diff --git a/account_statement_import_online_paypal/static/description/index.html b/account_statement_import_online_paypal/static/description/index.html index af8636c0..8b3c341a 100644 --- a/account_statement_import_online_paypal/static/description/index.html +++ b/account_statement_import_online_paypal/static/description/index.html @@ -1,20 +1,20 @@ - + - + Online Bank Statements: PayPal.com