From 692d4232b8afe74e29296c191f2c02d3841f4698 Mon Sep 17 00:00:00 2001 From: phot0n Date: Mon, 25 Jul 2022 00:19:06 +0530 Subject: [PATCH] feat: add payment webform override --- payments/overrides/__init__.py | 0 payments/overrides/payment_webform.py | 47 +++++++++++++++++++++++++++ payments/payment_gateways/__init__.py | 0 3 files changed, 47 insertions(+) create mode 100644 payments/overrides/__init__.py create mode 100644 payments/overrides/payment_webform.py create mode 100644 payments/payment_gateways/__init__.py diff --git a/payments/overrides/__init__.py b/payments/overrides/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/payments/overrides/payment_webform.py b/payments/overrides/payment_webform.py new file mode 100644 index 0000000..d9149e2 --- /dev/null +++ b/payments/overrides/payment_webform.py @@ -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) diff --git a/payments/payment_gateways/__init__.py b/payments/payment_gateways/__init__.py new file mode 100644 index 0000000..e69de29