203 lines
5.5 KiB
Python
203 lines
5.5 KiB
Python
import frappe
|
|
from payments.utils import get_payment_gateway_controller
|
|
|
|
|
|
def get_payment_gateway_for_event(event: str):
|
|
return frappe.get_cached_value("Pohodex Event Manager Event", event, "payment_gateway")
|
|
|
|
|
|
def get_payment_gateways_for_event(event: str) -> list[str]:
|
|
"""Get all payment gateways configured for an event."""
|
|
gateways = frappe.get_all(
|
|
"Event Payment Gateway",
|
|
filters={"parent": event, "parenttype": "Pohodex Event Manager Event"},
|
|
pluck="payment_gateway",
|
|
)
|
|
if not gateways:
|
|
# Fallback to legacy field
|
|
legacy = frappe.get_cached_value("Pohodex Event Manager Event", event, "payment_gateway")
|
|
return [legacy] if legacy else []
|
|
return gateways
|
|
|
|
|
|
def get_controller(payment_gateway):
|
|
return get_payment_gateway_controller(payment_gateway)
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_payment_link_for_booking(
|
|
booking_id: str, redirect_to: str = "/events", payment_gateway: str | None = None
|
|
) -> str:
|
|
booking_doc = frappe.get_cached_doc("Event Booking", booking_id)
|
|
event_title = frappe.get_cached_value("Pohodex Event Manager Event", booking_doc.event, "title")
|
|
if not payment_gateway:
|
|
gateways = get_payment_gateways_for_event(booking_doc.event)
|
|
if not gateways:
|
|
frappe.throw("No payment gateway configured for this event")
|
|
payment_gateway = gateways[0]
|
|
return get_payment_link(
|
|
"Event Booking",
|
|
booking_id,
|
|
booking_doc.total_amount,
|
|
booking_doc.currency,
|
|
payment_gateway,
|
|
redirect_to=redirect_to,
|
|
title=f"Payment for {event_title}",
|
|
)
|
|
|
|
|
|
@frappe.whitelist()
|
|
def get_payment_link_for_sponsorship(
|
|
sponsorship_enquiry: str,
|
|
sponsorship_tier: str,
|
|
redirect_to: str = "/events",
|
|
payment_gateway: str | None = None,
|
|
) -> str:
|
|
tier_doc = frappe.get_cached_doc("Sponsorship Tier", sponsorship_tier)
|
|
if not payment_gateway:
|
|
gateways = get_payment_gateways_for_event(tier_doc.event)
|
|
if not gateways:
|
|
frappe.throw("No payment gateway configured for this event")
|
|
payment_gateway = gateways[0]
|
|
event_title = frappe.get_cached_value("Pohodex Event Manager Event", tier_doc.event, "title")
|
|
frappe.db.set_value(
|
|
"Sponsorship Enquiry", sponsorship_enquiry, "tier", sponsorship_tier
|
|
) # TODO: rethink later
|
|
|
|
return get_payment_link(
|
|
"Sponsorship Enquiry",
|
|
sponsorship_enquiry,
|
|
tier_doc.price,
|
|
tier_doc.currency,
|
|
payment_gateway,
|
|
redirect_to,
|
|
f"Payment for {tier_doc.title} Sponsorship at {event_title}",
|
|
)
|
|
|
|
|
|
def get_payment_link(
|
|
reference_doctype: str,
|
|
reference_docname: str,
|
|
amount: float,
|
|
currency: str,
|
|
payment_gateway: str,
|
|
redirect_to: str = "/events",
|
|
title: str | None = None,
|
|
) -> str:
|
|
payment = record_payment(reference_doctype, reference_docname, amount, currency, payment_gateway)
|
|
controller = get_controller(payment_gateway)
|
|
user_full_name = frappe.get_cached_value("User", frappe.session.user, "full_name")
|
|
|
|
payment_details = {
|
|
"amount": amount,
|
|
"title": title or f"Payment for {reference_doctype}: {reference_docname}",
|
|
"description": f"{user_full_name}'s payment for {reference_doctype} (#{reference_docname})",
|
|
"reference_doctype": reference_doctype,
|
|
"reference_docname": reference_docname,
|
|
"payer_email": frappe.session.user,
|
|
"payer_name": user_full_name,
|
|
"currency": currency,
|
|
"payment_gateway": payment_gateway,
|
|
"redirect_to": redirect_to,
|
|
"payment": payment.name,
|
|
}
|
|
if payment_gateway == "Razorpay" or payment_gateway == "Paymob":
|
|
order = controller.create_order(**payment_details)
|
|
payment_details.update({"order_id": order.get("id")})
|
|
|
|
url = controller.get_payment_url(**payment_details)
|
|
|
|
return url
|
|
|
|
|
|
def record_payment(
|
|
reference_doctype: str,
|
|
reference_docname: str,
|
|
amount: float,
|
|
currency: str,
|
|
payment_gateway: str | None = None,
|
|
):
|
|
payment_doc = frappe.new_doc("Event Payment")
|
|
payment_doc.update(
|
|
{
|
|
"user": frappe.session.user,
|
|
"amount": amount,
|
|
"currency": currency,
|
|
"reference_doctype": reference_doctype,
|
|
"reference_docname": reference_docname,
|
|
"payment_gateway": payment_gateway,
|
|
}
|
|
)
|
|
payment_doc.save(ignore_permissions=True)
|
|
return payment_doc
|
|
|
|
|
|
def mark_payment_as_received(reference_doctype: str, reference_docname: str):
|
|
if frappe.in_test:
|
|
return
|
|
|
|
import json
|
|
|
|
request = frappe.get_all(
|
|
"Integration Request",
|
|
{
|
|
"reference_doctype": reference_doctype,
|
|
"reference_docname": reference_docname,
|
|
},
|
|
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 payment_gateway == "Paymob":
|
|
payment_id = "paymob_payment_id"
|
|
|
|
elif payment_gateway == "PayPal":
|
|
payment_id = "transaction_id"
|
|
|
|
elif "Stripe" in payment_gateway:
|
|
payment_id = "stripe_token_id"
|
|
else:
|
|
payment_id = "order_id"
|
|
|
|
frappe.db.set_value(
|
|
"Event Payment",
|
|
data.payment,
|
|
{
|
|
"payment_received": 1,
|
|
"payment_id": data.get(payment_id),
|
|
"order_id": data.get("order_id"),
|
|
},
|
|
)
|
|
|
|
frappe.db.commit()
|
|
|
|
|
|
# TODO: use it later!
|
|
def save_address(address):
|
|
filters = {"email_id": frappe.session.user}
|
|
exists = frappe.db.exists("Address", filters)
|
|
if exists:
|
|
address_doc = frappe.get_last_doc("Address", filters=filters)
|
|
else:
|
|
address_doc = frappe.new_doc("Address")
|
|
|
|
address_doc.update(address)
|
|
address_doc.update(
|
|
{
|
|
"address_title": frappe.db.get_value("User", frappe.session.user, "full_name"),
|
|
"address_type": "Billing",
|
|
"is_primary_address": 1,
|
|
"email_id": frappe.session.user,
|
|
}
|
|
)
|
|
address_doc.save(ignore_permissions=True)
|
|
return address_doc.name
|