94 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors
 | |
| # License: GNU General Public License v3. See license.txt
 | |
| 
 | |
| import frappe
 | |
| from frappe import _
 | |
| 
 | |
| from erpnext.erpnext_integrations.doctype.gocardless_settings.gocardless_settings import (
 | |
| 	get_gateway_controller,
 | |
| 	gocardless_initialization,
 | |
| )
 | |
| 
 | |
| no_cache = 1
 | |
| 
 | |
| expected_keys = ('redirect_flow_id', 'reference_doctype', 'reference_docname')
 | |
| 
 | |
| def get_context(context):
 | |
| 	context.no_cache = 1
 | |
| 
 | |
| 	# all these keys exist in form_dict
 | |
| 	if not (set(expected_keys) - set(frappe.form_dict.keys())):
 | |
| 		for key in expected_keys:
 | |
| 			context[key] = frappe.form_dict[key]
 | |
| 
 | |
| 	else:
 | |
| 		frappe.redirect_to_message(_('Some information is missing'),
 | |
| 			_('Looks like someone sent you to an incomplete URL. Please ask them to look into it.'))
 | |
| 		frappe.local.flags.redirect_location = frappe.local.response.location
 | |
| 		raise frappe.Redirect
 | |
| 
 | |
| @frappe.whitelist(allow_guest=True)
 | |
| def confirm_payment(redirect_flow_id, reference_doctype, reference_docname):
 | |
| 
 | |
| 	client = gocardless_initialization(reference_docname)
 | |
| 
 | |
| 	try:
 | |
| 		redirect_flow = client.redirect_flows.complete(
 | |
| 			redirect_flow_id,
 | |
| 			params={
 | |
| 				"session_token": frappe.session.user
 | |
| 		})
 | |
| 
 | |
| 		confirmation_url = redirect_flow.confirmation_url
 | |
| 		gocardless_success_page = frappe.get_hooks('gocardless_success_page')
 | |
| 		if gocardless_success_page:
 | |
| 			confirmation_url = frappe.get_attr(gocardless_success_page[-1])(reference_doctype, reference_docname)
 | |
| 
 | |
| 		data = {
 | |
| 			"mandate": redirect_flow.links.mandate,
 | |
| 			"customer": redirect_flow.links.customer,
 | |
| 			"redirect_to": confirmation_url,
 | |
| 			"redirect_message": "Mandate successfully created",
 | |
| 			"reference_doctype": reference_doctype,
 | |
| 			"reference_docname": reference_docname
 | |
| 		}
 | |
| 
 | |
| 		try:
 | |
| 			create_mandate(data)
 | |
| 		except Exception as e:
 | |
| 			frappe.log_error(e, "GoCardless Mandate Registration Error")
 | |
| 
 | |
| 		gateway_controller = get_gateway_controller(reference_docname)
 | |
| 		frappe.get_doc("GoCardless Settings", gateway_controller).create_payment_request(data)
 | |
| 
 | |
| 		return {"redirect_to": confirmation_url}
 | |
| 
 | |
| 	except Exception as e:
 | |
| 		frappe.log_error(e, "GoCardless Payment Error")
 | |
| 		return {"redirect_to": '/integrations/payment-failed'}
 | |
| 
 | |
| 
 | |
| def create_mandate(data):
 | |
| 	data = frappe._dict(data)
 | |
| 	frappe.logger().debug(data)
 | |
| 
 | |
| 	mandate = data.get('mandate')
 | |
| 
 | |
| 	if frappe.db.exists("GoCardless Mandate", mandate):
 | |
| 		return
 | |
| 
 | |
| 	else:
 | |
| 		reference_doc = frappe.db.get_value(data.get('reference_doctype'), data.get('reference_docname'), ["reference_doctype", "reference_name"], as_dict=1)
 | |
| 		erpnext_customer = frappe.db.get_value(reference_doc.reference_doctype, reference_doc.reference_name, ["customer_name"], as_dict=1)
 | |
| 
 | |
| 		try:
 | |
| 			frappe.get_doc({
 | |
| 			"doctype": "GoCardless Mandate",
 | |
| 			"mandate": mandate,
 | |
| 			"customer": erpnext_customer.customer_name,
 | |
| 			"gocardless_customer": data.get('customer')
 | |
| 			}).insert(ignore_permissions=True)
 | |
| 
 | |
| 		except Exception:
 | |
| 			frappe.log_error(frappe.get_traceback())
 |