chore: refactor payment settings

This commit is contained in:
Jannat Patel
2024-09-30 18:30:53 +05:30
parent b6bf9c0032
commit 008cc66cdd
12 changed files with 314 additions and 149 deletions

View File

@@ -708,3 +708,49 @@ def delete_documents(doctype, documents):
frappe.only_for("Moderator")
for doc in documents:
frappe.delete_doc(doctype, doc)
@frappe.whitelist()
def get_payment_gateway_details(payment_gateway):
fields = []
gateway = frappe.get_doc("Payment Gateway", payment_gateway)
if gateway.gateway_controller is None:
try:
data = frappe.get_doc(f"{payment_gateway} Settings").as_dict()
meta = frappe.get_meta(f"{payment_gateway} Settings").fields
doctype = f"{payment_gateway} Settings"
docname = f"{payment_gateway} Settings"
except Exception:
frappe.throw(_("{0} Settings not found").format(payment_gateway))
else:
try:
data = frappe.get_doc(gateway.gateway_settings, gateway.gateway_controller).as_dict()
meta = frappe.get_meta(gateway.gateway_settings).fields
doctype = gateway.gateway_settings
docname = gateway.gateway_controller
except Exception:
frappe.throw(_("{0} Settings not found").format(payment_gateway))
for row in meta:
if row.fieldtype not in ["Column Break", "Section Break"]:
if row.fieldtype in ["Attach", "Attach Image"]:
fieldtype = "Upload"
data[row.fieldname] = get_file_info(data.get(row.fieldname))
else:
fieldtype = row.fieldtype
fields.append(
{
"label": row.label,
"name": row.fieldname,
"type": fieldtype,
}
)
return {
"fields": fields,
"data": data,
"doctype": doctype,
"docname": docname,
}

View File

@@ -15,6 +15,7 @@ from lms.lms.utils import (
get_lesson_url,
get_quiz_details,
get_assignment_details,
update_payment_record,
)
from frappe.email.doctype.email_template.email_template import get_email_template
@@ -26,6 +27,7 @@ class LMSBatch(Document):
self.validate_batch_end_date()
self.validate_duplicate_courses()
self.validate_duplicate_students()
self.validate_payments_app()
self.validate_duplicate_assessments()
self.validate_membership()
self.validate_timetable()
@@ -55,6 +57,12 @@ class LMSBatch(Document):
_("Course {0} has already been added to this batch.").format(frappe.bold(title))
)
def validate_payments_app(self):
if self.paid_batch:
installed_apps = frappe.get_installed_apps()
if "payments" not in installed_apps:
frappe.throw(_("Please install the Payments app to create a paid batches."))
def validate_duplicate_assessments(self):
assessments = [row.assessment_name for row in self.assessment]
for assessment in self.assessment:
@@ -165,64 +173,8 @@ class LMSBatch(Document):
)
def on_payment_authorized(self, payment_status):
if payment_status == "Authorized":
self.update_payment_record()
def update_payment_record(self):
request = frappe.get_all(
"Integration Request",
{
"reference_doctype": self.doctype,
"reference_docname": self.name,
"owner": frappe.session.user,
},
order_by="creation desc",
limit=1,
)
if len(request):
data = frappe.db.get_value("Integration Request", request[0].name, "data")
data = frappe._dict(json.loads(data))
payment_gateway = data.get("payment_gateway")
frappe.db.set_value(
"LMS Payment",
data.payment,
{
"payment_received": 1,
"payment_id": data[f"{payment_gateway.lower()}_payment_id"],
"order_id": data["order_id"],
},
)
try:
enroll_in_batch(data.payment, self)
except Exception as e:
frappe.log_error(frappe.get_traceback(), _("Enrollment Failed"))
def enroll_in_batch(payment_name, batch):
if not frappe.db.exists(
"Batch Student", {"parent": batch.name, "student": frappe.session.user}
):
student = frappe.new_doc("Batch Student")
current_count = frappe.db.count("Batch Student", {"parent": batch.name})
payment = frappe.db.get_value(
"LMS Payment", payment_name, ["name", "source"], as_dict=True
)
student.update(
{
"student": frappe.session.user,
"payment": payment.name,
"source": payment.source,
"parent": batch.name,
"parenttype": "LMS Batch",
"parentfield": "students",
"idx": current_count + 1,
}
)
student.save(ignore_permissions=True)
if payment_status in ["Authorized", "Completed"]:
update_payment_record("LMS Batch", self.name)
@frappe.whitelist()

View File

@@ -8,7 +8,7 @@ from frappe.model.document import Document
from frappe.utils import cint, today
from frappe.utils.telemetry import capture
from lms.lms.utils import get_chapters, can_create_courses
from ...utils import generate_slug, validate_image
from ...utils import generate_slug, validate_image, update_payment_record
from frappe import _
@@ -18,6 +18,7 @@ class LMSCourse(Document):
self.validate_instructors()
self.validate_video_link()
self.validate_status()
self.validate_payments_app()
self.image = validate_image(self.image)
def validate_published(self):
@@ -44,10 +45,20 @@ class LMSCourse(Document):
if self.published:
self.status = "Approved"
def validate_payments_app(self):
if self.paid_course:
installed_apps = frappe.get_installed_apps()
if "payments" not in installed_apps:
frappe.throw(_("Please install the Payments app to create a paid courses."))
def on_update(self):
if not self.upcoming and self.has_value_changed("upcoming"):
self.send_email_to_interested_users()
def on_payment_authorized(self, payment_status):
if payment_status in ["Authorized", "Completed"]:
update_payment_record("LMS Course", self.name)
def send_email_to_interested_users(self):
interested_users = frappe.get_all(
"LMS Course Interest", {"course": self.name}, ["name", "user"]

View File

@@ -43,14 +43,12 @@
"payment_settings_tab",
"payment_section",
"payment_gateway",
"razorpay_key",
"razorpay_secret",
"apply_gst",
"column_break_cfcv",
"default_currency",
"exception_country",
"column_break_cfcv",
"apply_gst",
"show_usd_equivalent",
"apply_rounding",
"exception_country",
"email_templates_tab",
"certification_template",
"batch_confirmation_template",
@@ -148,16 +146,6 @@
"fieldname": "column_break_cfcv",
"fieldtype": "Column Break"
},
{
"fieldname": "razorpay_key",
"fieldtype": "Data",
"label": "Razorpay Key"
},
{
"fieldname": "razorpay_secret",
"fieldtype": "Password",
"label": "Razorpay Secret"
},
{
"default": "0",
"fieldname": "apply_gst",
@@ -174,7 +162,7 @@
"depends_on": "show_usd_equivalent",
"fieldname": "exception_country",
"fieldtype": "Table MultiSelect",
"label": "Maintain Original Currency",
"label": "Primary Countries",
"options": "Payment Country"
},
{
@@ -343,7 +331,7 @@
"index_web_pages_for_search": 1,
"issingle": 1,
"links": [],
"modified": "2024-09-24 19:55:47.914930",
"modified": "2024-09-30 18:30:28.689084",
"modified_by": "Administrator",
"module": "LMS",
"name": "LMS Settings",

View File

@@ -16,7 +16,7 @@ def validate_currency(payment_gateway, currency):
@frappe.whitelist()
def get_payment_link(doctype, docname, amount, total_amount, currency, address):
def get_payment_link(doctype, docname, title, amount, total_amount, currency, address):
payment_gateway = get_payment_gateway()
address = frappe._dict(address)
amount_with_gst = total_amount if total_amount != amount else 0
@@ -24,26 +24,24 @@ def get_payment_link(doctype, docname, amount, total_amount, currency, address):
payment = record_payment(address, doctype, docname, amount, currency, amount_with_gst)
controller = get_controller(payment_gateway)
if controller.doctype == "Stripe Settings":
print(controller.as_dict())
doctype = "Stripe Settings"
docname = controller.name
if doctype == "LMS Course":
redirect_to = f"/lms/courses/{docname}/learn/1-1"
elif doctype == "LMS Batch":
redirect_to = f"/lms/batches/{docname}"
payment_details = {
"amount": total_amount,
"title": f"Payment for {doctype} {docname}",
"description": f"{address.billing_name}'s payment for {doctype} {docname}",
"title": f"Payment for {doctype} {title} {docname}",
"description": f"{address.billing_name}'s payment for {title}",
"reference_doctype": doctype,
"reference_docname": docname,
"payer_email": frappe.session.user,
"payer_name": address.billing_name,
"order_id": docname,
"currency": currency,
"payment_gateway": payment_gateway,
"redirect_to": f"/lms/batches/{docname}",
"redirect_to": redirect_to,
"payment": payment.name,
}
print(controller)
url = controller.get_payment_url(**payment_details)
return url

View File

@@ -1682,12 +1682,10 @@ def get_order_summary(doctype, docname, country=None):
)
details.original_amount = details.amount
details.original_amount_formatted = fmt_money(details.amount, 0, details.currency)
print(details.currency)
if details.currency == "INR":
print("inside")
details.amount, details.gst_applied = apply_gst(details.amount)
details.amount, details.gst_applied = apply_gst(details.amount, country)
details.gst_amount_formatted = fmt_money(details.gst_applied, 0, details.currency)
print(details.amount, details.gst_applied, details.gst_amount_formatted)
details.total_amount_formatted = fmt_money(details.amount, 0, details.currency)
return details
@@ -1744,3 +1742,89 @@ def publish_notifications(doc, method):
frappe.publish_realtime(
"publish_lms_notifications", user=doc.for_user, after_commit=True
)
def update_payment_record(doctype, docname):
request = frappe.get_all(
"Integration Request",
{
"reference_doctype": doctype,
"reference_docname": docname,
"owner": frappe.session.user,
},
order_by="creation desc",
limit=1,
)
if len(request):
data = frappe.db.get_value("Integration Request", request[0].name, "data")
data = frappe._dict(json.loads(data))
payment_gateway = data.get("payment_gateway")
if payment_gateway == "Razorpay":
payment_id = "razorpay_payment_id"
elif "Stripe" in payment_gateway:
payment_id = "stripe_token_id"
else:
payment_id = "order_id"
frappe.db.set_value(
"LMS Payment",
data.payment,
{
"payment_received": 1,
"payment_id": data.get(payment_id),
"order_id": data.get("order_id"),
},
)
try:
if doctype == "LMS Course":
enroll_in_course(data.payment, docname)
else:
enroll_in_batch(data.payment, docname)
except Exception as e:
frappe.log_error(frappe.get_traceback(), _("Enrollment Failed"))
def enroll_in_course(payment_name, course):
if not frappe.db.exists(
"LMS Enrollment", {"member": frappe.session.user, "course": course}
):
enrollment = frappe.new_doc("LMS Enrollment")
payment = frappe.db.get_value(
"LMS Payment", payment_name, ["name", "source"], as_dict=True
)
enrollment.update(
{
"member": frappe.session.user,
"course": course,
"payment": payment.name,
}
)
enrollment.save(ignore_permissions=True)
def enroll_in_batch(payment_name, batch):
if not frappe.db.exists(
"Batch Student", {"parent": batch, "student": frappe.session.user}
):
student = frappe.new_doc("Batch Student")
current_count = frappe.db.count("Batch Student", {"parent": batch})
payment = frappe.db.get_value(
"LMS Payment", payment_name, ["name", "source"], as_dict=True
)
student.update(
{
"student": frappe.session.user,
"payment": payment.name,
"source": payment.source,
"parent": batch,
"parenttype": "LMS Batch",
"parentfield": "students",
"idx": current_count + 1,
}
)
student.save(ignore_permissions=True)