Merge pull request #4866 from neilLasrado/develop
Fixes in Setup Wizard
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index 4b50747..5967305 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
from __future__ import unicode_literals
-__version__ = '6.22.1'
+__version__ = '6.23.0'
diff --git a/erpnext/accounts/doctype/journal_entry/journal_entry.py b/erpnext/accounts/doctype/journal_entry/journal_entry.py
index afb9b85..ca7cb7e 100644
--- a/erpnext/accounts/doctype/journal_entry/journal_entry.py
+++ b/erpnext/accounts/doctype/journal_entry/journal_entry.py
@@ -551,7 +551,7 @@
}
@frappe.whitelist()
-def get_payment_entry_against_order(dt, dn, amount=None, journal_entry=False, bank_account=None):
+def get_payment_entry_against_order(dt, dn, amount=None, debit_in_account_currency=None, journal_entry=False, bank_account=None):
ref_doc = frappe.get_doc(dt, dn)
if flt(ref_doc.per_billed, 2) > 0:
@@ -582,6 +582,7 @@
"amount_field_party": amount_field_party,
"amount_field_bank": amount_field_bank,
"amount": amount,
+ "debit_in_account_currency": debit_in_account_currency,
"remarks": 'Advance Payment received against {0} {1}'.format(dt, dn),
"is_advance": "Yes",
"bank_account": bank_account,
@@ -589,7 +590,7 @@
})
@frappe.whitelist()
-def get_payment_entry_against_invoice(dt, dn, amount=None, journal_entry=False, bank_account=None):
+def get_payment_entry_against_invoice(dt, dn, amount=None, debit_in_account_currency=None, journal_entry=False, bank_account=None):
ref_doc = frappe.get_doc(dt, dn)
if dt == "Sales Invoice":
party_type = "Customer"
@@ -614,6 +615,7 @@
"amount_field_party": amount_field_party,
"amount_field_bank": amount_field_bank,
"amount": amount if amount else abs(ref_doc.outstanding_amount),
+ "debit_in_account_currency": debit_in_account_currency,
"remarks": 'Payment received against {0} {1}. {2}'.format(dt, dn, ref_doc.remarks),
"is_advance": "No",
"bank_account": bank_account,
@@ -662,10 +664,12 @@
bank_row.cost_center = cost_center
+ amount = args.get("debit_in_account_currency") or args.get("amount")
+
if bank_row.account_currency == args.get("party_account_currency"):
- bank_row.set(args.get("amount_field_bank"), args.get("amount"))
+ bank_row.set(args.get("amount_field_bank"), amount)
else:
- bank_row.set(args.get("amount_field_bank"), args.get("amount") * exchange_rate)
+ bank_row.set(args.get("amount_field_bank"), amount * exchange_rate)
# set multi currency check
if party_row.account_currency != ref_doc.company_currency \
diff --git a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.js b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.js
index c9bdc9b..e1fe5a1 100644
--- a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.js
+++ b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.js
@@ -1,6 +1,6 @@
cur_frm.cscript.refresh = function(doc, dt, dn){
if(!doc.__islocal){
- var df = frappe.meta.get_docfield(doc.doctype, "gateway", doc.name);
+ var df = frappe.meta.get_docfield(doc.doctype, "payment_gateway", doc.name);
df.read_only = 1;
}
}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.json b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.json
index 579c2c2..df8eaeb 100644
--- a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.json
+++ b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.json
@@ -12,7 +12,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "gateway",
+ "fieldname": "payment_gateway",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -203,30 +203,6 @@
"search_index": 0,
"set_only_once": 0,
"unique": 0
- },
- {
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "fieldname": "payment_success_url",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "label": "Payment Success URL",
- "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
}
],
"hide_heading": 0,
@@ -238,7 +214,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-01-18 03:53:50.534673",
+ "modified": "2016-01-21 11:32:10.311015",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Gateway Account",
diff --git a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.py b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.py
index 468f877..fd213a4 100644
--- a/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.py
+++ b/erpnext/accounts/doctype/payment_gateway_account/payment_gateway_account.py
@@ -8,7 +8,7 @@
class PaymentGatewayAccount(Document):
def autoname(self):
- self.name = self.gateway + " - " + self.currency
+ self.name = self.payment_gateway + " - " + self.currency
def validate(self):
self.currency = frappe.db.get_value("Account", self.payment_account, "account_currency")
@@ -24,4 +24,4 @@
def set_as_default_if_not_set(self):
if not frappe.db.get_value("Payment Gateway Account",
{"is_default": 1, "name": ("!=", self.name)}, "name"):
- self.is_default = 1
+ self.is_default = 1
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.js b/erpnext/accounts/doctype/payment_request/payment_request.js
index b519dee..1f0e9bc 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.js
+++ b/erpnext/accounts/doctype/payment_request/payment_request.js
@@ -1,8 +1,7 @@
cur_frm.add_fetch("payment_gateway", "payment_account", "payment_account")
-cur_frm.add_fetch("payment_gateway", "gateway", "gateway")
+cur_frm.add_fetch("payment_gateway", "payment_gateway", "payment_gateway")
cur_frm.add_fetch("payment_gateway", "message", "message")
cur_frm.add_fetch("payment_gateway", "payment_url_message", "payment_url_message")
-cur_frm.add_fetch("payment_gateway", "payment_success_url", "payment_success_url")
frappe.ui.form.on("Payment Request", "onload", function(frm, dt, dn){
if (frm.doc.reference_doctype) {
@@ -17,18 +16,20 @@
})
frappe.ui.form.on("Payment Request", "refresh", function(frm) {
- frm.add_custom_button(__('Resend Payment Email'), function(){
- frappe.call({
- method: "erpnext.accounts.doctype.payment_request.payment_request.resend_payment_email",
- args: {"docname": frm.doc.name},
- freeze: true,
- freeze_message: __("Sending"),
- callback: function(r){
- if(!r.exc) {
- frappe.msgprint(__("Message Sent"));
+ if(!in_list(["Initiated", "Paid"], frm.doc.status) && !frm.doc.__islocal){
+ frm.add_custom_button(__('Resend Payment Email'), function(){
+ frappe.call({
+ method: "erpnext.accounts.doctype.payment_request.payment_request.resend_payment_email",
+ args: {"docname": frm.doc.name},
+ freeze: true,
+ freeze_message: __("Sending"),
+ callback: function(r){
+ if(!r.exc) {
+ frappe.msgprint(__("Message Sent"));
+ }
}
- }
+ });
});
- });
+ }
});
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.json b/erpnext/accounts/doctype/payment_request/payment_request.json
index 7655b58..e916034 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.json
+++ b/erpnext/accounts/doctype/payment_request/payment_request.json
@@ -17,6 +17,7 @@
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Payment Details",
@@ -37,37 +38,14 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "fieldname": "amount",
- "fieldtype": "Currency",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "label": "Amount",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "2",
- "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": "currency",
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Currency",
+ "label": "Transaction Currency",
"length": 0,
"no_copy": 0,
"options": "Currency",
@@ -86,18 +64,20 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "depends_on": "eval:doc.reference_doctype==\"Sales Order\"",
- "fieldname": "make_sales_invoice",
- "fieldtype": "Check",
+ "description": "Amount in customer's currency",
+ "fieldname": "grand_total",
+ "fieldtype": "Currency",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Make Sales Invoice",
+ "label": "Grand Total",
"length": 0,
"no_copy": 0,
+ "options": "currency",
"permlevel": 0,
- "precision": "",
+ "precision": "2",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
@@ -115,6 +95,7 @@
"fieldtype": "Column Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
@@ -139,6 +120,7 @@
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Status",
@@ -160,10 +142,87 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "depends_on": "eval:doc.reference_doctype==\"Sales Order\"",
+ "fieldname": "make_sales_invoice",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Make Sales Invoice",
+ "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": "section_break_7",
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "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": "payment_gateway_account",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Payment Gateway Account",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Payment Gateway Account",
+ "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": "column_break_9",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"length": 0,
@@ -184,87 +243,16 @@
"bold": 0,
"collapsible": 0,
"fieldname": "payment_gateway",
- "fieldtype": "Link",
+ "fieldtype": "Read Only",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Payment Gateway",
"length": 0,
"no_copy": 0,
- "options": "Payment Gateway Account",
- "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": "payment_success_url",
- "fieldtype": "Data",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "label": "Payment Success URL",
- "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": "column_break_9",
- "fieldtype": "Column Break",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "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": "Read Only",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "in_filter": 0,
- "in_list_view": 0,
- "label": "Gateway",
- "length": 0,
- "no_copy": 0,
- "options": "payment_gateway.gateway",
+ "options": "payment_gateway_account.payment_gateway",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -284,12 +272,13 @@
"fieldtype": "Read Only",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Payment Account",
"length": 0,
"no_copy": 0,
- "options": "payment_gateway.payment_account",
+ "options": "payment_gateway_account.payment_account",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -309,6 +298,7 @@
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Recipient and Message",
@@ -334,6 +324,7 @@
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Print Format",
@@ -359,6 +350,7 @@
"fieldtype": "Check",
"hidden": 1,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Mute Email",
@@ -383,6 +375,7 @@
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Email To",
@@ -407,6 +400,7 @@
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Subject",
@@ -431,6 +425,7 @@
"fieldtype": "Text Editor",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Message",
@@ -455,6 +450,7 @@
"fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Payment URL Message",
@@ -479,6 +475,7 @@
"fieldtype": "Data",
"hidden": 1,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "payment_url",
@@ -503,6 +500,7 @@
"fieldtype": "Section Break",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Reference Details",
@@ -527,6 +525,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Reference Doctype",
@@ -552,6 +551,7 @@
"fieldtype": "Dynamic Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Reference Name",
@@ -577,6 +577,7 @@
"fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
+ "ignore_xss_filter": 0,
"in_filter": 0,
"in_list_view": 0,
"label": "Amended From",
@@ -603,7 +604,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-01-11 05:49:28.342786",
+ "modified": "2016-02-24 16:49:46.832403",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Payment Request",
diff --git a/erpnext/accounts/doctype/payment_request/payment_request.py b/erpnext/accounts/doctype/payment_request/payment_request.py
index ba7413d..bd4cc4d 100644
--- a/erpnext/accounts/doctype/payment_request/payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/payment_request.py
@@ -8,12 +8,10 @@
from frappe.model.document import Document
from frappe.utils import flt, nowdate, get_url, cstr
from erpnext.accounts.party import get_party_account
-from erpnext.accounts.utils import get_account_currency, get_balance_on
+from erpnext.accounts.utils import get_account_currency
from erpnext.accounts.doctype.journal_entry.journal_entry import (get_payment_entry_against_invoice,
get_payment_entry_against_order)
-from itertools import chain
-
class PaymentRequest(Document):
def validate(self):
self.validate_payment_gateway_account()
@@ -35,7 +33,7 @@
frappe.throw(_("Payment Gateway Account is not configured"))
def validate_payment_gateway(self):
- if self.gateway == "PayPal":
+ if self.payment_gateway == "PayPal":
if not frappe.db.get_value("PayPal Settings", None, "api_username"):
if not frappe.conf.paypal_username:
frappe.throw(_("PayPal Settings missing"))
@@ -49,14 +47,10 @@
def on_cancel(self):
self.set_as_cancelled()
-
- def on_update_after_submit(self):
- pass
-
- def set_status(self):
- pass
def get_payment_url(self):
+ """ This is blanck method to trigger hooks call from individual payment gateway app
+ which will return respective payment gateway"""
pass
def make_invoice(self):
@@ -69,6 +63,7 @@
def send_payment_request(self):
self.payment_url = get_url("/api/method/erpnext.accounts.doctype.payment_request.payment_request.generate_payment_request?name={0}".format(self.name))
if self.payment_url:
+ frappe.db.set_value(self.doctype, self.name, "payment_url", self.payment_url)
frappe.db.set_value(self.doctype, self.name, "status", "Initiated")
def set_as_paid(self):
@@ -82,29 +77,44 @@
def create_journal_entry(self):
"""create entry"""
- payment_details = {
- "amount": self.amount,
- "journal_entry": True,
- "bank_account": self.payment_account
- }
-
frappe.flags.ignore_account_permission = True
+
+ ref_doc = frappe.get_doc(self.reference_doctype, self.reference_name)
+
+ party_account = get_party_account("Customer", ref_doc.get("customer"), ref_doc.company)
+ party_account_currency = get_account_currency(party_account)
+
+ debit_in_account_currency = 0.0
+
+ if party_account_currency == ref_doc.company_currency:
+ amount = flt(flt(self.grand_total) * \
+ flt(ref_doc.conversion_rate, ref_doc.precision("conversion_rate")), \
+ ref_doc.precision("base_grand_total"))
+
+ if self.currency != ref_doc.company_currency:
+ debit_in_account_currency = self.grand_total
+
+ else:
+ amount = debit_in_account_currency = self.grand_total
if self.reference_doctype == "Sales Order":
- jv = get_payment_entry_against_order(self.reference_doctype, self.reference_name,\
- amount=self.amount, journal_entry=True, bank_account=self.payment_account)
+ jv = get_payment_entry_against_order(self.reference_doctype, self.reference_name,
+ amount=amount, debit_in_account_currency=debit_in_account_currency , journal_entry=True,
+ bank_account=self.payment_account)
- if self.reference_doctype == "Sales Invoice":
- jv = get_payment_entry_against_invoice(self.reference_doctype, self.reference_name,\
- amount=self.amount, journal_entry=True, bank_account=self.payment_account)
+ if self.reference_doctype == "Sales Invoice":
+ jv = get_payment_entry_against_invoice(self.reference_doctype, self.reference_name,
+ amount=amount, debit_in_account_currency=debit_in_account_currency, journal_entry=True,
+ bank_account=self.payment_account)
jv.update({
"voucher_type": "Journal Entry",
"posting_date": nowdate()
- })
+ })
+
jv.insert(ignore_permissions=True)
jv.submit()
-
+
#set status as paid for Payment Request
frappe.db.set_value(self.doctype, self.name, "status", "Paid")
@@ -148,22 +158,26 @@
args = frappe._dict(args)
ref_doc = frappe.get_doc(args.dt, args.dn)
+
gateway_account = get_gateway_details(args)
+ grand_total = get_amount(ref_doc, args.dt)
+
existing_payment_request = frappe.db.get_value("Payment Request",
{"reference_doctype": args.dt, "reference_name": args.dn})
+
if existing_payment_request:
pr = frappe.get_doc("Payment Request", existing_payment_request)
- else:
+
+ else:
pr = frappe.new_doc("Payment Request")
-
pr.update({
- "payment_gateway": gateway_account.name,
- "gateway": gateway_account.gateway,
+ "payment_gateway_account": gateway_account.name,
+ "payment_gateway": gateway_account.payment_gateway,
"payment_account": gateway_account.payment_account,
"currency": ref_doc.currency,
"make_sales_invoice": args.cart or 0,
- "amount": get_amount(ref_doc, args.dt),
+ "grand_total": grand_total,
"mute_email": args.mute_email or 0,
"email_to": args.recipient_id or "",
"subject": "Payment Request for %s"%args.dn,
@@ -180,11 +194,12 @@
if args.submit_doc:
pr.insert(ignore_permissions=True)
pr.submit()
-
+
+
if args.cart:
generate_payment_request(pr.name)
frappe.db.commit()
-
+
if not args.cart:
return pr
@@ -193,31 +208,37 @@
def get_amount(ref_doc, dt):
"""get amount based on doctype"""
if dt == "Sales Order":
- amount = flt(ref_doc.base_grand_total) - flt(ref_doc.advance_paid)
-
+ grand_total = 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
+ grand_total = flt(ref_doc.outstanding_amount)
+
+ if grand_total > 0 :
+ return grand_total
+
else:
frappe.throw(_("Payment Entry is already created"))
def get_gateway_details(args):
"""return gateway and payment account of default payment gateway"""
- if args.payemnt_gateway:
- gateway_account = frappe.db.get_value("Payment Gateway Account", args.payemnt_gateway,
- ["name", "gateway", "payment_account", "message", "payment_url_message", "payment_success_url"],
- as_dict=1)
+ if args.get("payment_gateway"):
+ return get_payment_gateway_account(args.get("payment_gateway"))
+
+ if args.cart:
+ payment_gateway_account = frappe.get_doc("Shopping Cart Settings").payment_gateway_account
+ return get_payment_gateway_account(payment_gateway_account)
- gateway_account = frappe.db.get_value("Payment Gateway Account", {"is_default": 1},
- ["name", "gateway", "payment_account", "message", "payment_url_message", "payment_success_url"],
- as_dict=1)
+ gateway_account = get_payment_gateway_account({"is_default": 1})
if not gateway_account:
frappe.throw(_("Payment Gateway Account is not configured"))
return gateway_account
+
+def get_payment_gateway_account(args):
+ return frappe.db.get_value("Payment Gateway Account", args,
+ ["name", "payment_gateway", "payment_account", "message", "payment_url_message"],
+ as_dict=1)
@frappe.whitelist()
def get_print_format_list(ref_doctype):
diff --git a/erpnext/accounts/doctype/payment_request/test_payment_request.py b/erpnext/accounts/doctype/payment_request/test_payment_request.py
index 49c604a..eb8e558 100644
--- a/erpnext/accounts/doctype/payment_request/test_payment_request.py
+++ b/erpnext/accounts/doctype/payment_request/test_payment_request.py
@@ -6,8 +6,9 @@
import frappe
import unittest
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
-from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request
+from erpnext.accounts.doctype.payment_request.payment_request import make_payment_request, get_gateway_details
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
+from erpnext.setup.utils import get_exchange_rate
# test_records = frappe.get_test_records('Payment Request')
test_dependencies = ["Currency Exchange", "Journal Entry", "Contact", "Address"]
@@ -21,13 +22,13 @@
{
"doctype": "Payment Gateway Account",
"is_default": 1,
- "gateway": "_Test Gateway",
+ "payment_gateway": "_Test Gateway",
"payment_account": "_Test Bank - _TC",
"currency": "INR"
},
{
"doctype": "Payment Gateway Account",
- "gateway": "_Test Gateway",
+ "payment_gateway": "_Test Gateway",
"payment_account": "_Test Bank USD - _TC",
"currency": "USD"
}
@@ -39,41 +40,49 @@
frappe.get_doc(payment_gateway).insert(ignore_permissions=True)
for method in payment_method:
- if not frappe.db.get_value("Payment Gateway Account", {"gateway": method["gateway"],
+ if not frappe.db.get_value("Payment Gateway Account", {"payment_gateway": method["payment_gateway"],
"currency": method["currency"]}, "name"):
frappe.get_doc(method).insert(ignore_permissions=True)
def test_payment_request_linkings(self):
- SO_INR = make_sales_order(currency="INR")
- pr = make_payment_request(dt="Sales Order", dn=SO_INR.name, recipient_id="saurabh@erpnext.com")
-
+ so_inr = make_sales_order(currency="INR")
+ pr = make_payment_request(dt="Sales Order", dn=so_inr.name, recipient_id="saurabh@erpnext.com")
+
self.assertEquals(pr.reference_doctype, "Sales Order")
- self.assertEquals(pr.reference_name, SO_INR.name)
+ self.assertEquals(pr.reference_name, so_inr.name)
self.assertEquals(pr.currency, "INR")
-
- SI_USD = create_sales_invoice(currency="USD", conversion_rate=50)
- pr = make_payment_request(dt="Sales Invoice", dn=SI_USD.name, recipient_id="saurabh@erpnext.com")
+
+ conversion_rate = get_exchange_rate("USD", "INR")
+
+ si_usd = create_sales_invoice(currency="USD", conversion_rate=conversion_rate)
+ pr = make_payment_request(dt="Sales Invoice", dn=si_usd.name, recipient_id="saurabh@erpnext.com")
self.assertEquals(pr.reference_doctype, "Sales Invoice")
- self.assertEquals(pr.reference_name, SI_USD.name)
+ self.assertEquals(pr.reference_name, si_usd.name)
self.assertEquals(pr.currency, "USD")
-
- 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="saurabh@erpnext.com",
- 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)
-
- SI_USD = create_sales_invoice(customer="_Test Customer USD", debit_to="_Test Receivable USD - _TC",
- currency="USD", conversion_rate=50)
- pr = make_payment_request(dt="Sales Invoice", dn=SI_USD.name, recipient_id="saurabh@erpnext.com",
- mute_email=1, return_doc=1, payemnt_gateway="_Test Gateway - USD")
-
- self.assertRaises(frappe.ValidationError, pr.save)
-
-
+ 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="saurabh@erpnext.com",
+ 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="saurabh@erpnext.com",
+ 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)
+
\ No newline at end of file
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index d59b179..36ff1ab 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -477,3 +477,15 @@
})
return outstanding_invoices
+
+
+def get_account(account_type=None, root_type=None, is_group=None, account_currency=None, company=None):
+ """return account based on matching conditions"""
+ return frappe.db.get_value("Account", {
+ "account_type": account_type or '',
+ "root_type": root_type or '',
+ "is_group": is_group or 0,
+ "account_currency": account_currency or frappe.defaults.get_defaults().currency,
+ "company": company or frappe.defaults.get_defaults().company
+ }, "name")
+
\ No newline at end of file
diff --git a/erpnext/change_log/v6/v6_23_0.md b/erpnext/change_log/v6/v6_23_0.md
new file mode 100644
index 0000000..d6f48a7
--- /dev/null
+++ b/erpnext/change_log/v6/v6_23_0.md
@@ -0,0 +1,10 @@
+- Material Request for manufacturing, plan production based on Material Request via Production Planning Tool
+- Merged **STOP** and **Close** button to a single button **Close**
+- Reorder level can be set as zero
+- Added Stock balance in Quotation Item table
+- **Payment Request and Payment Gateway**
+ - Create Payment Request from Sales Order / Sales Invoice
+ - Install paypal_integration application and setup as a Payment Gateway
+ - Give link of PayPal payment page to your customer
+ - On sucessful payment, system will create payment entry automatically and update Payment Request status
+ - Payment option in shopping cart
\ No newline at end of file
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index d77c0f7..5645981 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -7,7 +7,7 @@
app_description = """ERP made simple"""
app_icon = "icon-th"
app_color = "#e74c3c"
-app_version = "6.22.1"
+app_version = "6.23.0"
app_email = "info@erpnext.com"
app_license = "GNU General Public License (v3)"
source_link = "https://github.com/frappe/erpnext"
diff --git a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
index 302513f..d4d5329 100644
--- a/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
+++ b/erpnext/manufacturing/doctype/bom_replace_tool/bom_replace_tool.py
@@ -23,6 +23,10 @@
def validate_bom(self):
if cstr(self.current_bom) == cstr(self.new_bom):
frappe.throw(_("Current BOM and New BOM can not be same"))
+
+ if frappe.db.get_value("BOM", self.current_bom, "item") \
+ != frappe.db.get_value("BOM", self.new_bom, "item"):
+ frappe.throw(_("The selected BOMs are not for the same item"))
def update_new_bom(self):
current_bom_unitcost = frappe.db.sql("""select total_cost/quantity
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index e5ec454..76bffc2 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -246,6 +246,6 @@
erpnext.patches.v6_16.create_manufacturer_records
execute:frappe.db.sql("update `tabPricing Rule` set title=name where title='' or title is null") #2016-01-27
erpnext.patches.v6_20.set_party_account_currency_in_orders
-erpnext.patches.v6_19.comment_feed_communication
+#erpnext.patches.v6_19.comment_feed_communication
erpnext.patches.v6_21.fix_reorder_level
erpnext.patches.v6_21.rename_material_request_fields
diff --git a/erpnext/selling/page/sales_funnel/sales_funnel.py b/erpnext/selling/page/sales_funnel/sales_funnel.py
index eb3b996..4d12efd 100644
--- a/erpnext/selling/page/sales_funnel/sales_funnel.py
+++ b/erpnext/selling/page/sales_funnel/sales_funnel.py
@@ -17,7 +17,7 @@
and status != "Passive" """, (from_date, to_date))[0][0]
opportunities = frappe.db.sql("""select count(*) from `tabOpportunity`
- where docstatus = 1 and (date(`creation`) between %s and %s)
+ where (date(`creation`) between %s and %s)
and status != "Lost" """, (from_date, to_date))[0][0]
quotations = frappe.db.sql("""select count(*) from `tabQuotation`
diff --git a/erpnext/shopping_cart/cart.py b/erpnext/shopping_cart/cart.py
index 561a50c..012aaf7 100644
--- a/erpnext/shopping_cart/cart.py
+++ b/erpnext/shopping_cart/cart.py
@@ -9,6 +9,7 @@
from erpnext.utilities.doctype.address.address import get_address_display
from erpnext.shopping_cart.doctype.shopping_cart_settings.shopping_cart_settings import get_shopping_cart_settings
from frappe.utils.nestedset import get_root_of
+from erpnext.accounts.utils import get_account
class WebsitePriceListMissingError(frappe.ValidationError): pass
@@ -280,7 +281,13 @@
user = frappe.session.user
customer = frappe.db.get_value("Contact", {"email_id": user}, "customer")
-
+ cart_settings = frappe.get_doc("Shopping Cart Settings")
+
+ debtors_account = ''
+
+ if cart_settings.enable_checkout:
+ debtors_account = get_debtors_account(cart_settings)
+
if customer:
return frappe.get_doc("Customer", customer)
@@ -293,6 +300,15 @@
"customer_group": get_shopping_cart_settings().default_customer_group,
"territory": get_root_of("Territory")
})
+
+ if debtors_account:
+ customer.update({
+ "accounts": [{
+ "company": cart_settings.company,
+ "account": debtors_account.name
+ }]
+ })
+
customer.flags.ignore_mandatory = True
customer.insert(ignore_permissions=True)
@@ -307,6 +323,32 @@
return customer
+def get_debtors_account(cart_settings):
+ payment_gateway_account_currency = \
+ frappe.get_doc("Payment Gateway Account", cart_settings.payment_gateway_account).currency
+
+ account_name = _("Debtors ({0})".format(payment_gateway_account_currency))
+
+ debtors_account = get_account("Receivable", "Asset", is_group=0,\
+ account_currency=payment_gateway_account_currency, company=cart_settings.company)
+
+ if not debtors_account:
+ debtors_account = frappe.get_doc({
+ "doctype": "Account",
+ "account_type": "Receivable",
+ "root_type": "Asset",
+ "is_group": 0,
+ "parent_account": get_account(root_type="Asset", is_group=1, company=cart_settings.company),
+ "account_name": account_name,
+ "currency": payment_gateway_account_currency
+ }).insert(ignore_permissions=True)
+
+ return debtors_account
+
+ else:
+ return debtors_account
+
+
def get_address_docs(doctype=None, txt=None, filters=None, limit_start=0, limit_page_length=20, party=None):
if not party:
party = get_customer()
diff --git a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.js b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.js
index 550e34d..3219d7a 100644
--- a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.js
+++ b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.js
@@ -6,5 +6,19 @@
if(cur_frm.doc.__onload && cur_frm.doc.__onload.quotation_series) {
cur_frm.fields_dict.quotation_series.df.options = cur_frm.doc.__onload.quotation_series;
}
+ },
+ refresh: function(){
+ toggle_mandatory(cur_frm)
+ },
+ enable_checkout: function(){
+ toggle_mandatory(cur_frm)
}
});
+
+
+function toggle_mandatory (cur_frm){
+ cur_frm.toggle_reqd("payment_gateway_account", false);
+ if(cur_frm.doc.enabled && cur_frm.doc.enable_checkout) {
+ cur_frm.toggle_reqd("payment_gateway_account", true);
+ }
+}
diff --git a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json
index fbc9ba0..4c462c2 100644
--- a/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json
+++ b/erpnext/shopping_cart/doctype/shopping_cart_settings/shopping_cart_settings.json
@@ -19,9 +19,11 @@
"in_filter": 0,
"in_list_view": 1,
"label": "Enable Shopping Cart",
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -39,9 +41,11 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -60,10 +64,12 @@
"in_filter": 0,
"in_list_view": 1,
"label": "Company",
+ "length": 0,
"no_copy": 0,
"options": "Company",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -82,11 +88,13 @@
"in_filter": 0,
"in_list_view": 0,
"label": "Price List",
+ "length": 0,
"no_copy": 0,
"options": "Price List",
"permlevel": 0,
"precision": "",
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -104,9 +112,11 @@
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 0,
@@ -126,10 +136,12 @@
"in_filter": 0,
"in_list_view": 0,
"label": "Default Customer Group",
+ "length": 0,
"no_copy": 0,
"options": "Customer Group",
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
@@ -148,15 +160,141 @@
"in_filter": 0,
"in_list_view": 0,
"label": "Quotation Series",
+ "length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 0,
+ "print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"unique": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "bold": 0,
+ "collapsible": 1,
+ "collapsible_depends_on": "eval:doc.enable_checkout",
+ "fieldname": "section_break_8",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Checkout Settings",
+ "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": "enable_checkout",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Enable Checkout",
+ "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,
+ "default": "Orders",
+ "description": "After payment completion redirect user to selected page.",
+ "fieldname": "payment_success_url",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Payment Success Url",
+ "length": 0,
+ "no_copy": 0,
+ "options": "\nOrders\nInvoices\nMy Account",
+ "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": "column_break_11",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "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": "payment_gateway_account",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Payment Gateway Account",
+ "length": 0,
+ "no_copy": 0,
+ "options": "Payment Gateway Account",
+ "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
}
],
"hide_heading": 0,
@@ -168,7 +306,8 @@
"is_submittable": 0,
"issingle": 1,
"istable": 0,
- "modified": "2015-09-17 07:56:09.176098",
+ "max_attachments": 0,
+ "modified": "2016-02-09 15:45:03.389220",
"modified_by": "Administrator",
"module": "Shopping Cart",
"name": "Shopping Cart Settings",
@@ -196,5 +335,6 @@
}
],
"read_only": 0,
- "read_only_onload": 0
+ "read_only_onload": 0,
+ "sort_order": "ASC"
}
\ No newline at end of file
diff --git a/erpnext/templates/includes/cart/cart_address.html b/erpnext/templates/includes/cart/cart_address.html
index 44964da..1af8f0b 100644
--- a/erpnext/templates/includes/cart/cart_address.html
+++ b/erpnext/templates/includes/cart/cart_address.html
@@ -1,12 +1,15 @@
{% from "erpnext/templates/includes/cart/cart_macros.html"
import show_address %}
<div class="row">
+ {% if addresses|length == 1%}
+ {% set select_address = True %}
+ {% endif %}
<div class="col-sm-6">
<h4>{{ _("Shipping Address") }}</h4>
<div id="cart-shipping-address" class="panel-group"
data-fieldname="shipping_address_name">
{% for address in addresses %}
- {{ show_address(address, doc, "shipping_address_name") }}
+ {{ show_address(address, doc, "shipping_address_name", select_address) }}
{% endfor %}
</div>
<a class="btn btn-default btn-sm" href="/addresses">
@@ -17,7 +20,7 @@
<div id="cart-billing-address" class="panel-group"
data-fieldname="customer_address">
{% for address in addresses %}
- {{ show_address(address, doc, "customer_address") }}
+ {{ show_address(address, doc, "customer_address", select_address) }}
{% endfor %}
</div>
</div>
diff --git a/erpnext/templates/includes/cart/cart_macros.html b/erpnext/templates/includes/cart/cart_macros.html
index 250b487..fd95dba 100644
--- a/erpnext/templates/includes/cart/cart_macros.html
+++ b/erpnext/templates/includes/cart/cart_macros.html
@@ -1,5 +1,6 @@
-{% macro show_address(address, doc, fieldname) %}
+{% macro show_address(address, doc, fieldname, select_address=False) %}
{% set selected=address.name==doc.get(fieldname) %}
+
<div class="panel panel-default">
<div class="panel-heading">
<div class="row">
diff --git a/erpnext/templates/pages/order.html b/erpnext/templates/pages/order.html
index fae55f3..03e625d 100644
--- a/erpnext/templates/pages/order.html
+++ b/erpnext/templates/pages/order.html
@@ -1,4 +1,4 @@
-{% extends "templates/web.html" %}
+t{% extends "templates/web.html" %}
{% block header %}
<h1>{{ doc.name }}</h1>
@@ -82,14 +82,16 @@
<div class="cart-taxes row small">
<div class="col-sm-8"><!-- empty --></div>
<div class="col-sm-4">
- {% if (doc.doctype=="Sales Order" and doc.per_billed <= 0)
- or (doc.doctype=="Sales Invoice" and doc.outstanding_amount > 0) %}
- <div class="page-header-actions-block" data-html-block="header-actions">
- <p>
- <a href="/api/method/erpnext.accounts.doctype.payment_request.payment_request.make_payment_request?dn={{ doc.name }}&dt={{ doc.doctype }}&submit_doc=1&mute_email=1&cart=1"
- class="btn btn-primary btn-sm">Pay {{ doc.get_formatted("grand_total") }} </a>
- </p>
+ {% if enabled_checkout %}
+ {% if (doc.doctype=="Sales Order" and doc.per_billed <= 0)
+ or (doc.doctype=="Sales Invoice" and doc.outstanding_amount > 0) %}
+ <div class="page-header-actions-block" data-html-block="header-actions">
+ <p>
+ <a href="/api/method/erpnext.accounts.doctype.payment_request.payment_request.make_payment_request?dn={{ doc.name }}&dt={{ doc.doctype }}&submit_doc=1&mute_email=1&cart=1"
+ class="btn btn-primary btn-sm">Pay {{ doc.get_formatted("grand_total") }} </a>
+ </p>
</div>
+ {% endif %}
{% endif %}
</div>
</div>
diff --git a/erpnext/templates/pages/order.py b/erpnext/templates/pages/order.py
index 4824d44..bf1514a 100644
--- a/erpnext/templates/pages/order.py
+++ b/erpnext/templates/pages/order.py
@@ -15,6 +15,8 @@
context.parents = frappe.form_dict.parents
context.payment_ref = frappe.db.get_value("Payment Request",
{"reference_name": frappe.form_dict.name}, "name")
-
+
+ context.enabled_checkout = frappe.get_doc("Shopping Cart Settings").enable_checkout
+
if not context.doc.has_website_permission("read"):
frappe.throw(_("Not Permitted"), frappe.PermissionError)
diff --git a/setup.py b/setup.py
index 885d74b..cfbc311 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
from setuptools import setup, find_packages
from pip.req import parse_requirements
-version = "6.22.1"
+version = "6.23.0"
requirements = parse_requirements("requirements.txt", session="")
setup(