Merge pull request #22819 from scmmishra/iff

diff --git a/erpnext/non_profit/doctype/member/member.js b/erpnext/non_profit/doctype/member/member.js
index 3e9d0ba..199dcfc 100644
--- a/erpnext/non_profit/doctype/member/member.js
+++ b/erpnext/non_profit/doctype/member/member.js
@@ -29,6 +29,14 @@
 				frappe.set_route('query-report', 'Accounts Receivable', {member:frm.doc.name});
 			});
 
+			if (!frm.doc.customer) {
+				frm.add_custom_button(__('Create Customer'), () => {
+					frm.call('make_customer_and_link').then(() => {
+						frm.reload_doc();
+					});
+				});
+			}
+
 			// indicator
 			erpnext.utils.set_party_dashboard_indicators(frm);
 
diff --git a/erpnext/non_profit/doctype/member/member.py b/erpnext/non_profit/doctype/member/member.py
index d1294cc..c52082c 100644
--- a/erpnext/non_profit/doctype/member/member.py
+++ b/erpnext/non_profit/doctype/member/member.py
@@ -53,6 +53,19 @@
 
 		return subscription
 
+	def make_customer_and_link(self):
+		if self.customer:
+			frappe.msgprint(_("A customer is already linked to this Member"))
+		cust = create_customer(frappe._dict({
+			'fullname': self.member_name,
+			'email': self.email_id or self.user,
+			'phone': None
+		}))
+
+		self.customer = cust
+		self.save()
+
+
 def get_or_create_member(user_details):
 	member_list = frappe.get_all("Member", filters={'email': user_details.email, 'membership_type': user_details.plan_id})
 	if member_list and member_list[0]:
@@ -83,8 +96,10 @@
 	try:
 		contact = frappe.new_doc("Contact")
 		contact.first_name = user_details.fullname
-		contact.add_phone(user_details.mobile, is_primary_phone=1, is_primary_mobile_no=1)
-		contact.add_email(user_details.email, is_primary=1)
+		if user_details.mobile:
+			contact.add_phone(user_details.mobile, is_primary_phone=1, is_primary_mobile_no=1)
+		if user_details.email:
+			contact.add_email(user_details.email, is_primary=1)
 		contact.insert(ignore_permissions=True)
 
 		contact.append("links", {
@@ -121,7 +136,7 @@
 			'subscription_id': 'sub_EZycCvXFvqnC6p'
 		}
 	"""
-	# {"plan_id":"IFF Starter","fullname":"Shivam Mishra","mobile":"7506056962","email":"shivam@shivam.dev","pan":"Testing123"}
+
 	user_details = frappe._dict(user_details)
 	member = get_or_create_member(user_details)
 	if not member:
diff --git a/erpnext/non_profit/doctype/membership/membership.json b/erpnext/non_profit/doctype/membership/membership.json
index 9f10d0c..238f4c3 100644
--- a/erpnext/non_profit/doctype/membership/membership.json
+++ b/erpnext/non_profit/doctype/membership/membership.json
@@ -120,13 +120,15 @@
   {
    "fieldname": "webhook_payload",
    "fieldtype": "Code",
+   "hidden": 1,
    "label": "Webhook Payload",
    "options": "JSON",
    "read_only": 1
   }
  ],
+ "index_web_pages_for_search": 1,
  "links": [],
- "modified": "2020-04-06 14:29:33.856060",
+ "modified": "2020-07-27 14:28:11.532696",
  "modified_by": "Administrator",
  "module": "Non Profit",
  "name": "Membership",
diff --git a/erpnext/non_profit/doctype/membership/membership.py b/erpnext/non_profit/doctype/membership/membership.py
index 7a0caed..729e111 100644
--- a/erpnext/non_profit/doctype/membership/membership.py
+++ b/erpnext/non_profit/doctype/membership/membership.py
@@ -81,7 +81,12 @@
 @frappe.whitelist(allow_guest=True)
 def trigger_razorpay_subscription(*args, **kwargs):
 	data = frappe.request.get_data(as_text=True)
-	verify_signature(data)
+	try:
+		verify_signature(data)
+	except Exception as e:
+		signature = frappe.request.headers.get('X-Razorpay-Signature')
+		log = "{0} \n\n {1} \n\n {2} \n\n {3}".format(e, frappe.get_traceback(), signature, data)
+		frappe.log_error(e, "Webhook Verification Error")
 
 	if isinstance(data, six.string_types):
 		data = json.loads(data)
@@ -99,36 +104,40 @@
 	except Exception as e:
 		error_log = frappe.log_error(frappe.get_traceback() + '\n' + data_json , _("Membership Webhook Failed"))
 		notify_failure(error_log)
-		return False
+		return { status: 'Failed' }
 
 	if not member:
-		return False
+		return { status: 'Failed' }
+	try:
+		if data.event == "subscription.activated":
+			member.customer_id = payment.customer_id
+		elif data.event == "subscription.charged":
+			membership = frappe.new_doc("Membership")
+			membership.update({
+				"member": member.name,
+				"membership_status": "Current",
+				"membership_type": member.membership_type,
+				"currency": "INR",
+				"paid": 1,
+				"payment_id": payment.id,
+				"webhook_payload": data_json,
+				"from_date": datetime.fromtimestamp(subscription.current_start),
+				"to_date": datetime.fromtimestamp(subscription.current_end),
+				"amount": payment.amount / 100 # Convert to rupees from paise
+			})
+			membership.insert(ignore_permissions=True)
 
-	if data.event == "subscription.activated":
-		member.customer_id = payment.customer_id
-	elif data.event == "subscription.charged":
-		membership = frappe.new_doc("Membership")
-		membership.update({
-			"member": member.name,
-			"membership_status": "Current",
-			"membership_type": member.membership_type,
-			"currency": "INR",
-			"paid": 1,
-			"payment_id": payment.id,
-			"webhook_payload": data_json,
-			"from_date": datetime.fromtimestamp(subscription.current_start),
-			"to_date": datetime.fromtimestamp(subscription.current_end),
-			"amount": payment.amount / 100 # Convert to rupees from paise
-		})
-		membership.insert(ignore_permissions=True)
+		# Update these values anyway
+		member.subscription_start = datetime.fromtimestamp(subscription.start_at)
+		member.subscription_end = datetime.fromtimestamp(subscription.end_at)
+		member.subscription_activated = 1
+		member.save(ignore_permissions=True)
+	except Exception as e:
+		log = frappe.log_error(e, "Error creating membership entry")
+		notify_failure(log)
+		return { status: 'Failed' }
 
-	# Update these values anyway
-	member.subscription_start = datetime.fromtimestamp(subscription.start_at)
-	member.subscription_end = datetime.fromtimestamp(subscription.end_at)
-	member.subscription_activated = 1
-	member.save(ignore_permissions=True)
-
-	return True
+	return { status: 'Success' }
 
 
 def notify_failure(log):