mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-06 21:59:13 +00:00
feat: create member if not already exists
This commit is contained in:
@@ -78,7 +78,7 @@ def create_member(user_details):
|
|||||||
member.update({
|
member.update({
|
||||||
"member_name": user_details.fullname,
|
"member_name": user_details.fullname,
|
||||||
"email_id": user_details.email,
|
"email_id": user_details.email,
|
||||||
"pan_number": user_details.pan,
|
"pan_number": user_details.pan or None,
|
||||||
"membership_type": user_details.plan_id,
|
"membership_type": user_details.plan_id,
|
||||||
"customer": create_customer(user_details)
|
"customer": create_customer(user_details)
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ from datetime import datetime
|
|||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.email import sendmail_to_system_managers
|
from frappe.email import sendmail_to_system_managers
|
||||||
from frappe.utils import add_days, add_years, nowdate, getdate, add_months, get_link_to_form
|
from frappe.utils import add_days, add_years, nowdate, getdate, add_months, get_link_to_form
|
||||||
|
from erpnext.non_profit.doctype.member.member import create_member
|
||||||
from frappe import _
|
from frappe import _
|
||||||
import erpnext
|
import erpnext
|
||||||
|
|
||||||
@@ -142,6 +143,7 @@ def get_member_based_on_subscription(subscription_id, email):
|
|||||||
'subscription_id': subscription_id,
|
'subscription_id': subscription_id,
|
||||||
'email_id': email
|
'email_id': email
|
||||||
}, order_by="creation desc")
|
}, order_by="creation desc")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return frappe.get_doc("Member", members[0]['name'])
|
return frappe.get_doc("Member", members[0]['name'])
|
||||||
except:
|
except:
|
||||||
@@ -157,14 +159,15 @@ def verify_signature(data):
|
|||||||
|
|
||||||
controller.verify_signature(data, signature, key)
|
controller.verify_signature(data, signature, key)
|
||||||
|
|
||||||
def make_membership_entry(*args, **kwargs):
|
@frappe.whitelist(allow_guest=True)
|
||||||
|
def trigger_razorpay_subscription(*args, **kwargs):
|
||||||
data = frappe.request.get_data(as_text=True)
|
data = frappe.request.get_data(as_text=True)
|
||||||
try:
|
try:
|
||||||
verify_signature(data)
|
verify_signature(data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
signature = frappe.request.headers.get('X-Razorpay-Signature')
|
log = frappe.log_error(e, "Webhook Verification Error")
|
||||||
log = "{0} \n\n {1} \n\n {2} \n\n {3}".format(e, frappe.get_traceback(), signature, data)
|
notify_failure(log)
|
||||||
frappe.log_error(e, "Webhook Verification Error")
|
return { 'status': 'Failed', 'reason': e}
|
||||||
|
|
||||||
if isinstance(data, six.string_types):
|
if isinstance(data, six.string_types):
|
||||||
data = json.loads(data)
|
data = json.loads(data)
|
||||||
@@ -177,34 +180,42 @@ def make_membership_entry(*args, **kwargs):
|
|||||||
payment = frappe._dict(payment)
|
payment = frappe._dict(payment)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
data_json = json.dumps(data, indent=4, sort_keys=True)
|
if not data.event == "subscription.charged":
|
||||||
|
return
|
||||||
|
|
||||||
member = get_member_based_on_subscription(subscription.id, payment.email)
|
member = get_member_based_on_subscription(subscription.id, payment.email)
|
||||||
except Exception as e:
|
if not member:
|
||||||
error_log = frappe.log_error(frappe.get_traceback() + '\n' + data_json , _("Membership Webhook Failed"))
|
member = create_member(frappe._dict({
|
||||||
notify_failure(error_log)
|
'fullname': payment.email,
|
||||||
return { 'status': 'Failed' }
|
'email': payment.email,
|
||||||
|
'plan_id': get_plan_from_razorpay_id(subscription.plan_id)
|
||||||
|
}))
|
||||||
|
|
||||||
if not member:
|
member.subscription_id = subscription.id
|
||||||
return { 'status': 'Failed' }
|
|
||||||
try:
|
|
||||||
if data.event == "subscription.activated":
|
|
||||||
member.customer_id = payment.customer_id
|
member.customer_id = payment.customer_id
|
||||||
elif data.event == "subscription.charged":
|
if subscription.notes and type(subscription.notes) == dict:
|
||||||
membership = frappe.new_doc("Membership")
|
notes = '\n'.join("{}: {}".format(k, v) for k, v in subscription.notes.items())
|
||||||
membership.update({
|
member.add_comment("Comment", notes)
|
||||||
"member": member.name,
|
elif subscription.notes and type(subscription.notes) == str:
|
||||||
"membership_status": "Current",
|
member.add_comment("Comment", subscription.notes)
|
||||||
"membership_type": member.membership_type,
|
|
||||||
"currency": "INR",
|
|
||||||
"paid": 1,
|
|
||||||
"payment_id": payment.id,
|
|
||||||
"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
|
|
||||||
|
# Update Membership
|
||||||
|
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,
|
||||||
|
"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 membership values
|
||||||
member.subscription_start = datetime.fromtimestamp(subscription.start_at)
|
member.subscription_start = datetime.fromtimestamp(subscription.start_at)
|
||||||
member.subscription_end = datetime.fromtimestamp(subscription.end_at)
|
member.subscription_end = datetime.fromtimestamp(subscription.end_at)
|
||||||
member.subscription_activated = 1
|
member.subscription_activated = 1
|
||||||
@@ -212,18 +223,10 @@ def make_membership_entry(*args, **kwargs):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
log = frappe.log_error(e, "Error creating membership entry")
|
log = frappe.log_error(e, "Error creating membership entry")
|
||||||
notify_failure(log)
|
notify_failure(log)
|
||||||
return { 'status': 'Failed' }
|
return { 'status': 'Failed', 'reason': e}
|
||||||
|
|
||||||
return { 'status': 'Success' }
|
return { 'status': 'Success' }
|
||||||
|
|
||||||
@frappe.whitelist(allow_guest=True)
|
|
||||||
def trigger_razorpay_subscription(*args, **kwargs):
|
|
||||||
try:
|
|
||||||
return make_membership_entry(*args, **kwargs)
|
|
||||||
except Exception as e:
|
|
||||||
log = frappe.log_error(e, "Webhook Failed")
|
|
||||||
return { 'status': 'Failed' }
|
|
||||||
|
|
||||||
|
|
||||||
def notify_failure(log):
|
def notify_failure(log):
|
||||||
try:
|
try:
|
||||||
@@ -237,3 +240,11 @@ Administrator""".format(get_link_to_form("Error Log", log.name))
|
|||||||
sendmail_to_system_managers("[Important] [ERPNext] Razorpay membership webhook failed , please check.", content)
|
sendmail_to_system_managers("[Important] [ERPNext] Razorpay membership webhook failed , please check.", content)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def get_plan_from_razorpay_id(plan_id):
|
||||||
|
plan = frappe.get_all("Membership Type", filters={'razorpay_plan_id': plan_id}, order_by="creation desc")
|
||||||
|
|
||||||
|
try:
|
||||||
|
return plan[0]['name']
|
||||||
|
except:
|
||||||
|
return None
|
||||||
Reference in New Issue
Block a user