blob: 634e5c2e89f47cc6b511c9c55e358fb3b173b1ca [file] [log] [blame]
Charles-Henri Decultot30da37f2018-05-23 16:40:41 +00001# Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
2# For license information, please see license.txt
3
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +00004import frappe
5from frappe import _
6from frappe.integrations.utils import create_request_log
Rohan16eed072021-08-26 21:47:00 +05307
Ankush Menat0b86b1b2022-12-08 16:40:13 +05308from erpnext.utilities import payment_app_import_guard
9
Charles-Henri Decultot30da37f2018-05-23 16:40:41 +000010
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000011def create_stripe_subscription(gateway_controller, data):
Ankush Menat0b86b1b2022-12-08 16:40:13 +053012 with payment_app_import_guard():
13 import stripe
14
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000015 stripe_settings = frappe.get_doc("Stripe Settings", gateway_controller)
16 stripe_settings.data = frappe._dict(data)
17
18 stripe.api_key = stripe_settings.get_password(fieldname="secret_key", raise_exception=False)
19 stripe.default_http_client = stripe.http_client.RequestsClient()
20
21 try:
Charles-Henri Decultotcde1f082018-06-27 08:27:21 +000022 stripe_settings.integration_request = create_request_log(stripe_settings.data, "Host", "Stripe")
Ankush Menat494bd9e2022-03-28 18:52:46 +053023 stripe_settings.payment_plans = frappe.get_doc(
24 "Payment Request", stripe_settings.data.reference_docname
25 ).subscription_plans
Charles-Henri Decultotcde1f082018-06-27 08:27:21 +000026 return create_subscription_on_stripe(stripe_settings)
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000027
28 except Exception:
Rushabh Mehta548afba2022-05-02 15:04:26 +053029 stripe_settings.log_error("Unable to create Stripe subscription")
Ankush Menat494bd9e2022-03-28 18:52:46 +053030 return {
Rohan16eed072021-08-26 21:47:00 +053031 "redirect_to": frappe.redirect_to_message(
Ankush Menat494bd9e2022-03-28 18:52:46 +053032 _("Server Error"),
33 _(
34 "It seems that there is an issue with the server's stripe configuration. In case of failure, the amount will get refunded to your account."
35 ),
Rohan16eed072021-08-26 21:47:00 +053036 ),
Ankush Menat494bd9e2022-03-28 18:52:46 +053037 "status": 401,
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000038 }
39
40
41def create_subscription_on_stripe(stripe_settings):
Ankush Menat0b86b1b2022-12-08 16:40:13 +053042 with payment_app_import_guard():
43 import stripe
44
Rohan16eed072021-08-26 21:47:00 +053045 items = []
46 for payment_plan in stripe_settings.payment_plans:
47 plan = frappe.db.get_value("Subscription Plan", payment_plan.plan, "product_price_id")
48 items.append({"price": plan, "quantity": payment_plan.qty})
Charles-Henri Decultot0134e132018-06-20 17:38:13 +000049
Rohan16eed072021-08-26 21:47:00 +053050 try:
51 customer = stripe.Customer.create(
52 source=stripe_settings.data.stripe_token_id,
53 description=stripe_settings.data.payer_name,
Ankush Menat494bd9e2022-03-28 18:52:46 +053054 email=stripe_settings.data.payer_email,
Rohan16eed072021-08-26 21:47:00 +053055 )
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000056
Rohan16eed072021-08-26 21:47:00 +053057 subscription = stripe.Subscription.create(customer=customer, items=items)
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000058
Rohan16eed072021-08-26 21:47:00 +053059 if subscription.status == "active":
Ankush Menat494bd9e2022-03-28 18:52:46 +053060 stripe_settings.integration_request.db_set("status", "Completed", update_modified=False)
Rohan16eed072021-08-26 21:47:00 +053061 stripe_settings.flags.status_changed_to = "Completed"
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000062
Rohan16eed072021-08-26 21:47:00 +053063 else:
Ankush Menat494bd9e2022-03-28 18:52:46 +053064 stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
Rushabh Mehta548afba2022-05-02 15:04:26 +053065 frappe.log_error(f"Stripe Subscription ID {subscription.id}: Payment failed")
Rohan16eed072021-08-26 21:47:00 +053066 except Exception:
Ankush Menat494bd9e2022-03-28 18:52:46 +053067 stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
Rushabh Mehta548afba2022-05-02 15:04:26 +053068 stripe_settings.log_error("Unable to create Stripe subscription")
Charles-Henri Decultotba6f6d92018-06-05 19:49:57 +000069
Rohan16eed072021-08-26 21:47:00 +053070 return stripe_settings.finalize_request()