fix: use Stripe's Price API for plan-price information (#26107)

* fix: use Stripe's new Plan API for price information

* patch: use inbuilt function to rename field

* fix: patch call

Co-authored-by: Ankush Menat <ankush@iwebnotes.com>
Co-authored-by: Nabin Hait <nabinhait@gmail.com>
diff --git a/erpnext/accounts/doctype/subscription_plan/subscription_plan.json b/erpnext/accounts/doctype/subscription_plan/subscription_plan.json
index 771611a..878ae09 100644
--- a/erpnext/accounts/doctype/subscription_plan/subscription_plan.json
+++ b/erpnext/accounts/doctype/subscription_plan/subscription_plan.json
@@ -21,7 +21,7 @@
   "column_break_13",
   "billing_interval_count",
   "payment_plan_section",
-  "payment_plan_id",
+  "product_price_id",
   "column_break_16",
   "payment_gateway",
   "accounting_dimensions_section",
@@ -115,11 +115,6 @@
    "label": "Payment Plan"
   },
   {
-   "fieldname": "payment_plan_id",
-   "fieldtype": "Data",
-   "label": "Payment Plan"
-  },
-  {
    "fieldname": "column_break_16",
    "fieldtype": "Column Break"
   },
@@ -144,10 +139,15 @@
    "fieldtype": "Link",
    "label": "Cost Center",
    "options": "Cost Center"
+  },
+  {
+   "fieldname": "product_price_id",
+   "fieldtype": "Data",
+   "label": "Product Price ID"
   }
  ],
  "links": [],
- "modified": "2021-08-09 10:53:44.205774",
+ "modified": "2021-08-13 10:53:44.205774",
  "modified_by": "Administrator",
  "module": "Accounts",
  "name": "Subscription Plan",
diff --git a/erpnext/erpnext_integrations/stripe_integration.py b/erpnext/erpnext_integrations/stripe_integration.py
index 108b4c0..820c740 100644
--- a/erpnext/erpnext_integrations/stripe_integration.py
+++ b/erpnext/erpnext_integrations/stripe_integration.py
@@ -2,11 +2,12 @@
 # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors
 # For license information, please see license.txt
 
-from __future__ import unicode_literals
+import stripe
+
 import frappe
 from frappe import _
 from frappe.integrations.utils import create_request_log
-import stripe
+
 
 def create_stripe_subscription(gateway_controller, data):
 	stripe_settings = frappe.get_doc("Stripe Settings", gateway_controller)
@@ -23,31 +24,38 @@
 	except Exception:
 		frappe.log_error(frappe.get_traceback())
 		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.")),
+			"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):
-		items = []
-		for payment_plan in stripe_settings.payment_plans:
-			plan = frappe.db.get_value("Subscription Plan", payment_plan.plan, "payment_plan_id")
-			items.append({"plan": plan, "quantity": payment_plan.qty})
+	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(description=stripe_settings.data.payer_name, email=stripe_settings.data.payer_email, source=stripe_settings.data.stripe_token_id)
-			subscription = stripe.Subscription.create(customer=customer, items=items)
+	try:
+		customer = stripe.Customer.create(
+			source=stripe_settings.data.stripe_token_id,
+			description=stripe_settings.data.payer_name,
+			email=stripe_settings.data.payer_email
+		)
 
-			if subscription.status == "active":
-				stripe_settings.integration_request.db_set('status', 'Completed', update_modified=False)
-				stripe_settings.flags.status_changed_to = "Completed"
+		subscription = stripe.Subscription.create(customer=customer, items=items)
 
-			else:
-				stripe_settings.integration_request.db_set('status', 'Failed', update_modified=False)
-				frappe.log_error('Subscription N°: ' + subscription.id, 'Stripe Payment not completed')
+		if subscription.status == "active":
+			stripe_settings.integration_request.db_set('status', 'Completed', update_modified=False)
+			stripe_settings.flags.status_changed_to = "Completed"
 
-		except Exception:
+		else:
 			stripe_settings.integration_request.db_set('status', 'Failed', update_modified=False)
-			frappe.log_error(frappe.get_traceback())
+			frappe.log_error('Subscription N°: ' + subscription.id, 'Stripe Payment not completed')
+	except Exception:
+		stripe_settings.integration_request.db_set('status', 'Failed', update_modified=False)
+		frappe.log_error(frappe.get_traceback())
 
-		return stripe_settings.finalize_request()
+	return stripe_settings.finalize_request()
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 0a6a8bd..311e785 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -295,6 +295,7 @@
 erpnext.patches.v13_0.add_custom_field_for_south_africa #2
 erpnext.patches.v13_0.update_recipient_email_digest
 erpnext.patches.v13_0.shopify_deprecation_warning
+erpnext.patches.v13_0.migrate_stripe_api
 erpnext.patches.v13_0.reset_clearance_date_for_intracompany_payment_entries
 erpnext.patches.v13_0.einvoicing_deprecation_warning
 erpnext.patches.v14_0.delete_einvoicing_doctypes
diff --git a/erpnext/patches/v13_0/migrate_stripe_api.py b/erpnext/patches/v13_0/migrate_stripe_api.py
new file mode 100644
index 0000000..355421a
--- /dev/null
+++ b/erpnext/patches/v13_0/migrate_stripe_api.py
@@ -0,0 +1,7 @@
+import frappe
+from frappe.model.utils.rename_field import rename_field
+
+
+def execute():
+	frappe.reload_doc("accounts", "doctype", "subscription_plan")
+	rename_field("Subscription Plan", "payment_plan_id", "product_price_id")