diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py index fbb0ebc2c8..532e19cffd 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py @@ -3,30 +3,31 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe import _ -import requests +from frappe.utils.password import get_decrypted_password from plaid import Client from plaid.errors import APIError, ItemError +import frappe +import requests + class PlaidConnector(): def __init__(self, access_token=None): - if not(frappe.conf.get("plaid_client_id") and frappe.conf.get("plaid_secret") and frappe.conf.get("plaid_public_key")): - frappe.throw(_("Please complete your Plaid API configuration before synchronizing your account")) + plaid_settings = frappe.get_single("Plaid Settings") self.config = { - "plaid_client_id": frappe.conf.get("plaid_client_id"), - "plaid_secret": frappe.conf.get("plaid_secret"), - "plaid_public_key": frappe.conf.get("plaid_public_key"), - "plaid_env": frappe.conf.get("plaid_env") + "plaid_client_id": plaid_settings.plaid_client_id, + "plaid_secret": get_decrypted_password("Plaid Settings", "Plaid Settings", 'plaid_secret'), + "plaid_public_key": plaid_settings.plaid_public_key, + "plaid_env": plaid_settings.plaid_env } - self.client = Client(client_id=self.config["plaid_client_id"], - secret=self.config["plaid_secret"], - public_key=self.config["plaid_public_key"], - environment=self.config["plaid_env"] - ) + self.client = Client(client_id=self.config.get("plaid_client_id"), + secret=self.config.get("plaid_secret"), + public_key=self.config.get("plaid_public_key"), + environment=self.config.get("plaid_env") + ) self.access_token = access_token @@ -78,4 +79,4 @@ class PlaidConnector(): transactions.extend(response['transactions']) return transactions except Exception: - frappe.log_error(frappe.get_traceback(), _("Plaid transactions sync error")) \ No newline at end of file + frappe.log_error(frappe.get_traceback(), _("Plaid transactions sync error")) diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js index ace4fbf9e3..0ffbb877ea 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js @@ -4,8 +4,18 @@ frappe.provide("erpnext.integrations"); frappe.ui.form.on('Plaid Settings', { - link_new_account: function(frm) { - new erpnext.integrations.plaidLink(frm); + enabled: function(frm) { + frm.toggle_reqd('plaid_client_id', frm.doc.enabled); + frm.toggle_reqd('plaid_secret', frm.doc.enabled); + frm.toggle_reqd('plaid_public_key', frm.doc.enabled); + frm.toggle_reqd('plaid_env', frm.doc.enabled); + }, + refresh: function(frm) { + if(frm.doc.enabled) { + frm.add_custom_button('Link a new bank account', () => { + new erpnext.integrations.plaidLink(frm); + }); + } } }); @@ -19,20 +29,10 @@ erpnext.integrations.plaidLink = class plaidLink { init_config() { const me = this; - frappe.xcall('erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.plaid_configuration') - .then(result => { - if (result !== "disabled") { - if (result.plaid_env == undefined || result.plaid_public_key == undefined) { - frappe.throw(__("Please add valid Plaid api keys in site_config.json first")); - } - me.plaid_env = result.plaid_env; - me.plaid_public_key = result.plaid_public_key; - me.client_name = result.client_name; - me.init_plaid(); - } else { - frappe.throw(__("Please save your document before adding a new account")); - } - }); + me.plaid_env = me.frm.doc.plaid_env; + me.plaid_public_key = me.frm.doc.plaid_public_key; + me.client_name = frappe.boot.sitename; + me.init_plaid(); } init_plaid() { @@ -104,4 +104,4 @@ erpnext.integrations.plaidLink = class plaidLink { }); }, __("Select a company"), __("Continue")); } -}; \ No newline at end of file +}; diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json index ed51c4e8f8..9903048d0b 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json @@ -1,161 +1,96 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2018-10-25 10:02:48.656165", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 1, - "engine": "InnoDB", + "creation": "2018-10-25 10:02:48.656165", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "enabled", + "column_break_2", + "automatic_sync", + "section_break_4", + "plaid_client_id", + "plaid_secret", + "column_break_7", + "plaid_public_key", + "plaid_env" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "enabled", - "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": "Enabled", - "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, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "fieldname": "enabled", + "fieldtype": "Check", + "label": "Enabled" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:doc.enabled==1", - "fieldname": "automatic_sync", - "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": "Synchronize all accounts every hour", - "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, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "depends_on": "eval:doc.enabled==1", + "fieldname": "automatic_sync", + "fieldtype": "Check", + "label": "Synchronize all accounts every hour" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "eval:(doc.enabled==1)&&(!doc.__islocal)", - "fieldname": "link_new_account", - "fieldtype": "Button", - "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": "Link a new bank account", - "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, - "translatable": 0, - "unique": 0 + "depends_on": "eval:doc.enabled==1", + "fieldname": "plaid_client_id", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Plaid Client ID", + "reqd": 1 + }, + { + "depends_on": "eval:doc.enabled==1", + "fieldname": "plaid_secret", + "fieldtype": "Password", + "in_list_view": 1, + "label": "Plaid Secret", + "reqd": 1 + }, + { + "depends_on": "eval:doc.enabled==1", + "fieldname": "plaid_public_key", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Plaid Public Key", + "reqd": 1 + }, + { + "depends_on": "eval:doc.enabled==1", + "fieldname": "plaid_env", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Plaid Environment", + "reqd": 1 + }, + { + "fieldname": "column_break_2", + "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_4", + "fieldtype": "Section Break" + }, + { + "fieldname": "column_break_7", + "fieldtype": "Column Break" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2018-12-14 12:51:12.331395", - "modified_by": "Administrator", - "module": "ERPNext Integrations", - "name": "Plaid Settings", - "name_case": "", - "owner": "Administrator", + ], + "issingle": 1, + "modified": "2019-08-13 17:00:06.939422", + "modified_by": "Administrator", + "module": "ERPNext Integrations", + "name": "Plaid Settings", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "System Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "print": 1, + "read": 1, + "role": "System Manager", + "share": 1, "write": 1 } - ], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + ], + "sort_field": "modified", + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py index 8d31e24cd6..4af1d74094 100644 --- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py +++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py @@ -16,8 +16,13 @@ class PlaidSettings(Document): @frappe.whitelist() def plaid_configuration(): - if frappe.db.get_value("Plaid Settings", None, "enabled") == "1": - return {"plaid_public_key": frappe.conf.get("plaid_public_key") or None, "plaid_env": frappe.conf.get("plaid_env") or None, "client_name": frappe.local.site } + if frappe.db.get_single_value("Plaid Settings", "enabled"): + plaid_settings = frappe.get_single("Plaid Settings") + return { + "plaid_public_key": plaid_settings.plaid_public_key, + "plaid_env": plaid_settings.plaid_env, + "client_name": frappe.local.site + } else: return "disabled" diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 2f74d54dd2..7c1d8a034d 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -625,6 +625,7 @@ erpnext.patches.v12_0.add_default_buying_selling_terms_in_company erpnext.patches.v12_0.update_ewaybill_field_position erpnext.patches.v12_0.create_accounting_dimensions_in_missing_doctypes erpnext.patches.v11_1.set_status_for_material_request_type_manufacture +erpnext.patches.v12_0.move_plaid_settings_to_doctype execute:frappe.reload_doc('desk', 'doctype','dashboard_chart_link') execute:frappe.reload_doc('desk', 'doctype','dashboard') execute:frappe.reload_doc('desk', 'doctype','dashboard_chart_source') diff --git a/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py b/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py new file mode 100644 index 0000000000..8e60d33f85 --- /dev/null +++ b/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py @@ -0,0 +1,22 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doc("erpnext_integrations", "doctype", "plaid_settings") + plaid_settings = frappe.get_single("Plaid Settings") + if plaid_settings.enabled: + if not (frappe.conf.plaid_client_id and frappe.conf.plaid_env \ + and frappe.conf.plaid_public_key and frappe.conf.plaid_secret): + plaid_settings.enabled = 0 + else: + plaid_settings.update({ + "plaid_client_id": frappe.conf.plaid_client_id, + "plaid_public_key": frappe.conf.plaid_public_key, + "plaid_env": frappe.conf.plaid_env, + "plaid_secret": frappe.conf.plaid_secret + }) + plaid_settings.flags.ignore_mandatory = True + plaid_settings.save()