25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

48 lines
1.5 KiB

  1. import frappe
  2. from frappe.website.doctype.web_form.web_form import WebForm
  3. from payments.utils import get_payment_gateway_controller
  4. class PaymentWebForm(WebForm):
  5. def validate(self):
  6. super().validate()
  7. if getattr(self, "accept_payment", False):
  8. self.validate_payment_amount()
  9. def validate_payment_amount(self):
  10. if self.amount_based_on_field and not self.amount_field:
  11. frappe.throw(frappe._("Please select a Amount Field."))
  12. elif not self.amount_based_on_field and not self.amount > 0:
  13. frappe.throw(frappe._("Amount must be greater than 0."))
  14. def get_payment_gateway_url(self, doc):
  15. if getattr(self, "accept_payment", False):
  16. controller = get_payment_gateway_controller(self.payment_gateway)
  17. title = "Payment for {0} {1}".format(doc.doctype, doc.name)
  18. amount = self.amount
  19. if self.amount_based_on_field:
  20. amount = doc.get(self.amount_field)
  21. from decimal import Decimal
  22. if amount is None or Decimal(amount) <= 0:
  23. return frappe.utils.get_url(self.success_url or self.route)
  24. payment_details = {
  25. "amount": amount,
  26. "title": title,
  27. "description": title,
  28. "reference_doctype": doc.doctype,
  29. "reference_docname": doc.name,
  30. "payer_email": frappe.session.user,
  31. "payer_name": frappe.utils.get_fullname(frappe.session.user),
  32. "order_id": doc.name,
  33. "currency": self.currency,
  34. "redirect_to": frappe.utils.get_url(self.success_url or self.route)
  35. }
  36. # Redirect the user to this url
  37. return controller.get_payment_url(**payment_details)