optimizing transactions by caching
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 7669ede..566baa5 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -179,7 +179,7 @@
 	if not account:
 		return
 	def generator():
-		account_currency, company = frappe.db.get_value("Account", account, ["account_currency", "company"])
+		account_currency, company = frappe.get_cached_value("Account", account, ["account_currency", "company"])
 		if not account_currency:
 			account_currency = frappe.get_cached_value('Company',  company,  "default_currency")
 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 2a17d80..5d7e79b 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -259,7 +259,7 @@
 		from erpnext.selling.doctype.customer.customer import check_credit_limit
 
 		validate_against_credit_limit = False
-		bypass_credit_limit_check_at_sales_order = cint(frappe.db.get_value("Customer", self.customer,
+		bypass_credit_limit_check_at_sales_order = cint(frappe.get_cached_value("Customer", self.customer,
 			"bypass_credit_limit_check_at_sales_order"))
 		if bypass_credit_limit_check_at_sales_order:
 			validate_against_credit_limit = True
@@ -388,7 +388,7 @@
 		return frappe.db.sql("select abbr from tabCompany where name=%s", self.company)[0][0]
 
 	def validate_debit_to_acc(self):
-		account = frappe.db.get_value("Account", self.debit_to,
+		account = frappe.get_cached_value("Account", self.debit_to,
 			["account_type", "report_type", "account_currency"], as_dict=True)
 
 		if not account:
@@ -460,9 +460,9 @@
 		"""check in manage account if sales order / delivery note required or not."""
 		dic = {'Sales Order':['so_required', 'is_pos'],'Delivery Note':['dn_required', 'update_stock']}
 		for i in dic:
-			if frappe.db.get_value('Selling Settings', None, dic[i][0]) == 'Yes':
+			if frappe.db.get_single_value('Selling Settings', dic[i][0]) == 'Yes':
 				for d in self.get('items'):
-					if frappe.db.get_value('Item', d.item_code, 'is_stock_item') == 1 \
+					if frappe.get_cached_value('Item', d.item_code, 'is_stock_item') == 1 \
 						and not d.get(i.lower().replace(' ','_')) and not self.get(dic[i][1]):
 						msgprint(_("{0} is mandatory for Item {1}").format(i,d.item_code), raise_exception=1)
 
@@ -1153,7 +1153,7 @@
 		ref_party = doc.supplier if doctype == "Sales Invoice" else doc.customer
 		if not frappe.db.get_value(partytype, {"represents_company": doc.company}, "name") == party:
 			frappe.throw(_("Invalid {0} for Inter Company Invoice.").format(partytype))
-		if not frappe.db.get_value(ref_partytype, {"name": ref_party}, "represents_company") == company:
+		if not frappe.get_cached_value(ref_partytype, ref_party, "represents_company") == company:
 			frappe.throw(_("Invalid Company for Inter Company Invoice."))
 
 	elif frappe.db.get_value(partytype, {"name": party, internal: 1}, "name") == party:
@@ -1260,10 +1260,10 @@
 def get_inter_company_details(doc, doctype):
 	if doctype == "Sales Invoice":
 		party = frappe.db.get_value("Supplier", {"disabled": 0, "is_internal_supplier": 1, "represents_company": doc.company}, "name")
-		company = frappe.db.get_value("Customer", {"name": doc.customer}, "represents_company")
+		company = frappe.get_cached_value("Customer", doc.customer, "represents_company")
 	else:
 		party = frappe.db.get_value("Customer", {"disabled": 0, "is_internal_customer": 1, "represents_company": doc.company}, "name")
-		company = frappe.db.get_value("Supplier", {"name": doc.supplier}, "represents_company")
+		company = frappe.get_cached_value("Supplier", doc.supplier, "represents_company")
 
 	return {
 		"party": party,
diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py
index 2619cd5..454c52b 100644
--- a/erpnext/accounts/party.py
+++ b/erpnext/accounts/party.py
@@ -142,8 +142,8 @@
 		return party.default_price_list
 
 	if party.doctype == "Customer":
-		price_list =  frappe.db.get_value("Customer Group",
-			party.customer_group, "default_price_list", cache=True)
+		price_list =  frappe.get_cached_value("Customer Group",
+			party.customer_group, "default_price_list")
 		if price_list:
 			return price_list
 
@@ -203,7 +203,7 @@
 
 	if not account and party_type in ['Customer', 'Supplier']:
 		party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Group"
-		group = frappe.db.get_value(party_type, party, scrub(party_group_doctype))
+		group = frappe.get_cached_value(party_type, party, scrub(party_group_doctype))
 		account = frappe.db.get_value("Party Account",
 			{"parenttype": party_group_doctype, "parent": group, "company": company}, "account")
 
@@ -215,7 +215,7 @@
 	existing_gle_currency = get_party_gle_currency(party_type, party, company)
 	if existing_gle_currency:
 		if account:
-			account_currency = frappe.db.get_value("Account", account, "account_currency")
+			account_currency = frappe.db.get_value("Account", account, "account_currency", cache=True)
 		if (account and account_currency != existing_gle_currency) or not account:
 				account = get_party_gle_account(party_type, party, company)
 
@@ -224,7 +224,7 @@
 def get_party_account_currency(party_type, party, company):
 	def generator():
 		party_account = get_party_account(party_type, party, company)
-		return frappe.db.get_value("Account", party_account, "account_currency")
+		return frappe.db.get_value("Account", party_account, "account_currency", cache=True)
 
 	return frappe.local_cache("party_account_currency", (party_type, party, company), generator)
 
@@ -271,7 +271,7 @@
 		else:
 			companies.append(account.company)
 
-		party_account_currency = frappe.db.get_value("Account", account.account, "account_currency")
+		party_account_currency = frappe.db.get_value("Account", account.account, "account_currency", cache=True)
 		existing_gle_currency = get_party_gle_currency(doc.doctype, doc.name, account.company)
 		company_default_currency = frappe.get_cached_value('Company',
 			frappe.db.get_default("Company"),  "default_currency")
@@ -296,8 +296,8 @@
 			due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d")
 		else:
 			if party_type == "Supplier":
-				supplier_group = frappe.db.get_value(party_type, party, fieldname="supplier_group")
-				template_name = frappe.db.get_value("Supplier Group", supplier_group, fieldname="payment_terms")
+				supplier_group = frappe.get_cached_value(party_type, party, "supplier_group")
+				template_name = frappe.get_cached_value("Supplier Group", supplier_group, "payment_terms")
 				if template_name:
 					due_date = get_due_date_from_template(template_name, posting_date, bill_date).strftime("%Y-%m-%d")
 	# If due date is calculated from bill_date, check this condition
@@ -387,19 +387,19 @@
 		return
 	template = None
 	if party_type == 'Customer':
-		customer = frappe.db.get_value("Customer", party_name,
+		customer = frappe.get_cached_value("Customer", party_name,
 			fieldname=['payment_terms', "customer_group"], as_dict=1)
 		template = customer.payment_terms
 
 		if not template and customer.customer_group:
-			template = frappe.db.get_value("Customer Group",
-				customer.customer_group, fieldname='payment_terms')
+			template = frappe.get_cached_value("Customer Group",
+				customer.customer_group, 'payment_terms')
 	else:
-		supplier = frappe.db.get_value("Supplier", party_name,
+		supplier = frappe.get_cached_value("Supplier", party_name,
 			fieldname=['payment_terms', "supplier_group"], as_dict=1)
 		template = supplier.payment_terms
 		if not template and supplier.supplier_group:
-			template = frappe.db.get_value("Supplier Group", supplier.supplier_group, fieldname='payment_terms')
+			template = frappe.get_cached_value("Supplier Group", supplier.supplier_group, 'payment_terms')
 
 	if not template and company:
 		template = frappe.get_cached_value('Company',  company,  fieldname='payment_terms')
@@ -408,11 +408,11 @@
 def validate_party_frozen_disabled(party_type, party_name):
 	if party_type and party_name:
 		if party_type in ("Customer", "Supplier"):
-			party = frappe.db.get_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True)
+			party = frappe.get_cached_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True)
 			if party.disabled:
 				frappe.throw(_("{0} {1} is disabled").format(party_type, party_name), PartyDisabled)
 			elif party.get("is_frozen"):
-				frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier')
+				frozen_accounts_modifier = frappe.db.get_single_value( 'Accounts Settings', 'frozen_accounts_modifier')
 				if not frozen_accounts_modifier in frappe.get_roles():
 					frappe.throw(_("{0} {1} is frozen").format(party_type, party_name), PartyFrozen)
 
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index dc8c1e4..122e66d 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -605,6 +605,7 @@
 
 	@property
 	def company_abbr(self):
+		self._abbr = None
 		if not hasattr(self, "_abbr") and self.company:
 			self._abbr = frappe.get_cached_value('Company',  self.company,  "abbr")
 
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index fc88bf8..bd01ec9 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -315,11 +315,11 @@
 	credit_limit = None
 
 	if customer:
-		credit_limit, customer_group = frappe.db.get_value("Customer",
+		credit_limit, customer_group = frappe.get_cached_value("Customer",
 			customer, ["credit_limit", "customer_group"])
 
 		if not credit_limit:
-			credit_limit = frappe.db.get_value("Customer Group", customer_group, "credit_limit")
+			credit_limit = frappe.get_cached_value("Customer Group", customer_group, "credit_limit")
 
 	if not credit_limit:
 		credit_limit = frappe.get_cached_value('Company',  company,  "credit_limit")
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 198940c..e73c627 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -547,7 +547,7 @@
 		if customer_item_code:
 			out.customer_item_code = customer_item_code[0].ref_code
 		else:
-			customer_group = frappe.db.get_value("Customer", args.customer, "customer_group", cache=True)
+			customer_group = frappe.get_cached_value("Customer", args.customer, "customer_group")
 			customer_group_item_code = item_doc.get("customer_items", {"customer_group": customer_group})
 			if customer_group_item_code and not customer_group_item_code[0].customer_name:
 				out.customer_item_code = customer_group_item_code[0].ref_code