Sign up customer for autopay? feature when manual payment is ran. Version 1
This commit is contained in:
@@ -160,6 +160,59 @@ def run_token_payment(invoice, token):
|
|||||||
return {"success": False, "error": result.get("responsetext", ["Error"])[0]}
|
return {"success": False, "error": result.get("responsetext", ["Error"])[0]}
|
||||||
|
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def save_to_autopay(customer, token):
|
||||||
|
import requests
|
||||||
|
import urllib.parse
|
||||||
|
|
||||||
|
inv_customer = frappe.get_doc("Customer", customer)
|
||||||
|
|
||||||
|
customer_name = (inv_customer.customer_name or "Customer").strip()
|
||||||
|
|
||||||
|
if " " in customer_name:
|
||||||
|
first_name, last_name = customer_name.split(" ", 1)
|
||||||
|
else:
|
||||||
|
first_name = customer_name
|
||||||
|
last_name = "."
|
||||||
|
|
||||||
|
data = {
|
||||||
|
"security_key": frappe.conf.get("nmi_security_key"),
|
||||||
|
"type": "add_customer",
|
||||||
|
"payment_token": token,
|
||||||
|
|
||||||
|
"first_name": first_name,
|
||||||
|
"last_name": last_name,
|
||||||
|
"customer_vault": "add_customer"
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = requests.post(
|
||||||
|
"https://secure.nmi.com/api/transact.php",
|
||||||
|
data=data,
|
||||||
|
timeout=30
|
||||||
|
)
|
||||||
|
|
||||||
|
result = urllib.parse.parse_qs(response.text)
|
||||||
|
|
||||||
|
success = result.get("response", ["0"])[0]
|
||||||
|
vault_id = result.get("customer_vault_id", [""])[0]
|
||||||
|
message = result.get("responsetext", ["Failed"])[0]
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
frappe.log_error(frappe.get_traceback(), "NMI Vault Error")
|
||||||
|
return {"success": False, "error": "Vault request failed"}
|
||||||
|
|
||||||
|
if success == "1" and vault_id:
|
||||||
|
# Save to customer
|
||||||
|
inv_customer.custom_auto_pay_id = vault_id
|
||||||
|
inv_customer.custom_auto_pay_status = 1
|
||||||
|
inv_customer.save(ignore_permissions=True)
|
||||||
|
|
||||||
|
return {"success": True}
|
||||||
|
|
||||||
|
return {"success": False, "error": message}
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist(allow_guest=True)
|
@frappe.whitelist(allow_guest=True)
|
||||||
def crystalclear_webhook():
|
def crystalclear_webhook():
|
||||||
data = frappe.local.form_dict
|
data = frappe.local.form_dict
|
||||||
|
|||||||
@@ -225,15 +225,43 @@ function run_token_payment(frm, token, dialog) {
|
|||||||
token: token
|
token: token
|
||||||
},
|
},
|
||||||
callback(r) {
|
callback(r) {
|
||||||
if (r.message?.success) {
|
if (r.message?.success) {
|
||||||
|
|
||||||
|
frappe.confirm(
|
||||||
|
"Payment successful. Save this card for AutoPay?",
|
||||||
|
() => {
|
||||||
|
// YES → save to vault
|
||||||
|
frappe.call({
|
||||||
|
method: "ns_app.api.payments.save_to_autopay",
|
||||||
|
args: {
|
||||||
|
customer: frm.doc.customer,
|
||||||
|
token: token
|
||||||
|
},
|
||||||
|
callback(res) {
|
||||||
|
if (res.message?.success) {
|
||||||
|
frappe.show_alert({
|
||||||
|
message: "AutoPay enabled",
|
||||||
|
indicator: "green"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
frappe.msgprint(res.message?.error || "Failed to save AutoPay");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
// NO
|
||||||
|
frappe.show_alert({
|
||||||
|
message: "Payment completed (not saved)",
|
||||||
|
indicator: "blue"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
dialog.hide();
|
dialog.hide();
|
||||||
frm.reload_doc();
|
frm.reload_doc();
|
||||||
|
}
|
||||||
frappe.show_alert({
|
else {
|
||||||
message: "Payment successful",
|
|
||||||
indicator: "green"
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
frappe.msgprint(r.message?.error || "Payment failed");
|
frappe.msgprint(r.message?.error || "Payment failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user