|
|
@@ -0,0 +1,47 @@ |
|
|
|
import frappe |
|
|
|
from frappe.website.doctype.web_form.web_form import WebForm |
|
|
|
|
|
|
|
from payments.utils import get_payment_gateway_controller |
|
|
|
|
|
|
|
|
|
|
|
class PaymentWebForm(WebForm): |
|
|
|
def validate(self): |
|
|
|
super().validate() |
|
|
|
|
|
|
|
if getattr(self, "accept_payment", False): |
|
|
|
self.validate_payment_amount() |
|
|
|
|
|
|
|
def validate_payment_amount(self): |
|
|
|
if self.amount_based_on_field and not self.amount_field: |
|
|
|
frappe.throw(frappe._("Please select a Amount Field.")) |
|
|
|
elif not self.amount_based_on_field and not self.amount > 0: |
|
|
|
frappe.throw(frappe._("Amount must be greater than 0.")) |
|
|
|
|
|
|
|
def get_payment_gateway_url(self, doc): |
|
|
|
if getattr(self, "accept_payment", False): |
|
|
|
controller = get_payment_gateway_controller(self.payment_gateway) |
|
|
|
|
|
|
|
title = "Payment for {0} {1}".format(doc.doctype, doc.name) |
|
|
|
amount = self.amount |
|
|
|
if self.amount_based_on_field: |
|
|
|
amount = doc.get(self.amount_field) |
|
|
|
|
|
|
|
from decimal import Decimal |
|
|
|
if amount is None or Decimal(amount) <= 0: |
|
|
|
return frappe.utils.get_url(self.success_url or self.route) |
|
|
|
|
|
|
|
payment_details = { |
|
|
|
"amount": amount, |
|
|
|
"title": title, |
|
|
|
"description": title, |
|
|
|
"reference_doctype": doc.doctype, |
|
|
|
"reference_docname": doc.name, |
|
|
|
"payer_email": frappe.session.user, |
|
|
|
"payer_name": frappe.utils.get_fullname(frappe.session.user), |
|
|
|
"order_id": doc.name, |
|
|
|
"currency": self.currency, |
|
|
|
"redirect_to": frappe.utils.get_url(self.success_url or self.route) |
|
|
|
} |
|
|
|
|
|
|
|
# Redirect the user to this url |
|
|
|
return controller.get_payment_url(**payment_details) |