[fixes] Base structure for Payment Request

This commit is contained in:
Saurabh 2015-12-16 20:48:40 +05:30
parent eba7aa496c
commit b109ee96de
6 changed files with 196 additions and 58 deletions

View File

@ -632,7 +632,8 @@ def get_payment_entry(ref_doc, args):
})
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:
bank_row.update(bank_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_total_debit_credit()
return jv.as_dict()
return jv if args.get("return_obj") else jv.as_dict()
@frappe.whitelist()
def get_opening_accounts(company):

View File

@ -2,7 +2,7 @@
"allow_copy": 0,
"allow_import": 0,
"allow_rename": 0,
"autoname": "field:gateway_title",
"autoname": "field:gateway",
"creation": "2015-12-15 22:26:45.221162",
"custom": 0,
"docstatus": 0,
@ -13,13 +13,37 @@
"allow_on_submit": 0,
"bold": 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",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Gatewaty Title",
"label": "Gateway",
"length": 0,
"no_copy": 0,
"permlevel": 0,
@ -38,7 +62,7 @@
"bold": 0,
"collapsible": 0,
"fieldname": "payment_account",
"fieldtype": "Data",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
@ -46,6 +70,7 @@
"label": "Payment Account",
"length": 0,
"no_copy": 0,
"options": "Account",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@ -67,7 +92,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2015-12-15 22:26:57.027571",
"modified": "2015-12-16 13:20:49.584949",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Gateway",

View File

@ -7,4 +7,11 @@ import frappe
from frappe.model.document import 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 """)

View File

@ -209,6 +209,31 @@
"allow_on_submit": 0,
"bold": 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",
"fieldtype": "Data",
"hidden": 0,
@ -230,7 +255,7 @@
"unique": 0
},
{
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"fieldname": "subject",
@ -254,7 +279,7 @@
"unique": 0
},
{
"allow_on_submit": 0,
"allow_on_submit": 1,
"bold": 0,
"collapsible": 0,
"fieldname": "message",
@ -313,14 +338,14 @@
"in_list_view": 0,
"label": "Reference Doctype",
"length": 0,
"no_copy": 0,
"no_copy": 1,
"options": "DocType",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"read_only": 1,
"report_hide": 1,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
@ -338,14 +363,14 @@
"in_list_view": 0,
"label": "Reference Name",
"length": 0,
"no_copy": 0,
"no_copy": 1,
"options": "reference_doctype",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"read_only": 1,
"report_hide": 1,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
@ -385,7 +410,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2015-12-16 09:02:03.786403",
"modified": "2015-12-16 17:31:37.319394",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Request",

View File

@ -5,31 +5,130 @@
from __future__ import unicode_literals
import frappe
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):
if self.status == "Paid":
self.set_paid()
self.send_email()
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):
pass
def set_paid(self):
def make_communication_log_entry(self):
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):
pass
def set_cancelled(self):
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()
def make_payment_request(dt, dn, recipient_id):
def make_payment_request(dt, dn, recipient_id=None):
"""Make payment request"""
ref_doc = get_reference_doc_details(dt, dn)
payment_gateway, payment_account = get_gateway_details()
pr = frappe.get_doc({
"doctype": "Payment Request",
"payment_gateway": payment_gateway,
"payment_account": payment_account,
"currency": ref_doc.currency,
"amount": get_amount(ref_doc, dt),
"email_to": recipient_id,
@ -37,12 +136,23 @@ def make_payment_request(dt, dn, recipient_id):
"reference_name": dn
}).insert()
pr.submit()
def get_reference_doc_details(dt, dn):
""" return reference doc Sales Order/Sales Invoice"""
return frappe.get_doc(dt, dn)
def get_amount(ref_doc, dt):
"""get amount based on doctype"""
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"])

View File

@ -291,42 +291,12 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
},
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({
method:"erpnext.accounts.doctype.payment_request.payment_request.make_payment_request",
args: {
"dt": cur_frm.doc.doctype,
"dn": cur_frm.doc.name,
"recipient_id": recipient_id
"recipient_id": cur_frm.doc.contact_email
},
callback: function(r) {