* Allow several Stripe accounts * Addition of a sync patch * Remove unused dependancypull/2/head
@@ -3,6 +3,7 @@ | |||||
"allow_guest_to_view": 0, | "allow_guest_to_view": 0, | ||||
"allow_import": 0, | "allow_import": 0, | ||||
"allow_rename": 0, | "allow_rename": 0, | ||||
"autoname": "field:gateway_name", | |||||
"beta": 0, | "beta": 0, | ||||
"creation": "2017-03-09 17:18:29.458397", | "creation": "2017-03-09 17:18:29.458397", | ||||
"custom": 0, | "custom": 0, | ||||
@@ -13,6 +14,38 @@ | |||||
"engine": "InnoDB", | "engine": "InnoDB", | ||||
"fields": [ | "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, | |||||
"translatable": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | |||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | "allow_on_submit": 0, | ||||
"bold": 0, | "bold": 0, | ||||
"collapsible": 0, | "collapsible": 0, | ||||
@@ -24,7 +57,7 @@ | |||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | "in_filter": 0, | ||||
"in_global_search": 0, | "in_global_search": 0, | ||||
"in_list_view": 0, | |||||
"in_list_view": 1, | |||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Publishable Key", | "label": "Publishable Key", | ||||
"length": 0, | "length": 0, | ||||
@@ -39,9 +72,11 @@ | |||||
"reqd": 1, | "reqd": 1, | ||||
"search_index": 0, | "search_index": 0, | ||||
"set_only_once": 0, | "set_only_once": 0, | ||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
}, | }, | ||||
{ | { | ||||
"allow_bulk_edit": 0, | |||||
"allow_on_submit": 0, | "allow_on_submit": 0, | ||||
"bold": 0, | "bold": 0, | ||||
"collapsible": 0, | "collapsible": 0, | ||||
@@ -53,7 +88,7 @@ | |||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | "in_filter": 0, | ||||
"in_global_search": 0, | "in_global_search": 0, | ||||
"in_list_view": 0, | |||||
"in_list_view": 1, | |||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Secret Key", | "label": "Secret Key", | ||||
"length": 0, | "length": 0, | ||||
@@ -68,6 +103,7 @@ | |||||
"reqd": 1, | "reqd": 1, | ||||
"search_index": 0, | "search_index": 0, | ||||
"set_only_once": 0, | "set_only_once": 0, | ||||
"translatable": 0, | |||||
"unique": 0 | "unique": 0 | ||||
} | } | ||||
], | ], | ||||
@@ -78,10 +114,10 @@ | |||||
"image_view": 0, | "image_view": 0, | ||||
"in_create": 0, | "in_create": 0, | ||||
"is_submittable": 0, | "is_submittable": 0, | ||||
"issingle": 1, | |||||
"issingle": 0, | |||||
"istable": 0, | "istable": 0, | ||||
"max_attachments": 0, | "max_attachments": 0, | ||||
"modified": "2017-03-09 17:19:25.087475", | |||||
"modified": "2018-05-18 16:18:32.584083", | |||||
"modified_by": "Administrator", | "modified_by": "Administrator", | ||||
"module": "Integrations", | "module": "Integrations", | ||||
"name": "Stripe Settings", | "name": "Stripe Settings", | ||||
@@ -90,7 +126,6 @@ | |||||
"permissions": [ | "permissions": [ | ||||
{ | { | ||||
"amend": 0, | "amend": 0, | ||||
"apply_user_permissions": 0, | |||||
"cancel": 0, | "cancel": 0, | ||||
"create": 1, | "create": 1, | ||||
"delete": 1, | "delete": 1, | ||||
@@ -29,9 +29,9 @@ class StripeSettings(Document): | |||||
'GBP': 0.30, 'NZD': 0.50, 'SGD': 0.50 | 'GBP': 0.30, 'NZD': 0.50, 'SGD': 0.50 | ||||
} | } | ||||
def validate(self): | |||||
create_payment_gateway('Stripe') | |||||
call_hook_method('payment_gateway_enabled', gateway='Stripe') | |||||
def on_update(self): | |||||
create_payment_gateway('Stripe-' + self.gateway_name, settings='Stripe Settings', controller=self.gateway_name) | |||||
call_hook_method('payment_gateway_enabled', gateway='Stripe-' + self.gateway_name) | |||||
if not self.flags.ignore_mandatory: | if not self.flags.ignore_mandatory: | ||||
self.validate_stripe_credentails() | self.validate_stripe_credentails() | ||||
@@ -55,7 +55,7 @@ class StripeSettings(Document): | |||||
def get_payment_url(self, **kwargs): | def get_payment_url(self, **kwargs): | ||||
return get_url("./integrations/stripe_checkout?{0}".format(urlencode(kwargs))) | return get_url("./integrations/stripe_checkout?{0}".format(urlencode(kwargs))) | ||||
def create_request(self, data): | def create_request(self, data): | ||||
self.data = frappe._dict(data) | self.data = frappe._dict(data) | ||||
@@ -68,24 +68,24 @@ class StripeSettings(Document): | |||||
"redirect_to": frappe.redirect_to_message(_('Server Error'), _("Seems issue with server's razorpay config. Don't worry, in case of failure amount will get refunded to your account.")), | "redirect_to": frappe.redirect_to_message(_('Server Error'), _("Seems issue with server's razorpay config. Don't worry, in case of failure amount will get refunded to your account.")), | ||||
"status": 401 | "status": 401 | ||||
} | } | ||||
def create_charge_on_stripe(self): | def create_charge_on_stripe(self): | ||||
headers = {"Authorization": | headers = {"Authorization": | ||||
"Bearer {0}".format(self.get_password(fieldname="secret_key", raise_exception=False))} | "Bearer {0}".format(self.get_password(fieldname="secret_key", raise_exception=False))} | ||||
data = { | data = { | ||||
"amount": cint(flt(self.data.amount)*100), | "amount": cint(flt(self.data.amount)*100), | ||||
"currency": self.data.currency, | "currency": self.data.currency, | ||||
"source": self.data.stripe_token_id, | "source": self.data.stripe_token_id, | ||||
"description": self.data.description | "description": self.data.description | ||||
} | } | ||||
redirect_to = self.data.get('redirect_to') or None | redirect_to = self.data.get('redirect_to') or None | ||||
redirect_message = self.data.get('redirect_message') or None | redirect_message = self.data.get('redirect_message') or None | ||||
try: | try: | ||||
resp = make_post_request(url="https://api.stripe.com/v1/charges", headers=headers, data=data) | resp = make_post_request(url="https://api.stripe.com/v1/charges", headers=headers, data=data) | ||||
if resp.get("captured") == True: | if resp.get("captured") == True: | ||||
self.integration_request.db_set('status', 'Completed', update_modified=False) | self.integration_request.db_set('status', 'Completed', update_modified=False) | ||||
self.flags.status_changed_to = "Completed" | self.flags.status_changed_to = "Completed" | ||||
@@ -125,3 +125,8 @@ class StripeSettings(Document): | |||||
"redirect_to": redirect_url, | "redirect_to": redirect_url, | ||||
"status": status | "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 |
@@ -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: Stripe Settings", function (assert) { | |||||
let done = assert.async(); | |||||
// number of asserts | |||||
assert.expect(1); | |||||
frappe.run_serially([ | |||||
// insert a new Stripe Settings | |||||
() => frappe.tests.make('Stripe Settings', [ | |||||
// values to be set | |||||
{key: 'value'} | |||||
]), | |||||
() => { | |||||
assert.equal(cur_frm.doc.key, 'value'); | |||||
}, | |||||
() => done() | |||||
]); | |||||
}); |
@@ -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 TestStripeSettings(unittest.TestCase): | |||||
pass |
@@ -5,6 +5,7 @@ import frappe | |||||
from frappe import _ | from frappe import _ | ||||
from frappe.utils import flt, cint | from frappe.utils import flt, cint | ||||
import json | import json | ||||
from frappe.integrations.doctype.stripe_settings.stripe_settings import get_gateway_controller | |||||
no_cache = 1 | no_cache = 1 | ||||
no_sitemap = 1 | no_sitemap = 1 | ||||
@@ -14,13 +15,14 @@ expected_keys = ('amount', 'title', 'description', 'reference_doctype', 'referen | |||||
def get_context(context): | def get_context(context): | ||||
context.no_cache = 1 | context.no_cache = 1 | ||||
context.publishable_key = get_api_key() | |||||
# all these keys exist in form_dict | # all these keys exist in form_dict | ||||
if not (set(expected_keys) - set(list(frappe.form_dict))): | if not (set(expected_keys) - set(list(frappe.form_dict))): | ||||
for key in expected_keys: | for key in expected_keys: | ||||
context[key] = frappe.form_dict[key] | context[key] = frappe.form_dict[key] | ||||
context.publishable_key = get_api_key(context.reference_docname) | |||||
context['amount'] = flt(context['amount']) | context['amount'] = flt(context['amount']) | ||||
else: | else: | ||||
@@ -29,8 +31,9 @@ def get_context(context): | |||||
frappe.local.flags.redirect_location = frappe.local.response.location | frappe.local.flags.redirect_location = frappe.local.response.location | ||||
raise frappe.Redirect | raise frappe.Redirect | ||||
def get_api_key(): | |||||
publishable_key = frappe.db.get_value("Stripe Settings", None, "publishable_key") | |||||
def get_api_key(doc): | |||||
gateway_controller = get_gateway_controller(doc) | |||||
publishable_key = frappe.db.get_value("Stripe Settings", gateway_controller, "publishable_key") | |||||
if cint(frappe.form_dict.get("use_sandbox")): | if cint(frappe.form_dict.get("use_sandbox")): | ||||
publishable_key = frappe.conf.sandbox_publishable_key | publishable_key = frappe.conf.sandbox_publishable_key | ||||
@@ -44,6 +47,7 @@ def make_payment(stripe_token_id, data, reference_doctype=None, reference_docnam | |||||
"stripe_token_id": stripe_token_id | "stripe_token_id": stripe_token_id | ||||
}) | }) | ||||
data = frappe.get_doc("Stripe Settings").create_request(data) | |||||
gateway_controller = get_gateway_controller(reference_docname) | |||||
data = frappe.get_doc("Stripe Settings", gateway_controller).create_request(data) | |||||
frappe.db.commit() | frappe.db.commit() | ||||
return data | |||||
return data |