|
- # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
- # For license information, please see license.txt
-
- import frappe
- from frappe import _
- from frappe.integrations.utils import create_request_log
-
- from erpnext.utilities import payment_app_import_guard
-
-
- def create_stripe_subscription(gateway_controller, data):
- with payment_app_import_guard():
- import stripe
-
- stripe_settings = frappe.get_doc("Stripe Settings", gateway_controller)
- stripe_settings.data = frappe._dict(data)
-
- stripe.api_key = stripe_settings.get_password(fieldname="secret_key", raise_exception=False)
- stripe.default_http_client = stripe.http_client.RequestsClient()
-
- try:
- stripe_settings.integration_request = create_request_log(stripe_settings.data, "Host", "Stripe")
- stripe_settings.payment_plans = frappe.get_doc(
- "Payment Request", stripe_settings.data.reference_docname
- ).subscription_plans
- return create_subscription_on_stripe(stripe_settings)
-
- except Exception:
- stripe_settings.log_error("Unable to create Stripe subscription")
- return {
- "redirect_to": frappe.redirect_to_message(
- _("Server Error"),
- _(
- "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."
- ),
- ),
- "status": 401,
- }
-
-
- def create_subscription_on_stripe(stripe_settings):
- with payment_app_import_guard():
- import stripe
-
- items = []
- for payment_plan in stripe_settings.payment_plans:
- plan = frappe.db.get_value("Subscription Plan", payment_plan.plan, "product_price_id")
- items.append({"price": plan, "quantity": payment_plan.qty})
-
- try:
- customer = stripe.Customer.create(
- source=stripe_settings.data.stripe_token_id,
- description=stripe_settings.data.payer_name,
- email=stripe_settings.data.payer_email,
- )
-
- subscription = stripe.Subscription.create(customer=customer, items=items)
-
- if subscription.status == "active":
- stripe_settings.integration_request.db_set("status", "Completed", update_modified=False)
- stripe_settings.flags.status_changed_to = "Completed"
-
- else:
- stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
- frappe.log_error(f"Stripe Subscription ID {subscription.id}: Payment failed")
- except Exception:
- stripe_settings.integration_request.db_set("status", "Failed", update_modified=False)
- stripe_settings.log_error("Unable to create Stripe subscription")
-
- return stripe_settings.finalize_request()
|