Example #1
0
	def validate_loyalty_transaction(self):
		if self.redeem_loyalty_points and (not self.loyalty_redemption_account or not self.loyalty_redemption_cost_center):
			expense_account, cost_center = frappe.db.get_value('Loyalty Program', self.loyalty_program, ["expense_account", "cost_center"])
			if not self.loyalty_redemption_account:
				self.loyalty_redemption_account = expense_account
			if not self.loyalty_redemption_cost_center:
				self.loyalty_redemption_cost_center = cost_center

		if self.redeem_loyalty_points and self.loyalty_program and self.loyalty_points:
			validate_loyalty_points(self, self.loyalty_points)
Example #2
0
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]})

	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"),
			"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
		})

		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()
Example #3
0
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()
Example #4
0
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()
Example #5
0
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()