def make_payment_request(**args): """Make payment request""" args = frappe._dict(args) ref_doc = frappe.get_doc(args.dt, args.dn) gateway_account = get_gateway_details(args) or frappe._dict() grand_total = get_amount(ref_doc, gateway_account.get("payment_account")) if args.loyalty_points and args.dt == "Sales Order": from erpnext.accounts.doctype.loyalty_program.loyalty_program import ( validate_loyalty_points, ) loyalty_amount = validate_loyalty_points(ref_doc, int(args.loyalty_points)) frappe.db.set_value( "Sales Order", args.dn, "loyalty_points", int(args.loyalty_points), update_modified=False, ) frappe.db.set_value( "Sales Order", args.dn, "loyalty_amount", loyalty_amount, update_modified=False, ) grand_total = grand_total - loyalty_amount bank_account = ( get_party_bank_account(args.get("party_type"), args.get("party")) if args.get("party_type") else "" ) existing_payment_request = None if args.order_type == "Shopping Cart": existing_payment_request = frappe.db.get_value( "Payment Request", { "reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ("!=", 2), }, ) if existing_payment_request: frappe.db.set_value( "Payment Request", existing_payment_request, "grand_total", grand_total, update_modified=False, ) pr = frappe.get_doc("Payment Request", existing_payment_request) else: if args.order_type != "Shopping Cart": existing_payment_request_amount = get_existing_payment_request_amount( args.dt, args.dn ) if existing_payment_request_amount: grand_total -= existing_payment_request_amount pr = frappe.new_doc("Payment Request") pr.update( { "payment_gateway_account": gateway_account.get("name"), "payment_gateway": gateway_account.get("payment_gateway"), "payment_account": gateway_account.get("payment_account"), "payment_channel": gateway_account.get("payment_channel"), "payment_request_type": args.get("payment_request_type"), "currency": ref_doc.currency, "grand_total": grand_total, "mode_of_payment": args.mode_of_payment, "email_to": args.recipient_id or ref_doc.owner, "subject": _("Payment Request for {0}").format(args.dn), "message": gateway_account.get("message") or get_dummy_message(ref_doc), "reference_doctype": args.dt, "reference_name": args.dn, "party_type": args.get("party_type") or "Customer", "party": args.get("party") or ref_doc.get("customer"), "bank_account": bank_account, } ) if args.order_type == "Shopping Cart" or args.mute_email: pr.flags.mute_email = True pr.insert(ignore_permissions=True) if args.submit_doc: pr.submit() if args.order_type == "Shopping Cart": frappe.db.commit() frappe.local.response["type"] = "redirect" frappe.local.response["location"] = pr.get_payment_url() if args.return_doc: return pr return pr.as_dict()
def make_payment_request(**args): """Opens API to frontend for generating a payment request""" args = frappe._dict(args) #collect details on the document against which a payment request is going to be generated, along with amount ref_doc = frappe.get_doc(args.dt, args.dn) grand_total = get_amount(ref_doc) #collect details of loyalty points, if any if args.loyalty_points and args.dt == "Sales Order": from erpnext.accounts.doctype.loyalty_program.loyalty_program import validate_loyalty_points loyalty_amount = validate_loyalty_points(ref_doc, int(args.loyalty_points)) frappe.db.set_value(args.dt, args.dn, "loyalty_points", int(args.loyalty_points), update_modified=False) frappe.db.set_value(args.dt, args.dn, "loyalty_amount", loyalty_amount, update_modified=False) grand_total = grand_total - loyalty_amount #get details of the payment gateway and account from which the payment is going to be made gateway_account = get_gateway_details(args) or frappe._dict() bank_account = (get_party_bank_account(args.get('party_type'), args.get('party')) if args.get('party_type') else '') existing_payment_request = None #collect details of any existing payment requests made if the order originates from a shopping cart if args.order_type == "Shopping Cart": existing_payment_request = frappe.db.get_value( "Payment Request", { "reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ("!=", 2) }) #update payment details if the payment request already exists if existing_payment_request: frappe.db.set_value("Payment Request", existing_payment_request, "grand_total", grand_total, update_modified=False) frappe.db.set_value("Payment Request", existing_payment_request, "payment_gateway", gateway_account.payment_gateway, update_modified=False) frappe.db.set_value("Payment Request", existing_payment_request, "payment_gateway_account", gateway_account.name, update_modified=False) frappe.db.set_value("Payment Request", existing_payment_request, "payment_account", gateway_account.payment_account, update_modified=False) pr = frappe.get_doc("Payment Request", existing_payment_request) else: #get remaining payment amount if order not originating from a shopping cart if args.order_type != "Shopping Cart": existing_payment_request_amount = \ get_existing_payment_request_amount(args.dt, args.dn) if existing_payment_request_amount: grand_total -= existing_payment_request_amount #create a new payment request pr = frappe.new_doc("Payment Request") pr.update({ "payment_gateway_account": gateway_account.get("name"), "payment_gateway": gateway_account.get("payment_gateway"), "payment_account": gateway_account.get("payment_account"), "payment_request_type": args.get("payment_request_type"), "currency": ref_doc.currency, "grand_total": grand_total, "email_to": args.recipient_id or ref_doc.owner, "subject": _("Payment Request for {0}").format(args.dn), "message": gateway_account.get("message") or get_dummy_message(ref_doc), "reference_doctype": args.dt, "reference_name": args.dn, "party_type": args.get("party_type") or "Customer", "party": args.get("party") or ref_doc.get("customer"), "bank_account": bank_account }) #mute emails if the order originates in a shopping cart if args.order_type == "Shopping Cart" or args.mute_email: pr.flags.mute_email = True if args.submit_doc: pr.insert(ignore_permissions=True) pr.submit() #redirect to a payment url if the order is from a shopping cart if args.order_type == "Shopping Cart": frappe.db.commit() frappe.local.response["type"] = "redirect" frappe.local.response["location"] = pr.get_payment_url() if args.return_doc: return pr return pr.as_dict()
def make_payment_request(**args): """Make payment request""" args = frappe._dict(args) ref_doc = frappe.get_doc(args.dt, args.dn) grand_total = get_amount(ref_doc, args.dt) if args.loyalty_points and args.dt == "Sales Order": from erpnext.accounts.doctype.loyalty_program.loyalty_program import validate_loyalty_points loyalty_amount = validate_loyalty_points(ref_doc, int(args.loyalty_points)) frappe.db.set_value("Sales Order", args.dn, "loyalty_points", int(args.loyalty_points), update_modified=False) frappe.db.set_value("Sales Order", args.dn, "loyalty_amount", loyalty_amount, update_modified=False) grand_total = grand_total - loyalty_amount gateway_account = get_gateway_details(args) or frappe._dict() existing_payment_request = frappe.db.get_value("Payment Request", {"reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ["!=", 2]}) bank_account = (get_party_bank_account(args.get('party_type'), args.get('party')) if args.get('party_type') else '') if existing_payment_request: frappe.db.set_value("Payment Request", existing_payment_request, "grand_total", grand_total, update_modified=False) pr = frappe.get_doc("Payment Request", existing_payment_request) else: pr = frappe.new_doc("Payment Request") pr.update({ "payment_gateway_account": gateway_account.get("name"), "payment_gateway": gateway_account.get("payment_gateway"), "payment_account": gateway_account.get("payment_account"), "payment_request_type": args.get("payment_request_type"), "currency": ref_doc.currency, "grand_total": grand_total, "email_to": args.recipient_id or "", "subject": _("Payment Request for {0}").format(args.dn), "message": gateway_account.get("message") or get_dummy_message(ref_doc), "reference_doctype": args.dt, "reference_name": args.dn, "party_type": args.get("party_type"), "party": args.get("party"), "bank_account": bank_account }) if args.order_type == "Shopping Cart" or args.mute_email: pr.flags.mute_email = True if args.submit_doc: pr.insert(ignore_permissions=True) pr.submit() if args.order_type == "Shopping Cart": frappe.db.commit() frappe.local.response["type"] = "redirect" frappe.local.response["location"] = pr.get_payment_url() if args.return_doc: return pr return pr.as_dict()
def make_payment_request(**args): """Make payment request""" args = frappe._dict(args) ref_doc = frappe.get_doc(args.dt, args.dn) grand_total = get_amount(ref_doc, args.dt) if args.loyalty_points and args.dt == "Sales Order": from erpnext.accounts.doctype.loyalty_program.loyalty_program import validate_loyalty_points loyalty_amount = validate_loyalty_points(ref_doc, int(args.loyalty_points)) frappe.db.set_value("Sales Order", args.dn, "loyalty_points", int(args.loyalty_points), update_modified=False) frappe.db.set_value("Sales Order", args.dn, "loyalty_amount", loyalty_amount, update_modified=False) grand_total = grand_total - loyalty_amount gateway_account = get_gateway_details(args) or frappe._dict() grand_total = get_amount(ref_doc, args.doctype) outstanding_amount, payments_summary = get_outstanding_amount( ref_doc, args.doctype) total_advance = flt(grand_total) - flt(outstanding_amount) existing_payment_request = frappe.db.get_value( "Payment Request", { "reference_doctype": args.dt, "reference_name": args.dn, "docstatus": ["!=", 2] }) bank_account = (get_party_bank_account(args.get('party_type'), args.get('party')) if args.get('party_type') else '') if existing_payment_request: frappe.db.set_value("Payment Request", existing_payment_request, "grand_total", grand_total, update_modified=False) pr = frappe.get_doc("Payment Request", existing_payment_request) else: pr = frappe.new_doc("Payment Request") in_words = money_in_words(outstanding_amount, ref_doc.currency) pr.update({ "payment_gateway_account": gateway_account.get("name"), "payment_gateway": gateway_account.get("payment_gateway"), "payment_account": gateway_account.get("payment_account"), "payment_request_type": args.get("payment_request_type"), "currency": ref_doc.currency, "grand_total": grand_total, "email_to": args.recipient_id or "", "subject": ref_doc.project, "message": gateway_account.get("message") or get_dummy_message(ref_doc), "reference_doctype": args.dt, "reference_name": args.dn, "project": ref_doc.project, "in_words": in_words, "outstanding_amount": outstanding_amount, "total_advance": total_advance, "customer": ref_doc.customer, "customer_address": ref_doc.customer_address, "contact_person": ref_doc.contact_person, "address_display": ref_doc.address_display, "contact_display": ref_doc.contact_display, }) if args.order_type == "Shopping Cart" or args.mute_email: pr.flags.mute_email = True if args.submit_doc: pr.insert(ignore_permissions=True) pr.submit() if args.order_type == "Shopping Cart": frappe.db.commit() frappe.local.response["type"] = "redirect" frappe.local.response["location"] = pr.get_payment_url() if args.return_doc: return pr return pr.as_dict()