From bc7a549fdba0f76eb9d40043b677d65cf6cdf3ed Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Thu, 1 Mar 2018 06:29:21 +0100 Subject: [PATCH] Gocardless integration (#13008) * GoCardless integration * Addition of a method for determining if the email should be sent or not * Correction for Tests * Codacy fix * Documents moved to ERPNext * Codacy fix * Codacy fixes * Remove method where not necessary and replace with hasattr --- .../payment_request/payment_request.py | 12 +- erpnext/config/erpnext_integrations.py | 22 ++ .../setup/integrations/gocardless_account.png | Bin 0 -> 26277 bytes .../img/setup/integrations/gocardless_coa.png | Bin 0 -> 32752 bytes .../payment_gateway_account_gocardless.png | Bin 0 -> 84860 bytes .../integrations/gocardless-integration.md | 44 ++++ .../erpnext_integrations/doctype/__init__.py | 0 .../doctype/gocardless_mandate/__init__.py | 0 .../gocardless_mandate/gocardless_mandate.js | 5 + .../gocardless_mandate.json | 184 +++++++++++++++ .../gocardless_mandate/gocardless_mandate.py | 9 + .../test_gocardless_mandate.js | 23 ++ .../test_gocardless_mandate.py | 9 + .../doctype/gocardless_settings/__init__.py | 70 ++++++ .../gocardless_settings.js | 5 + .../gocardless_settings.json | 212 ++++++++++++++++++ .../gocardless_settings.py | 183 +++++++++++++++ .../test_gocardless_settings.js | 23 ++ .../test_gocardless_settings.py | 9 + .../integrations/gocardless_checkout.js | 24 ++ .../integrations/gocardless_confirmation.js | 24 ++ .../templates/pages/integrations/__init__.py | 0 .../integrations/gocardless_checkout.html | 16 ++ .../pages/integrations/gocardless_checkout.py | 76 +++++++ .../integrations/gocardless_confirmation.html | 16 ++ .../integrations/gocardless_confirmation.py | 85 +++++++ requirements.txt | 1 + 27 files changed, 1051 insertions(+), 1 deletion(-) create mode 100644 erpnext/config/erpnext_integrations.py create mode 100644 erpnext/docs/assets/img/setup/integrations/gocardless_account.png create mode 100644 erpnext/docs/assets/img/setup/integrations/gocardless_coa.png create mode 100644 erpnext/docs/assets/img/setup/integrations/payment_gateway_account_gocardless.png create mode 100644 erpnext/docs/user/manual/en/setting-up/integrations/gocardless-integration.md create mode 100644 erpnext/erpnext_integrations/doctype/__init__.py create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_mandate/__init__.py create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.js create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.json create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.py create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.js create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.py create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.js create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.json create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.js create mode 100644 erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.py create mode 100644 erpnext/templates/includes/integrations/gocardless_checkout.js create mode 100644 erpnext/templates/includes/integrations/gocardless_confirmation.js create mode 100644 erpnext/templates/pages/integrations/__init__.py create mode 100644 erpnext/templates/pages/integrations/gocardless_checkout.html create mode 100644 erpnext/templates/pages/integrations/gocardless_checkout.py create mode 100644 erpnext/templates/pages/integrations/gocardless_confirmation.html create mode 100644 erpnext/templates/pages/integrations/gocardless_confirmation.py diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py index 57ead282ad..2692f3ce47 100644 --- a/erpnext/accounts/doctype/payment_request/payment_request.py +++ b/erpnext/accounts/doctype/payment_request/payment_request.py @@ -34,7 +34,7 @@ class PaymentRequest(Document): frappe.throw(_("Transaction currency must be same as Payment Gateway currency")) def on_submit(self): - send_mail = True + send_mail = self.payment_gateway_validation() ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name) if (hasattr(ref_doc, "order_type") and getattr(ref_doc, "order_type") == "Shopping Cart") \ @@ -58,6 +58,16 @@ class PaymentRequest(Document): si = si.insert(ignore_permissions=True) si.submit() + def payment_gateway_validation(self): + try: + controller = get_payment_gateway_controller(self.payment_gateway) + if hasattr(controller, 'on_payment_request_submission'): + return controller.on_payment_request_submission(self) + else: + return True + except Exception: + return False + def set_payment_request_url(self): if self.payment_account: self.payment_url = self.get_payment_url() diff --git a/erpnext/config/erpnext_integrations.py b/erpnext/config/erpnext_integrations.py new file mode 100644 index 0000000000..22a01a6ada --- /dev/null +++ b/erpnext/config/erpnext_integrations.py @@ -0,0 +1,22 @@ +from __future__ import unicode_literals +from frappe import _ + +def get_data(): + return [ + { + "label": _("Payments"), + "icon": "fa fa-star", + "items": [ + { + "type": "doctype", + "name": "GoCardless Settings", + "description": _("GoCardless payment gateway settings"), + }, + { + "type": "doctype", + "name": "GoCardless Mandate", + "description": _("GoCardless SEPA Mandate"), + } + ] + } + ] diff --git a/erpnext/docs/assets/img/setup/integrations/gocardless_account.png b/erpnext/docs/assets/img/setup/integrations/gocardless_account.png new file mode 100644 index 0000000000000000000000000000000000000000..db6bcc94fb04ee947ffcb85654acafaa6ff238ce GIT binary patch literal 26277 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 literal 0 HcmV?d00001 diff --git a/erpnext/docs/assets/img/setup/integrations/gocardless_coa.png b/erpnext/docs/assets/img/setup/integrations/gocardless_coa.png new file mode 100644 index 0000000000000000000000000000000000000000..17b5f59964b942e37ed8f2a340f0ff5f09b4453c GIT binary patch literal 32752 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 Integrations > GoCardless Settings` + +## Setup GoCardless + +To enable GoCardless in your ERPNext account, you need to configure the following parameters and Access Token and optionally (but highly recommended), a Webhooks Secret key. + + +You can setup several GoCardless payment gateways if needed. The choice of payment gateway account will determine which GoCardless account is used for the payment. + +![GoCardless Settings](/docs/assets/img/setup/integrations/gocardless_account.png) + +On enabling service, the system will create a Payment Gateway record and an Account head in chart of account with account type as Bank. + +![GoCardless COA](/docs/assets/img/setup/integrations/gocardless_coa.png) + +It will also create a payment gateway account. You can change the default bank account if needed and create a template for the payment request. + +![Payment Gateway Account](/docs/assets/img/setup/integrations/payment_gateway_account_gocardless.png) + +After configuring the Payment Gateway Account, your system is able to accept online payments through GoCardless. + +## SEPA Payments Flow + +When a new payment SEPA payment in initiated, the customer is asked to enter his IBAN (or local account number) and to validate a SEPA mandate. + +Upon validation of the mandate, a payment request is sent to GoCardless and processed. + +If the customer has already a valid SEPA mandate, when instead of sending a payment request to the customer, the payment request is directly sent to GoCardless without the need for the customer to validate it. +The customer will only receive a confirmation email from GoCardless informing him that a payment has been processed. + + +## Mandate cancellation + +You can setup a Webhook in GoCardless to automatically disabled cancelled or expired mandates in ERPNext. + +The Endpoint URL of your webhook should be: https://yoursite.com/api/method/erpnext.erpnext_integrations.doctype.gocardless_settings.webhooks + +In this case do not forget to configure your Webhooks Secret Key in your GoCardless account settings in ERPNext. + + +## Supported transaction currencies + "EUR", "DKK", "GBP", "SEK" diff --git a/erpnext/erpnext_integrations/doctype/__init__.py b/erpnext/erpnext_integrations/doctype/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/erpnext_integrations/doctype/gocardless_mandate/__init__.py b/erpnext/erpnext_integrations/doctype/gocardless_mandate/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.js b/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.js new file mode 100644 index 0000000000..37f9f7b9df --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.js @@ -0,0 +1,5 @@ +// Copyright (c) 2018, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('GoCardless Mandate', { +}); diff --git a/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.json b/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.json new file mode 100644 index 0000000000..edf652c8f3 --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.json @@ -0,0 +1,184 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:mandate", + "beta": 0, + "creation": "2018-02-08 11:33:15.721919", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "disabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Disabled", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "customer", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Customer", + "length": 0, + "no_copy": 0, + "options": "Customer", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "mandate", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Mandate", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "gocardless_customer", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "GoCardless Customer", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-02-11 12:28:03.183095", + "modified_by": "Administrator", + "module": "ERPNext Integrations", + "name": "GoCardless Mandate", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} diff --git a/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.py b/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.py new file mode 100644 index 0000000000..9c9df65314 --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_mandate/gocardless_mandate.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +from frappe.model.document import Document + +class GoCardlessMandate(Document): + pass diff --git a/erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.js b/erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.js new file mode 100644 index 0000000000..caa9399eb6 --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: GoCardless Mandate", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new GoCardless Mandate + () => frappe.tests.make('GoCardless Mandate', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.py b/erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.py new file mode 100644 index 0000000000..d77a352cdb --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_mandate/test_gocardless_mandate.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +import unittest + +class TestGoCardlessMandate(unittest.TestCase): + pass diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py b/erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py new file mode 100644 index 0000000000..25784a5620 --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/__init__.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +import json +import hmac +import hashlib + +@frappe.whitelist(allow_guest=True) +def webhooks(): + r = frappe.request + if not r: + return + + if not authenticate_signature(r): + raise frappe.AuthenticationError + + gocardless_events = json.loads(r.get_data()) or [] + for event in gocardless_events["events"]: + set_status(event) + + return 200 +def set_status(event): + resource_type = event.get("resource_type", {}) + + if resource_type == "mandates": + set_mandate_status(event) + +def set_mandate_status(event): + mandates = [] + if isinstance(event["links"], (list,)): + for link in event["links"]: + mandates.append(link["mandate"]) + else: + mandates.append(event["links"]["mandate"]) + + if event["action"] == "pending_customer_approval" or event["action"] == "pending_submission" or event["action"] == "submitted" or event["action"] == "active": + disabled = 0 + else: + disabled = 1 + + for mandate in mandates: + frappe.db.set_value("GoCardless Mandate", mandate, "disabled", disabled) + +def authenticate_signature(r): + """Returns True if the received signature matches the generated signature""" + received_signature = frappe.get_request_header("Webhook-Signature") + + if not received_signature: + return False + + for key in get_webhook_keys(): + computed_signature = hmac.new(key.encode("utf-8"), r.get_data(), hashlib.sha256).hexdigest() + if hmac.compare_digest(str(received_signature), computed_signature): + return True + + return False + +def get_webhook_keys(): + def _get_webhook_keys(): + webhook_keys = [d.webhooks_secret for d in frappe.get_all("GoCardless Settings", fields=["webhooks_secret"],) if d.webhooks_secret] + + return webhook_keys + + return frappe.cache().get_value("gocardless_webhooks_secret", _get_webhook_keys) + +def clear_cache(): + frappe.cache().delete_value("gocardless_webhooks_secret") diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.js b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.js new file mode 100644 index 0000000000..b649d9d6cc --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.js @@ -0,0 +1,5 @@ +// Copyright (c) 2018, Frappe Technologies and contributors +// For license information, please see license.txt + +frappe.ui.form.on('GoCardless Settings', { +}); diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.json b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.json new file mode 100644 index 0000000000..9738106a30 --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.json @@ -0,0 +1,212 @@ +{ + "allow_copy": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:gateway_name", + "beta": 0, + "creation": "2018-02-06 16:11:10.028249", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "gateway_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Payment Gateway Name", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_2", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "access_token", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Access Token", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "webhooks_secret", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Webhooks Secret", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "use_sandbox", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Use Sandbox", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2018-02-12 14:18:47.209114", + "modified_by": "Administrator", + "module": "ERPNext Integrations", + "name": "GoCardless Settings", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_changes": 1, + "track_seen": 0 +} diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py new file mode 100644 index 0000000000..af15cf58d0 --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/gocardless_settings.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document +import gocardless_pro +from frappe import _ +from six.moves.urllib.parse import urlencode +from frappe.utils import get_url, call_hook_method, flt, cint +from frappe.integrations.utils import create_request_log, create_payment_gateway + +class GoCardlessSettings(Document): + supported_currencies = ["EUR", "DKK", "GBP", "SEK"] + + def validate(self): + self.initialize_client() + + def initialize_client(self): + self.environment = self.get_environment() + try: + self.client = gocardless_pro.Client( + access_token=self.access_token, + environment=self.environment + ) + return self.client + except Exception as e: + frappe.throw(e) + + def on_update(self): + create_payment_gateway('GoCardless-' + self.gateway_name, settings='GoCardLess Settings', controller=self.gateway_name) + call_hook_method('payment_gateway_enabled', gateway='GoCardless-' + self.gateway_name) + + def on_payment_request_submission(self, data): + if data.reference_doctype != "Fees": + customer_data = frappe.db.get_value(data.reference_doctype, data.reference_name, ["company", "customer_name"], as_dict=1) + + data = { + "amount": flt(data.grand_total, data.precision("grand_total")), + "title": customer_data.company.encode("utf-8"), + "description": data.subject.encode("utf-8"), + "reference_doctype": data.doctype, + "reference_docname": data.name, + "payer_email": data.email_to or frappe.session.user, + "payer_name": customer_data.customer_name, + "order_id": data.name, + "currency": data.currency + } + + valid_mandate = self.check_mandate_validity(data) + if valid_mandate is not None: + data.update(valid_mandate) + + self.create_payment_request(data) + return False + else: + return True + + def check_mandate_validity(self, data): + + if frappe.db.exists("GoCardless Mandate", dict(customer=data.get('payer_name'), disabled=0)): + registered_mandate = frappe.db.get_value("GoCardless Mandate", dict(customer=data.get('payer_name'), disabled=0), 'mandate') + self.initialize_client() + mandate = self.client.mandates.get(registered_mandate) + + if mandate.status=="pending_customer_approval" or mandate.status=="pending_submission" or mandate.status=="submitted" or mandate.status=="active": + return {"mandate": registered_mandate} + else: + return None + else: + return None + + def get_environment(self): + if self.use_sandbox: + return 'sandbox' + else: + return 'live' + + def validate_transaction_currency(self, currency): + if currency not in self.supported_currencies: + frappe.throw(_("Please select another payment method. Stripe does not support transactions in currency '{0}'").format(currency)) + + def get_payment_url(self, **kwargs): + return get_url("./integrations/gocardless_checkout?{0}".format(urlencode(kwargs))) + + def create_payment_request(self, data): + self.data = frappe._dict(data) + + try: + self.integration_request = create_request_log(self.data, "Host", "GoCardless") + return self.create_charge_on_gocardless() + + except Exception: + frappe.log_error(frappe.get_traceback()) + return{ + "redirect_to": frappe.redirect_to_message(_('Server Error'), _("There seems to be an issue with the server's GoCardless configuration. Don't worry, in case of failure, the amount will get refunded to your account.")), + "status": 401 + } + + def create_charge_on_gocardless(self): + redirect_to = self.data.get('redirect_to') or None + redirect_message = self.data.get('redirect_message') or None + + reference_doc = frappe.get_doc(self.data.get('reference_doctype'), self.data.get('reference_docname')) + self.initialize_client() + + try: + payment = self.client.payments.create( + params={ + "amount" : cint(reference_doc.grand_total * 100), + "currency" : reference_doc.currency, + "links" : { + "mandate": self.data.get('mandate') + }, + "metadata": { + "reference_doctype": reference_doc.doctype, + "reference_document": reference_doc.name + } + }, headers={ + 'Idempotency-Key' : self.data.get('reference_docname'), + }) + + if payment.status=="pending_submission" or payment.status=="pending_customer_approval" or payment.status=="submitted": + self.integration_request.db_set('status', 'Authorized', update_modified=False) + self.flags.status_changed_to = "Completed" + self.integration_request.db_set('output', payment.status, update_modified=False) + + elif payment.status=="confirmed" or payment.status=="paid_out": + self.integration_request.db_set('status', 'Completed', update_modified=False) + self.flags.status_changed_to = "Completed" + self.integration_request.db_set('output', payment.status, update_modified=False) + + elif payment.status=="cancelled" or payment.status=="customer_approval_denied" or payment.status=="charged_back": + self.integration_request.db_set('status', 'Cancelled', update_modified=False) + frappe.log_error(_("Payment Cancelled. Please check your GoCardless Account for more details"), "GoCardless Payment Error") + self.integration_request.db_set('error', payment.status, update_modified=False) + else: + self.integration_request.db_set('status', 'Failed', update_modified=False) + frappe.log_error(_("Payment Failed. Please check your GoCardless Account for more details"), "GoCardless Payment Error") + self.integration_request.db_set('error', payment.status, update_modified=False) + + except Exception as e: + frappe.log_error(e, "GoCardless Payment Error") + + if self.flags.status_changed_to == "Completed": + status = 'Completed' + if self.data.reference_doctype and self.data.reference_docname: + custom_redirect_to = None + try: + custom_redirect_to = frappe.get_doc(self.data.reference_doctype, + self.data.reference_docname).run_method("on_payment_authorized", self.flags.status_changed_to) + except Exception: + frappe.log_error(frappe.get_traceback()) + + if custom_redirect_to: + redirect_to = custom_redirect_to + + redirect_url = redirect_to + else: + status = 'Error' + redirect_url = 'payment-failed' + + if redirect_message: + redirect_url += '&' + urlencode({'redirect_message': redirect_message}) + + redirect_url = get_url(redirect_url) + + return { + "redirect_to": redirect_url, + "status": status + } + +def get_gateway_controller(doc): + payment_request = frappe.get_doc("Payment Request", doc) + gateway_controller = frappe.db.get_value("Payment Gateway", payment_request.payment_gateway, "gateway_controller") + return gateway_controller + +def gocardless_initialization(doc): + gateway_controller = get_gateway_controller(doc) + settings = frappe.get_doc("GoCardless Settings", gateway_controller) + client = settings.initialize_client() + return client diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.js b/erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.js new file mode 100644 index 0000000000..b6daad8de4 --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: GoCardless Settings", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new GoCardless Settings + () => frappe.tests.make('GoCardless Settings', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.py b/erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.py new file mode 100644 index 0000000000..e377f3482c --- /dev/null +++ b/erpnext/erpnext_integrations/doctype/gocardless_settings/test_gocardless_settings.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2018, Frappe Technologies and Contributors +# See license.txt +from __future__ import unicode_literals + +import unittest + +class TestGoCardlessSettings(unittest.TestCase): + pass diff --git a/erpnext/templates/includes/integrations/gocardless_checkout.js b/erpnext/templates/includes/integrations/gocardless_checkout.js new file mode 100644 index 0000000000..b18d55090c --- /dev/null +++ b/erpnext/templates/includes/integrations/gocardless_checkout.js @@ -0,0 +1,24 @@ +$(document).ready(function() { + var data = {{ frappe.form_dict | json }}; + var doctype = "{{ reference_doctype }}" + var docname = "{{ reference_docname }}" + + frappe.call({ + method: "erpnext.templates.pages.integrations.gocardless_checkout.check_mandate", + freeze: true, + headers: { + "X-Requested-With": "XMLHttpRequest" + }, + args: { + "data": JSON.stringify(data), + "reference_doctype": doctype, + "reference_docname": docname + }, + callback: function(r) { + if (r.message) { + window.location.href = r.message.redirect_to + } + } + }) + +}) diff --git a/erpnext/templates/includes/integrations/gocardless_confirmation.js b/erpnext/templates/includes/integrations/gocardless_confirmation.js new file mode 100644 index 0000000000..fee1d2b632 --- /dev/null +++ b/erpnext/templates/includes/integrations/gocardless_confirmation.js @@ -0,0 +1,24 @@ +$(document).ready(function() { + var redirect_flow_id = "{{ redirect_flow_id }}"; + var doctype = "{{ reference_doctype }}"; + var docname = "{{ reference_docname }}"; + + frappe.call({ + method: "erpnext.templates.pages.integrations.gocardless_confirmation.confirm_payment", + freeze: true, + headers: { + "X-Requested-With": "XMLHttpRequest" + }, + args: { + "redirect_flow_id": redirect_flow_id, + "reference_doctype": doctype, + "reference_docname": docname + }, + callback: function(r) { + if (r.message) { + window.location.href = r.message.redirect_to; + } + } + }); + +}); diff --git a/erpnext/templates/pages/integrations/__init__.py b/erpnext/templates/pages/integrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/erpnext/templates/pages/integrations/gocardless_checkout.html b/erpnext/templates/pages/integrations/gocardless_checkout.html new file mode 100644 index 0000000000..eb124cafb6 --- /dev/null +++ b/erpnext/templates/pages/integrations/gocardless_checkout.html @@ -0,0 +1,16 @@ +{% extends "templates/web.html" %} + +{% block title %} Payment {% endblock %} + +{%- block header -%}{% endblock %} + +{% block script %} + +{% endblock %} + +{%- block page_content -%} +

+ {{ _("Loading Payment System") }} +

+ +{% endblock %} diff --git a/erpnext/templates/pages/integrations/gocardless_checkout.py b/erpnext/templates/pages/integrations/gocardless_checkout.py new file mode 100644 index 0000000000..3c2466ea2f --- /dev/null +++ b/erpnext/templates/pages/integrations/gocardless_checkout.py @@ -0,0 +1,76 @@ +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import flt +import json +from erpnext.erpnext_integrations.doctype.gocardless_settings.gocardless_settings import gocardless_initialization, get_gateway_controller +from frappe.utils import get_url + +no_cache = 1 +no_sitemap = 1 + +expected_keys = ('amount', 'title', 'description', 'reference_doctype', 'reference_docname', + 'payer_name', 'payer_email', 'order_id', 'currency') + +def get_context(context): + context.no_cache = 1 + + # all these keys exist in form_dict + if not (set(expected_keys) - set(frappe.form_dict.keys())): + for key in expected_keys: + context[key] = frappe.form_dict[key] + + context['amount'] = flt(context['amount']) + + gateway_controller = get_gateway_controller(context.reference_docname) + context['header_img'] = frappe.db.get_value("GoCardless Settings", gateway_controller, "header_img") + + else: + frappe.redirect_to_message(_('Some information is missing'), + _('Looks like someone sent you to an incomplete URL. Please ask them to look into it.')) + frappe.local.flags.redirect_location = frappe.local.response.location + raise frappe.Redirect + +@frappe.whitelist(allow_guest=True) +def check_mandate(data, reference_doctype, reference_docname): + data = json.loads(data) + + client = gocardless_initialization(reference_docname) + + payer = frappe.get_doc("Customer", data["payer_name"]) + + if payer.customer_type == "Individual" and payer.customer_primary_contact is not None: + primary_contact = frappe.get_doc("Contact", payer.customer_primary_contact) + prefilled_customer = { + "company_name": payer.name, + "given_name": primary_contact.first_name, + "family_name": primary_contact.last_name, + } + if primary_contact.email_id is not None: + prefilled_customer.update({"email": primary_contact.email_id}) + else: + prefilled_customer.update({"email": frappe.session.user}) + + else: + prefilled_customer = { + "company_name": payer.name, + "email": frappe.session.user + } + + success_url = get_url("./integrations/gocardless_confirmation?reference_doctype=" + reference_doctype + "&reference_docname=" + reference_docname) + + try: + redirect_flow = client.redirect_flows.create(params={ + "description": _("Pay {0} {1}".format(data['amount'], data['currency'])), + "session_token": frappe.session.user, + "success_redirect_url": success_url, + "prefilled_customer": prefilled_customer + }) + + return {"redirect_to": redirect_flow.redirect_url} + + except Exception as e: + frappe.log_error(e, "GoCardless Payment Error") + return {"redirect_to": '/integrations/payment-failed'} diff --git a/erpnext/templates/pages/integrations/gocardless_confirmation.html b/erpnext/templates/pages/integrations/gocardless_confirmation.html new file mode 100644 index 0000000000..1baf23be26 --- /dev/null +++ b/erpnext/templates/pages/integrations/gocardless_confirmation.html @@ -0,0 +1,16 @@ +{% extends "templates/web.html" %} + +{% block title %} Payment {% endblock %} + +{%- block header -%}{% endblock %} + +{% block script %} + +{% endblock %} + +{%- block page_content -%} +

+ {{ _("Payment Confirmation") }} +

+ +{% endblock %} diff --git a/erpnext/templates/pages/integrations/gocardless_confirmation.py b/erpnext/templates/pages/integrations/gocardless_confirmation.py new file mode 100644 index 0000000000..fc564c3df9 --- /dev/null +++ b/erpnext/templates/pages/integrations/gocardless_confirmation.py @@ -0,0 +1,85 @@ +# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt +from __future__ import unicode_literals +import frappe +from frappe import _ +from erpnext.erpnext_integrations.doctype.gocardless_settings.gocardless_settings import gocardless_initialization, get_gateway_controller + +no_cache = 1 +no_sitemap = 1 + +expected_keys = ('redirect_flow_id', 'reference_doctype', 'reference_docname') + +def get_context(context): + context.no_cache = 1 + + # all these keys exist in form_dict + if not (set(expected_keys) - set(frappe.form_dict.keys())): + for key in expected_keys: + context[key] = frappe.form_dict[key] + + else: + frappe.redirect_to_message(_('Some information is missing'), + _('Looks like someone sent you to an incomplete URL. Please ask them to look into it.')) + frappe.local.flags.redirect_location = frappe.local.response.location + raise frappe.Redirect + +@frappe.whitelist(allow_guest=True) +def confirm_payment(redirect_flow_id, reference_doctype, reference_docname): + + client = gocardless_initialization(reference_docname) + + try: + redirect_flow = client.redirect_flows.complete( + redirect_flow_id, + params={ + "session_token": frappe.session.user + }) + + data = { + "mandate": redirect_flow.links.mandate, + "customer": redirect_flow.links.customer, + "redirect_to": redirect_flow.confirmation_url, + "redirect_message": "Mandate successfully created", + "reference_doctype": reference_doctype, + "reference_docname": reference_docname + } + + try: + create_mandate(data) + except Exception as e: + frappe.log_error(e, "GoCardless Mandate Registration Error") + + gateway_controller = get_gateway_controller(reference_docname) + frappe.get_doc("GoCardless Settings", gateway_controller).create_payment_request(data) + + return {"redirect_to": redirect_flow.confirmation_url} + + except Exception as e: + frappe.log_error(e, "GoCardless Payment Error") + return {"redirect_to": '/integrations/payment-failed'} + + +def create_mandate(data): + data = frappe._dict(data) + frappe.logger().debug(data) + + mandate = data.get('mandate') + + if frappe.db.exists("GoCardless Mandate", mandate): + return + + else: + reference_doc = frappe.db.get_value(data.get('reference_doctype'), data.get('reference_docname'), ["reference_doctype", "reference_name"], as_dict=1) + erpnext_customer = frappe.db.get_value(reference_doc.reference_doctype, reference_doc.reference_name, ["customer_name"], as_dict=1) + + try: + frappe.get_doc({ + "doctype": "GoCardless Mandate", + "mandate": mandate, + "customer": erpnext_customer.customer_name, + "gocardless_customer": data.get('customer') + }).insert(ignore_permissions=True) + + except Exception: + frappe.log_error(frappe.get_traceback()) diff --git a/requirements.txt b/requirements.txt index f21cd8fd28..c5641f564d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ pygithub googlemaps python-stdnum braintree +gocardless_pro