mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 00:14:50 +00:00
[fixes] Base structure for Payment Request
This commit is contained in:
@@ -632,7 +632,8 @@ def get_payment_entry(ref_doc, args):
|
|||||||
})
|
})
|
||||||
|
|
||||||
bank_row = jv.append("accounts")
|
bank_row = jv.append("accounts")
|
||||||
bank_account = get_default_bank_cash_account(ref_doc.company, "Bank Entry")
|
|
||||||
|
bank_account = args.get("bank_account", get_default_bank_cash_account(ref_doc.company, "Bank Entry"))
|
||||||
if bank_account:
|
if bank_account:
|
||||||
bank_row.update(bank_account)
|
bank_row.update(bank_account)
|
||||||
bank_row.exchange_rate = get_exchange_rate(bank_account["account"],
|
bank_row.exchange_rate = get_exchange_rate(bank_account["account"],
|
||||||
@@ -653,7 +654,7 @@ def get_payment_entry(ref_doc, args):
|
|||||||
jv.set_amounts_in_company_currency()
|
jv.set_amounts_in_company_currency()
|
||||||
jv.set_total_debit_credit()
|
jv.set_total_debit_credit()
|
||||||
|
|
||||||
return jv.as_dict()
|
return jv if args.get("return_obj") else jv.as_dict()
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_opening_accounts(company):
|
def get_opening_accounts(company):
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
"autoname": "field:gateway_title",
|
"autoname": "field:gateway",
|
||||||
"creation": "2015-12-15 22:26:45.221162",
|
"creation": "2015-12-15 22:26:45.221162",
|
||||||
"custom": 0,
|
"custom": 0,
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
@@ -13,13 +13,37 @@
|
|||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"fieldname": "gatewaty_title",
|
"fieldname": "is_default",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"label": "Is Default",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"fieldname": "gateway",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"label": "Gatewaty Title",
|
"label": "Gateway",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
@@ -38,7 +62,7 @@
|
|||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"fieldname": "payment_account",
|
"fieldname": "payment_account",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
@@ -46,6 +70,7 @@
|
|||||||
"label": "Payment Account",
|
"label": "Payment Account",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
|
"options": "Account",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
@@ -67,7 +92,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2015-12-15 22:26:57.027571",
|
"modified": "2015-12-16 13:20:49.584949",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Payment Gateway",
|
"name": "Payment Gateway",
|
||||||
|
|||||||
@@ -7,4 +7,11 @@ import frappe
|
|||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
|
||||||
class PaymentGateway(Document):
|
class PaymentGateway(Document):
|
||||||
pass
|
def validate(self):
|
||||||
|
self.update_default_payment_gateway()
|
||||||
|
|
||||||
|
def update_default_payment_gateway(self):
|
||||||
|
frappe.db.sql("""update `tabPayment Gateway` set is_default = 0
|
||||||
|
where is_default = 1 """)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -209,6 +209,31 @@
|
|||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"fieldname": "print_format",
|
||||||
|
"fieldtype": "Select",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"label": "Print Format",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Standard\nPOS Invoice",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_on_submit": 1,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
"fieldname": "email_to",
|
"fieldname": "email_to",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Data",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
@@ -230,7 +255,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"fieldname": "subject",
|
"fieldname": "subject",
|
||||||
@@ -254,7 +279,7 @@
|
|||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 1,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"fieldname": "message",
|
"fieldname": "message",
|
||||||
@@ -313,14 +338,14 @@
|
|||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"label": "Reference Doctype",
|
"label": "Reference Doctype",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 1,
|
||||||
"options": "DocType",
|
"options": "DocType",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 1,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 1,
|
||||||
"report_hide": 0,
|
"report_hide": 1,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
@@ -338,14 +363,14 @@
|
|||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
"label": "Reference Name",
|
"label": "Reference Name",
|
||||||
"length": 0,
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 1,
|
||||||
"options": "reference_doctype",
|
"options": "reference_doctype",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 1,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 1,
|
||||||
"report_hide": 0,
|
"report_hide": 1,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
@@ -385,7 +410,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2015-12-16 09:02:03.786403",
|
"modified": "2015-12-16 17:31:37.319394",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Payment Request",
|
"name": "Payment Request",
|
||||||
|
|||||||
@@ -5,31 +5,130 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.utils import flt
|
from frappe.utils import flt, today
|
||||||
|
from frappe import _
|
||||||
|
from erpnext.accounts.doctype.journal_entry.journal_entry import (get_payment_entry_against_order,
|
||||||
|
get_payment_entry_against_invoice, get_payment_entry)
|
||||||
|
from erpnext.accounts.party import get_party_account
|
||||||
|
from erpnext.accounts.utils import get_account_currency, get_balance_on
|
||||||
|
|
||||||
class PaymentRequest(Document):
|
class PaymentRequest(Document):
|
||||||
|
def validate(self):
|
||||||
|
self.validate_payment_request()
|
||||||
|
|
||||||
|
def validate_payment_request(self):
|
||||||
|
if frappe.db.get_value("Payment Request", {"reference_name": self.reference_name,
|
||||||
|
"name": ("!=", self.name), "status": "Paid", "docstatus": 1}, "name"):
|
||||||
|
frappe.throw(_("Payment Request already exist"))
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
|
if self.status == "Paid":
|
||||||
|
self.set_paid()
|
||||||
|
|
||||||
|
self.send_email()
|
||||||
self.send_payment_request()
|
self.send_payment_request()
|
||||||
|
self.make_communication_entry()
|
||||||
|
|
||||||
|
def on_cancel(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def on_update_after_submit(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def set_status(self):
|
||||||
|
pass
|
||||||
|
|
||||||
def send_payment_request(self):
|
def send_payment_request(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def set_paid(self):
|
def make_communication_log_entry(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def set_paid(self):
|
||||||
|
self.create_journal_voucher_entry()
|
||||||
|
|
||||||
|
def create_journal_voucher_entry(self):
|
||||||
|
"""create voucher entry"""
|
||||||
|
payment_details = {
|
||||||
|
"party_type": "Customer",
|
||||||
|
"amount_field_party": "credit_in_account_currency",
|
||||||
|
"amount_field_bank": "debit_in_account_currency",
|
||||||
|
"amount": self.amount,
|
||||||
|
"return_obj": True
|
||||||
|
}
|
||||||
|
ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
|
||||||
|
|
||||||
|
if self.reference_doctype == "Sales Order":
|
||||||
|
party_account = get_party_account("Customer", ref_doc.get('customer'), ref_doc.company)
|
||||||
|
payment_details.update({
|
||||||
|
"party_account": party_account,
|
||||||
|
"party_account_currency": get_account_currency(party_account),
|
||||||
|
"remarks": 'Advance Payment received against {0} {1}'.format(self.reference_doctype, self.reference_name),
|
||||||
|
"is_advance": "Yes"
|
||||||
|
})
|
||||||
|
if self.reference_doctype == "Sales Invoice":
|
||||||
|
payment_details.update({
|
||||||
|
"party_account": ref_doc.debit_to,
|
||||||
|
"party_account_currency": ref_doc.party_account_currency,
|
||||||
|
"remarks": 'Payment received against {0} {1}. {2}'.format(self.reference_doctype, self.reference_name, ref_doc.remarks),
|
||||||
|
"is_advance": "No"
|
||||||
|
})
|
||||||
|
|
||||||
|
account_details = frappe.db.get_value("Account", self.payment_account,
|
||||||
|
["account_currency", "account_type"], as_dict=1)
|
||||||
|
|
||||||
|
payment_details["bank_account"] = {
|
||||||
|
"account": self.payment_account,
|
||||||
|
"balance": get_balance_on(self.payment_account),
|
||||||
|
"account_currency": account_details.account_currency,
|
||||||
|
"account_type": account_details.account_type
|
||||||
|
}
|
||||||
|
|
||||||
|
jv = get_payment_entry(ref_doc, payment_details)
|
||||||
|
jv.update({
|
||||||
|
"voucher_type": "Journal Entry",
|
||||||
|
"posting_date": today()
|
||||||
|
})
|
||||||
|
jv.submit()
|
||||||
|
|
||||||
|
def send_email(self):
|
||||||
|
"""send email with payment link"""
|
||||||
|
frappe.sendmail(recipients=self.email_to, sender=None, subject=self.subject,
|
||||||
|
message=self.get_message(), attachments=[frappe.attach_print(self.reference_doctype,
|
||||||
|
self.reference_name, file_name=self.reference_name, print_format=self.print_format)])
|
||||||
|
|
||||||
|
def get_message(self):
|
||||||
|
"""return message with payment gateway link"""
|
||||||
|
return self.message + "<br> Payment Link <a href='https://www.google.com'> link for payment gateway </a>"
|
||||||
|
|
||||||
def set_failed(self):
|
def set_failed(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def set_cancelled(self):
|
def set_cancelled(self):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def make_communication_entry(self):
|
||||||
|
"""Make communication entry"""
|
||||||
|
comm = frappe.get_doc({
|
||||||
|
"doctype":"Communication",
|
||||||
|
"subject": self.subject,
|
||||||
|
"content": self.get_message(),
|
||||||
|
"sent_or_received": "Sent",
|
||||||
|
"reference_doctype": self.reference_doctype,
|
||||||
|
"reference_name": self.reference_name
|
||||||
|
})
|
||||||
|
comm.insert(ignore_permissions=True)
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_payment_request(dt, dn, recipient_id):
|
def make_payment_request(dt, dn, recipient_id=None):
|
||||||
"""Make payment request"""
|
"""Make payment request"""
|
||||||
ref_doc = get_reference_doc_details(dt, dn)
|
ref_doc = get_reference_doc_details(dt, dn)
|
||||||
|
payment_gateway, payment_account = get_gateway_details()
|
||||||
|
|
||||||
pr = frappe.get_doc({
|
pr = frappe.get_doc({
|
||||||
"doctype": "Payment Request",
|
"doctype": "Payment Request",
|
||||||
|
"payment_gateway": payment_gateway,
|
||||||
|
"payment_account": payment_account,
|
||||||
"currency": ref_doc.currency,
|
"currency": ref_doc.currency,
|
||||||
"amount": get_amount(ref_doc, dt),
|
"amount": get_amount(ref_doc, dt),
|
||||||
"email_to": recipient_id,
|
"email_to": recipient_id,
|
||||||
@@ -37,12 +136,23 @@ def make_payment_request(dt, dn, recipient_id):
|
|||||||
"reference_name": dn
|
"reference_name": dn
|
||||||
}).insert()
|
}).insert()
|
||||||
|
|
||||||
pr.submit()
|
|
||||||
|
|
||||||
def get_reference_doc_details(dt, dn):
|
def get_reference_doc_details(dt, dn):
|
||||||
""" return reference doc Sales Order/Sales Invoice"""
|
""" return reference doc Sales Order/Sales Invoice"""
|
||||||
return frappe.get_doc(dt, dn)
|
return frappe.get_doc(dt, dn)
|
||||||
|
|
||||||
def get_amount(ref_doc, dt):
|
def get_amount(ref_doc, dt):
|
||||||
|
"""get amount based on doctype"""
|
||||||
if dt == "Sales Order":
|
if dt == "Sales Order":
|
||||||
return flt(ref_doc.grand_total) - flt(ref_doc.advance_paid)
|
amount = flt(ref_doc.grand_total) - flt(ref_doc.advance_paid)
|
||||||
|
|
||||||
|
if dt == "Sales Invoice":
|
||||||
|
amount = abs(ref_doc.outstanding_amount)
|
||||||
|
|
||||||
|
if amount > 0:
|
||||||
|
return amount
|
||||||
|
else:
|
||||||
|
frappe.throw(_("Payment Entry is already created"))
|
||||||
|
|
||||||
|
def get_gateway_details():
|
||||||
|
"""return gateway and payment account of default payment gateway"""
|
||||||
|
return frappe.db.get_value("Payment Gateway", {"is_default": 1}, ["gateway", "payment_account"])
|
||||||
@@ -291,42 +291,12 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
make_payment_request: function() {
|
make_payment_request: function() {
|
||||||
if (!cur_frm.doc.contact_email){
|
|
||||||
cur_frm.cscript.get_customer_email();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
cur_frm.cscript.create_payment_request(cur_frm.doc.contact_email)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
get_customer_email: function() {
|
|
||||||
var dialog = new frappe.ui.Dialog({
|
|
||||||
title: __("Recipient Details"),
|
|
||||||
fields: [
|
|
||||||
{"fieldtype": "Data", "label": __("Recipient Email Id"), "fieldname": "recipient_id",
|
|
||||||
"reqd": 1},
|
|
||||||
{"fieldtype": "Button", "label": __("Make Payment Request"),
|
|
||||||
"fieldname": "make_pr", "cssClass": "btn-primary"}
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
dialog.fields_dict.make_pr.$input.click(function() {
|
|
||||||
args = dialog.get_values();
|
|
||||||
if(!args) return;
|
|
||||||
dialog.hide();
|
|
||||||
cur_frm.cscript.create_payment_request(args.recipient_id)
|
|
||||||
|
|
||||||
});
|
|
||||||
dialog.show();
|
|
||||||
},
|
|
||||||
|
|
||||||
create_payment_request: function(recipient_id){
|
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method:"erpnext.accounts.doctype.payment_request.payment_request.make_payment_request",
|
method:"erpnext.accounts.doctype.payment_request.payment_request.make_payment_request",
|
||||||
args: {
|
args: {
|
||||||
"dt": cur_frm.doc.doctype,
|
"dt": cur_frm.doc.doctype,
|
||||||
"dn": cur_frm.doc.name,
|
"dn": cur_frm.doc.name,
|
||||||
"recipient_id": recipient_id
|
"recipient_id": cur_frm.doc.contact_email
|
||||||
},
|
},
|
||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user