def test_payment_entry(self):
		so_inr = make_sales_order(currency="INR")
		pr = make_payment_request(dt="Sales Order", dn=so_inr.name, recipient_id="*****@*****.**",
			mute_email=1, submit_doc=1)
		jv = pr.set_as_paid()

		so_inr = frappe.get_doc("Sales Order", so_inr.name)

		self.assertEquals(so_inr.advance_paid, jv.total_debit)

		conversion_rate = get_exchange_rate("USD", "INR")

		si_usd = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
			currency="USD", conversion_rate=conversion_rate)

		pr = make_payment_request(dt="Sales Invoice", dn=si_usd.name, recipient_id="*****@*****.**",
			mute_email=1, return_doc=1, payment_gateway="_Test Gateway - USD")

		jv = pr.set_as_paid()

		payment_gateway_details = get_gateway_details({"payment_gateway": "_Test Gateway - USD"})
				
		self.assertEquals(jv.accounts[0].account, "_Test Receivable USD - _TC")
		self.assertEquals(jv.accounts[1].account, payment_gateway_details.payment_account)
		
    def test_payment_entry(self):
        so_inr = make_sales_order(currency="INR")
        pr = make_payment_request(dt="Sales Order",
                                  dn=so_inr.name,
                                  recipient_id="*****@*****.**",
                                  mute_email=1,
                                  submit_doc=1)
        jv = pr.set_as_paid()

        so_inr = frappe.get_doc("Sales Order", so_inr.name)

        self.assertEquals(so_inr.advance_paid, jv.total_debit)

        conversion_rate = get_exchange_rate("USD", "INR")

        si_usd = create_sales_invoice(customer="_Test Customer USD",
                                      debit_to="_Test Receivable USD - _TC",
                                      currency="USD",
                                      conversion_rate=conversion_rate)

        pr = make_payment_request(dt="Sales Invoice",
                                  dn=si_usd.name,
                                  recipient_id="*****@*****.**",
                                  mute_email=1,
                                  return_doc=1,
                                  payment_gateway="_Test Gateway - USD")

        jv = pr.set_as_paid()

        payment_gateway_details = get_gateway_details(
            {"payment_gateway": "_Test Gateway - USD"})

        self.assertEquals(jv.accounts[0].account, "_Test Receivable USD - _TC")
        self.assertEquals(jv.accounts[1].account,
                          payment_gateway_details.payment_account)
Example #3
0
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()
Example #4
0
def make_payment_request(**args):
    """Make payment request"""

    args = frappe._dict(args)

    ref_doc = frappe.get_doc(args.dt, args.dn)
    grand_total = args.grand_total
    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,
            "inflow_file":
            args.inflow_file,
            "posting_date":
            args.posting_date,
            "posting_time":
            args.posting_time,
            "set_posting_time":
            1
        })

        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()